在片段着色器中翻转纹理时的别名

时间:2012-08-29 09:19:57

标签: opengl-es opengl-es-2.0 glsl

我已经创建了一个多纹理片段着色器,其中我想要翻转其中一个纹理,但是当我这样做时,我的纹理会变得非常粗糙。这个问题有解决方案吗?

Jaggy borders

这是我的片段着色器代码:

void main(void)
{
    lowp vec4 camera = texture2D(texture0, destinationTexCoord);
    lowp vec4 viewfinder = texture2D(texture1, vec2(destinationTexCoord.x, 1.0 - destinationTexCoord.y));

    lowp vec4 result = mix(camera, viewfinder, viewfinder.a);
    gl_FragColor = result;
}

我正在使用的纹理过滤:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

一些背景信息:我在片段着色器中混合了这些纹理(混合代码被剥离出来),所以我不是在寻找一种解决方案,我可以旋转第二个平面并将它们合并到帧缓冲区。我想知道在片段着色器中翻转/旋转纹理坐标是否是一个好主意。

最后,我会传递一个统一的说法:旋转或不旋转,导致一个纹理旋转或不旋转。

1 个答案:

答案 0 :(得分:1)

使用mediump而不是lowp for destinationTexCoord将提高采样率 vec2(destinationTexCoord.x,1.0 - destinationTexCoord.y)计算。但是,我的建议是使用两个不同的vec2而不是使用依赖纹理读取。即 cameraTexCoord viewfinderTexCoord 。您可以避免片段着色器中的中介计算,并利用硬件(希望)优化的vert-frag插值。

除非它们是相关的,否则没有理由将lowp用于纹理坐标,在这种情况下,lowp可能更适合片段着色器计算。否则,根据我的经验,lowp没有带来任何收益(虽然我只知道iOS上的PowerVR硬件)。