抗锯齿 iPhone OpenGLES

5
我需要在iPhone 3G(OpenGL ES1.1)上实现抗锯齿,而不是在带有OpenGL ES.2.0的iPhone 3Gs上实现。 我已经绘制了3D模型,但是模型边缘的像素看起来像牙齿。
我尝试为纹理设置任何过滤器,但这些过滤器只会使纹理内部看起来更好。
如何实现良好的抗锯齿? 也许我应该使用任何平滑的方法来绘制三角形?如果是这样,那么在OpenGL ES1.1中如何实现?
谢谢。
4个回答

8
自iOS 4.0起,通过苹果对OpenGL的扩展,全屏抗锯齿直接得到支持。基本概念与epatel的建议类似:将场景渲染到更大的帧缓冲区,然后将其复制到屏幕大小的帧缓冲区,最后将该缓冲区复制到屏幕上。不同之处在于,这个复制/采样操作是通过单个函数调用完成的(具体来说,是glResolveMultisampleFramebufferAPPLE())。
有关如何设置缓冲区和修改绘图代码的详细信息,您可以阅读Gando Games博客中针对OpenGL ES 1.1编写的教程;苹果的开发者论坛中也有一则说明相同内容的帖子
感谢Bersaelor在Stack Overflow上的另一个问题中指出这一点

4
你可以渲染到一个更大的帧缓冲对象(FBO),然后将其用作正方形纹理。
请参阅this文章以获取解释。

非常感谢您提供的链接!我会尝试“渲染到更大的FBO”。 - Sergey Kopanev
我发布了一个新答案:概念是相同的,但在较新版本的iOS中有更简单的方法来完成它。 - benzado

2
检查 eglChooseConfig() 中的 EGL_SAMPLE_BUFFERS 和 EGL_SAMPLES 参数,以及 glEnable(GL_MULTISAMPLE)
编辑:嗯,显然 标准化方法行不通。如该线程中所述,您可以渲染到一个大型离屏纹理并缩放到较小的屏幕四边形或多次抖动视图矩阵。

谢谢,但是iPhone上的OpenGL不支持eglChooseConfig()。 或者我错了吗? 但是当我设置GL_LINE_SMOOTH并使用GL_LINE_STRIP的glDrawArrays时,我有超级抗锯齿线。 但是当我设置GL_TRIANGLES时,这种效果就消失了。 - Sergey Kopanev
看起来你是对的。很奇怪。无论如何,我找到了一个带有一些替代方法的线程并编辑了答案。 - genpfault
genpfault,可能吧。我已经谷歌了更多的网站,感觉只有一种方法- 尝试使用这个http://www.gamedev.net/community/forums/topic.asp?topic_id=548956或类似的东西。 - Sergey Kopanev

2
我们发现了另一种方法来实现这一点。如果您编辑纹理并添加例如两个像素透明像素的边框,当需要时,纹理中的彩色像素将与透明像素混合,从而产生基本的反锯齿效果。您可以在我们的博客中阅读完整的文章。
这种方法的优点是,您不需要渲染更大的图像,也不需要复制缓冲区,更糟糕的是,还不需要从缓冲区创建纹理,因此不会影响性能。

这个链接到我们的博客的页面已经失效了。 - Andres Bucci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接