1

我正在尝试将使用 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));

不过,它似乎没有工作。

4

0 回答 0