我正在尝试将使用 GLSL 版本 120 编写的着色器转换为 OpenGL ES 2.0,我遇到了如何正确映射此着色器的问题。
在原始着色器上,我使用的是 texture2DRect 并且 OpenGL ES 不支持此功能(至少在我想要的目标硬件上不支持)。
着色器有两个纹理。一个是映射到四边形的纹理,另一个只是我用来乘以纹素的一种查找。查找是 128x128 位图。
原始着色器如下所示:
float xx = mod(gl_FragCoord.x, 5.0);
float yy = mod(gl_FragCoord.y, 15.0);
vec4 color = texture2DRect(tex0, coord0);
vec4 lookup1 = texture2DRect(tex1, vec2(xx, yy));
gl_FragColor = color * lookup1;
我已将其更改为:
float xx = mod(gl_FragCoord.x, 5.0) * (1.0/textsize.x);
float yy = mod(gl_FragCoord.y, 15.0) * (1.0/textsize.y);
vec4 color = texture2D(tex0, coord0);
vec4 lookup1 = texture2D(tex1, vec2(xx, yy));
gl_FragColor = color * lookup1;
其中 textsize 是包含查找纹理大小 (128x128) 的 vec2,我需要在查找时使用 texel 的确切值,比如说 50,127。我想这应该是(50/128、127/128)。然而,这并没有像我预期的那样工作。我在这里想念什么?
附加信息:
纹理参数:
glTexParameterf(GL_TEXTURE_2D,
GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D,
GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
GL_CLAMP_TO_EDGE)
纹理声明:
uniform samplerExternalOES tex0;
uniform sampler2D tex1;
2013.03.13 更新:
我现在实现了以下功能:
vec4 texelFetch(sampler2D texsampler, vec2 coord) {
vec2 mult=(2.0*coord + 1.0)/(2.0* texWidth); // 128.0
vec4 texel = texture2D(texsampler,mult);
return texel;
}
并将代码更改为:
float xx = mod(gl_FragCoord.x, 5.0);
float yy = mod(gl_FragCoord.y, 15.0);
vec4 lookup1 = texelFetch(tex1, vec2(xx, yy));
不过,它似乎没有工作。