2

不熟悉OpenGL,似乎无法弄清楚这个小细节。我一直在寻找有关纹理重复而不是边框​​元素的信息。

放大纹理时,末端的边缘像素会重复到我正在处理的表面视图的边缘。当纹理小于视图时,我宁愿在这些像素后面看到清晰的背景。

我可以假设它与围绕这些代码行为我的纹理设置属性有关,但我只是无法遵循它来理解要进行哪些更改才能获得所需的结果。

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_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);

获得所需结果的(最有可能快速修改)主题的助手将使我当前的问题得到解决。

纹理后面的重复边缘像素

4

2 回答 2

3

好的,我会尽力解释。

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_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);

GL_TEXTURE_MIN_FILTER是当纹理的位图尺寸大于绘图表面的相应尺寸时应用的过滤器。GL_TEXTURE_MAG_FILTER是相反的。所以这不是问题。

GL_TEXTURE_WRAP_S但是,GL_TEXTURE_WRAP_T定义当纹理坐标超出 0.0 到 1.0 范围(对于两个轴)时要执行的操作。您将它们都设置为GL_CLAMP_TO_EDGE,这基本上意味着如果纹理坐标 < 0 则使用 0,如果 > 1 则使用 1。这基本上就是您在图片中看到的情况。

但是,这只能更改为GL_REPEAT重复纹理或GL_MIRRORED_REPEAT重复和镜像。因此,您的问题无法通过更改这些设置来解决。我认为您需要没有超出范围的丢弃设置。如果您愿意,您可以在文档中阅读更多相关信息:http ://www.khronos.org/opengles/sdk/docs/man/

我不知道你是如何缩放的,但据我所知,它通常不涉及更改纹理坐标。如果你想保持这种方式,你可以尝试一些小技巧 - 在片段着色器中你可以在设置之前添加gl_FragColor

   if (tc.x < 0.0 || tc.x > 1.0 || tc.y < 0.0 || tc.y > 1.0 ) 
     discard;

其中 tc 是您的纹理坐标。因此,如果纹理坐标超出 0 到 1 范围,这将丢弃片段。

这不是一个很好的解决方案,但它应该可以解决问题。

于 2013-07-01T19:18:09.047 回答
2

Brianberg 的方法会起作用,但是缩放要渲染图像的四边形而不是修改纹理坐标将是一种更清洁且性能更好的解决方案。无需更改纹理坐标,因为您总是希望图像完全适合四边形。

于 2013-07-02T08:48:21.653 回答