不熟悉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);
帮助获得所需结果的(很可能是快速修改)主题将使我当前的问题得以休息。
答案 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_S
和GL_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;更好的解决方案。无需更改纹理坐标,因为您始终希望图像完全符合四边形。