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

时间:2013-03-11 16:12:52

标签: 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_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));

但是,它似乎没有起作用。

0 个答案:

没有答案