无法获取纹理像素不要在边缘重复

时间:2013-07-01 14:36:33

标签: opengl-es-2.0

不熟悉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);

帮助获得所需结果的(很可能是快速修改)主题将使我当前的问题得以休息。

Repeating edge pixels behind the texture

2 个答案:

答案 0 :(得分: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_SGL_TEXTURE_WRAP_T定义当纹理坐标超出0.0到1.0范围(对于两个轴)时要执行的操作。你将它们都设置为GL_CLAMP_TO_EDGE,这基本上意味着如果纹理坐标<1}。 0然后使用0,如果&gt; 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范围,这将丢弃片段。

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

答案 1 :(得分:1)

Brianberg的方法可行,但缩放四边形渲染图像而不是修改纹理坐标将是一个更清洁的&amp;更好的解决方案。无需更改纹理坐标,因为您始终希望图像完全符合四边形。