我已经创建了一个多纹理片段着色器,其中我想要翻转其中一个纹理,但是当我这样做时,我的纹理会变得非常粗糙。这个问题有解决方案吗?
这是我的片段着色器代码:
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);
一些背景信息:我在片段着色器中混合了这些纹理(混合代码被剥离出来),所以我不是在寻找一种解决方案,我可以旋转第二个平面并将它们合并到帧缓冲区。我想知道在片段着色器中翻转/旋转纹理坐标是否是一个好主意。
最后,我会传递一个统一的说法:旋转或不旋转,导致一个纹理旋转或不旋转。
答案 0 :(得分:1)
使用mediump而不是lowp for destinationTexCoord将提高采样率 vec2(destinationTexCoord.x,1.0 - destinationTexCoord.y)计算。但是,我的建议是使用两个不同的vec2而不是使用依赖纹理读取。即 cameraTexCoord 和 viewfinderTexCoord 。您可以避免片段着色器中的中介计算,并利用硬件(希望)优化的vert-frag插值。
除非它们是相关的,否则没有理由将lowp用于纹理坐标,在这种情况下,lowp可能更适合片段着色器计算。否则,根据我的经验,lowp没有带来任何收益(虽然我只知道iOS上的PowerVR硬件)。