GPUImageSphereRefractionFilter滤镜的Core Image Filte实现

GPUImageSphereRefractionFilter滤镜的Core Image Filter实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/*
* 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;

}