【问题标题】:Aliassing when flipping a texture in fragment shader在片段着色器中翻转纹理时出现别名
【发布时间】:2012-08-31 02:33:30
【问题描述】:

我创建了一个多纹理片段着色器,我想在其中翻转其中一个纹理,但这样做时,我的纹理变得锯齿状。这个问题有解决办法吗?

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

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

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

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

【问题讨论】:

  • 您是否忘记为该纹理启用纹理过滤?
  • 编辑了最初的帖子:我添加了我正在使用的纹理过滤
  • 你能发一张这张照片的样子吗?
  • 实际上在顶点着色器中翻转纹理不会更快吗?片段着色器当然更强大,但是由于您只需要 per-vertex 翻转一个坐标,因此不需要一些非线性操作...
  • @BartekBanachewicz 如果我只想在我的多纹理着色器中旋转 1 个纹理,这是否也有效?

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


【解决方案1】:

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

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

【讨论】:

  • 很好的答案!感谢您提供有关 lowp 的额外信息。 ;)
猜你喜欢
  • 2013-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多