我正在使用OpenGL ES在iPad上遇到传统的tile / mipmap问题。基本上,如果你有一个大的纹理(大于1k X 1k),你可以将它分解成碎片并将这些碎片映射到单个多边形上。你可以将纹理坐标夹到边缘,它大部分都可以工作,但你会在边界上得到伪影。
现在我知道为什么你会得到这个,并知道传统解决方案是什么。也就是说,你在每个较小的纹理外面做一个边框(比如说6个像素)。您可以从小纹理到大纹理进行采样,因此您只需使用内部像素(例如256-2 * 6)。然后将有效像素涂抹到边框区域。最后,您将纹理坐标映射到仅使用那些有效的内部像素。工作还可以。
如果您此时没有点头,请不要尝试回答。 : - )
无论如何,OpenGL在当天引入了钳位模式来解决这个问题。我没有在OpenGL ES中看到这些模式(至少在这个硬件上),我看到了对这个问题的其他引用。我想知道的是,如果我错过了什么。有没有更新的方法来解决我不知道的平铺/边缘问题?
[更新] 此处附有结果的屏幕截图。可见线位于一个纹理的末尾,另一个纹理的开头。这是使用CLAMP_TO_EDGE。
答案 0 :(得分:3)
GLES提供GL_CLAMP_TO_EDGE但不提供GL_CLAMP,GL_CLAMP夹在纹理中最外层像素的中心而不是极限边缘。所以使用CLAMP_TO_EDGE完全阻止了越界(边界或环绕)访问,但没有使用CLAMP。
CLAMP_TO_EDGE是GL ES规范的一部分(根据here for 1.1和here for 2.0),因此如果您的硬件不支持它,那么它在技术上不符合GL ES标准。它也可以在完整的Open GL中使用,但我认为仅从版本1.2开始。这意味着CLAMP_TO_EDGE向ES迈进,但CLAMP没有,因为前者被认为是后者的固定版本。
听起来像CLAMP_TO_EDGE应该适合你正在做的事情 - 我误解了吗?
答案 1 :(得分:0)
最后问题与纹理压缩有关。这些线是由压缩方法引起的,假设纹理缠绕在一起。
我通过构建比需要更大的纹理来解决问题,压缩然后仅使用每个纹理中的一个区域,从而留下边框。