Opengl es 非矩形纹理的纹理映射-如何获得特定纹理的颜色

Opengl es 非矩形纹理的纹理映射-如何获得特定纹理的颜色,opengl-es,opengl-es-2.0,glsl,texture-mapping,fragment-shader,Opengl Es,Opengl Es 2.0,Glsl,Texture Mapping,Fragment Shader,我正在尝试将使用GLSL版本120编写的着色器转换为OpenGl ES 2.0,我遇到了一个如何正确映射该着色器的问题 在原始着色器上,我使用的是texture2DRect,这在OpenGL ES上不受支持(至少在我打算使用的目标硬件上不受支持) 着色器有两个纹理。一个是映射到四边形的纹理,另一个只是我用来乘以纹理的一种查找。查找是一个128x128位图 原始着色器如下所示: float xx = mod(gl_FragCoord.x, 5.0); float yy = mod(gl_FragC

我正在尝试将使用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值,比如50127。我想这应该是(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;
纹理声明:

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更新:

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;
我现在实现了以下功能:

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));

不过,它似乎不起作用。

您可以添加GLSL 120和GLSL ES 2.0的结果截图吗?您好,看起来我找到了答案: