伙计们。我试着把色差效应应用到我的照片上。最近,我通过谷歌搜索了解了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个分量的向量。成分为r
和g
(或x
和y
,或s
和t
)。
因此,数据类型vec2
没有分量b
,但vec3
和vec4
将具有分量b
请参阅数据类型(GLSL)-滑动
你想做的是读取texuture的红色、绿色和蓝色通道。当纹理采样器的类型为2D时,GLSL函数texture
的返回值的类型为vec4
。所以你可以访问这样的通道:
rgbTex.rgb = texture2D(imgTex, rVector).rgb;
请参阅OpenGL着色语言1.20规范
5.5矢量分量
矢量分量的名称由一个字母表示。为了便于记法,根据位置、颜色或纹理的常用用法,每个组件都有几个字母坐标矢量。矢量的各个分量可以通过以下变量进行选择带句点的名称(.
),然后是组件名称。支持的组件名称为:
{x, y, z, w}
在访问表示点或法线的矢量时很有用
baseTexCrd
0在访问表示颜色的矢量时很有用
{s, t, p, q}
在访问表示纹理坐标的矢量时很有用