如何在2D中使用OpenGL ES的折射功能?

时间:2017-11-09 02:08:34

标签: android opengl-es

人。 我尝试将色差效果应用到我的照片中。最近,我通过谷歌搜索知道了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中。请帮我。 :(

1 个答案:

答案 0 :(得分:1)

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

因此数据类型vec2没有组件b,但vec3vec4会有一个组件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}访问表示纹理坐标的矢量时很有用