我正在尝试将使用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是包含查找纹理大小的vec2(128x128) 我需要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));
但是,它似乎没有起作用。