人。
我尝试将色差效果应用到我的照片中。最近,我通过谷歌搜索知道了OpenGL ES的refract()
功能。然后,我测试了它并得到了一个complie错误。这是我的片段着色器代码。
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;
baseTexCrd
是不同的纹理坐标。 imgTex
是我的照片纹理。这是关于第7行的错误消息。
'b' : vector field selection out of range
ERROR: 1 compilation errors. No code generated.
有什么问题?我不知道热使用它。特别是在2D中。请帮我。 :(
答案 0 :(得分:1)
数据类型vec2
是一个包含2个组件的向量。组件为r
和g
(或x
和y
,或s
和t
。)
因此数据类型vec2
没有组件b
,但vec3
和vec4
会有一个组件b
。
见Data Type (GLSL) - Swizzling
您要做的是阅读文字的红色,绿色和蓝色通道。
在纹理采样器的类型为 2D 的情况下,GLSL函数texture
的返回值的类型为vec4
。所以你可以访问这样的频道:
rgbTex.rgb = texture2D(imgTex, rVector).rgb;
请参阅OpenGL Shading Language 1.20 Specification
5.5矢量组件
向量组件的名称由单个字母表示。作为一种符号方便, 基于位置,颜色或纹理的常见用法,几个字母与每个组件相关联 坐标向量。可以通过跟随变量来选择矢量的各个分量 使用句点(.
)命名,然后输入组件名称。 支持的组件名称是:
{x, y, z, w}
在访问代表点或法线的向量时很有用
{r, g, b, a}
访问代表颜色的矢量时很有用
{s, t, p, q}
访问表示纹理坐标的矢量时很有用