OpenGL ES Tiled Texture Mipmap问题 - iPad / iPhone

时间:2011-02-18 17:56:09

标签: iphone ipad ios opengl-es texture-mapping

enter image description here我正在使用OpenGL ES在iPad上遇到传统的tile / mipmap问题。基本上,如果你有一个大的纹理(大于1k X 1k),你可以将它分解成碎片并将这些碎片映射到单个多边形上。你可以将纹理坐标夹到边缘,它大部分都可以工作,但你会在边界上得到伪影。

现在我知道为什么你会得到这个,并知道传统解决方案是什么。也就是说,你在每个较小的纹理外面做一个边框(比如说6个像素)。您可以从小纹理到大纹理进行采样,因此您只需使用内部像素(例如256-2 * 6)。然后将有效像素涂抹到边框区域。最后,您将纹理坐标映射到仅使用那些有效的内部像素。工作还可以。

如果您此时没有点头,请不要尝试回答。 : - )

无论如何,OpenGL在当天引入了钳位模式来解决这个问题。我没有在OpenGL ES中看到这些模式(至少在这个硬件上),我看到了对这个问题的其他引用。我想知道的是,如果我错过了什么。有没有更新的方法来解决我不知道的平铺/边缘问题?

[更新] 此处附有结果的屏幕截图。可见线位于一个纹理的末尾,另一个纹理的开头。这是使用CLAMP_TO_EDGE。

2 个答案:

答案 0 :(得分:3)

GLES提供GL_CLAMP_TO_EDGE但不提供GL_CLAMP,GL_CLAMP夹在纹理中最外层像素的中心而不是极限边缘。所以使用CLAMP_TO_EDGE完全阻止了越界(边界或环绕)访问,但没有使用CLAMP。

CLAMP_TO_EDGE是GL ES规范的一部分(根据here for 1.1here for 2.0),因此如果您的硬件不支持它,那么它在技术上不符合GL ES标准。它也可以在完整的Open GL中使用,但我认为仅从版本1.2开始。这意味着CLAMP_TO_EDGE向ES迈进,但CLAMP没有,因为前者被认为是后者的固定版本。

听起来像CLAMP_TO_EDGE应该适合你正在做的事情 - 我误解了吗?

答案 1 :(得分:0)

最后问题与纹理压缩有关。这些线是由压缩方法引起的,假设纹理缠绕在一起。

我通过构建比需要更大的纹理来解决问题,压缩然后仅使用每个纹理中的一个区域,从而留下边框。