GPUImageSphereRefractionFilter滤镜的Core Image Filte实现 发表于 2016-08-02 | 更新于 2019-06-27 | 分类于 iOS开发 GPUImageSphereRefractionFilter滤镜的Core Image Filter实现12345678910111213141516171819202122232425262728293031323334353637/* * center: 中心坐标,取之范围0-1 * radius: 取值范围0~0.5 * aspectRatio : 输入图片的宽高比, 代码中已自动计算 * refractiveIndex : 反射率 */kernel vec4 coreImageKernel(sampler image, vec2 center, float radius, float aspectRatio, float refractiveIndex){ //转换当前处理的坐标为贴图坐标,范围0.0~1.0 vec2 pos = destCoord(); pos.x = pos.x / samplerSize(image).x; pos.y = pos.y / samplerSize(image).y; aspectRatio = samplerSize(image).y / samplerSize(image).x; vec4 color; highp vec2 textureCoordinateToUse = vec2(pos.x, (pos.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); highp float distanceFromCenter = distance(center, textureCoordinateToUse); lowp float checkForPresenceWithinSphere = step(distanceFromCenter, radius); distanceFromCenter = distanceFromCenter / radius; highp float normalizedDepth = radius * sqrt(1.0 - distanceFromCenter * distanceFromCenter); highp vec3 sphereNormal = normalize(vec3(textureCoordinateToUse - center, normalizedDepth)); highp vec3 refractedVector = refract(vec3(0.0, 0.0, -1.0), sphereNormal, refractiveIndex); vec2 samplePos = (refractedVector.xy + 1.0) * 0.5; //还原贴图坐标为空间坐标 samplePos.x *= samplerSize(image).x; samplePos.y *= samplerSize(image).y; color = sample(image, samplePos) * checkForPresenceWithinSphere; return color;}