如何在二维中使用OpenGL ES的折射功能



伙计们。我试着把色差效应应用到我的照片上。最近,我通过谷歌搜索了解了OpenGL ES的refract()功能。然后,我测试了它,得到了一个复杂的错误。这是我的碎片着色器代码。

1: vec4 rgbTex;
2: vec2 rVector = refract(baseTexCrd, vec2(0.5, 0.5), 1.1);
3: vec2 gVector = refract(baseTexCrd, vec2(0.5, 0.5), 1.2);
4: vec2 bVector = refract(baseTexCrd, vec2(0.5, 0.5), 1.3);
5: rgbTex.r = vec2(texture2D(imgTex, rVector)).r;
6: rgbTex.g = vec2(texture2D(imgTex, gVector)).g;
7: rgbTex.b = vec2(texture2D(imgTex, bVector)).b;
8: rgbTex.a = 1.0;
9: gl_FragColor = rgbTex;

CCD_ 2是变化的纹理坐标。imgTex是我的照片纹理。这是关于第7行的错误消息。

'b' : vector field selection out of range 
ERROR: 1 compilation errors.  No code generated.

怎么了?我不知道怎么用它。尤其是在2D中。请帮帮我

数据类型vec2是一个包含2个分量的向量。成分为rg(或xy,或st)。

因此,数据类型vec2没有分量b,但vec3vec4将具有分量b
请参阅数据类型(GLSL)-滑动

你想做的是读取texuture的红色、绿色和蓝色通道。当纹理采样器的类型为2D时,GLSL函数texture的返回值的类型为vec4。所以你可以访问这样的通道:

rgbTex.rgb = texture2D(imgTex, rVector).rgb;


请参阅OpenGL着色语言1.20规范

5.5矢量分量
矢量分量的名称由一个字母表示。为了便于记法,根据位置、颜色或纹理的常用用法,每个组件都有几个字母坐标矢量。矢量的各个分量可以通过以下变量进行选择带句点的名称(.),然后是组件名称。支持的组件名称为:

{x, y, z, w}在访问表示点或法线的矢量时很有用

baseTexCrd0在访问表示颜色的矢量时很有用

{s, t, p, q}在访问表示纹理坐标的矢量时很有用