不熟悉OpenGL,似乎无法弄清楚这个小细节。我一直在寻找有关纹理重复而不是边框元素的信息。
放大纹理时,末端的边缘像素会重复到我正在处理的表面 View 的边缘。当纹理小于 View 时,我宁愿在这些像素后面看到清晰的背景。
我可以假设它与围绕这些代码行为我的纹理设置属性有关,但我只是无法充分遵循它来理解需要进行哪些更改才能获得所需的结果。
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);
帮助(最有可能快速修改)主题以获得所需的结果将使我当前的问题得到解决。
最佳答案
好的,我会尽力解释一下。
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/
我不知 Prop 体如何缩放,但据我所知,它通常不涉及更改纹理坐标。如果你想保持这种方式,你可以尝试一些技巧 - 在片段着色器中,你可以在设置 gl_FragColor
之前添加。 :
if (tc.x < 0.0 || tc.x > 1.0 || tc.y < 0.0 || tc.y > 1.0 )
discard;
其中 tc 是纹理坐标。因此,如果纹理坐标超出 0 到 1 的范围,这将丢弃该片段。
这不是一个很好的解决方案,但它应该可以解决问题。
关于opengl-es-2.0 - 获取纹理像素时遇到问题不在边缘重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17407063/