使用 Android 上的 OpenGL ES 2.0,在帧缓冲区上渲染时是不是可以保留多重采样?

Posted

技术标签:

【中文标题】使用 Android 上的 OpenGL ES 2.0,在帧缓冲区上渲染时是不是可以保留多重采样?【英文标题】:With OpenGL ES 2.0 on Android, is there a way preserve multisampling when rendering on a framebuffer?使用 Android 上的 OpenGL ES 2.0,在帧缓冲区上渲染时是否可以保留多重采样? 【发布时间】:2012-05-15 15:15:11 【问题描述】:

我正在使用 OpenGL es 2.0 和 java 在 android ICS 上开发 2d 游戏。我正在尝试使用照明系统,为此我在一个帧缓冲区上渲染所有灯光,在另一个上渲染场景,目的是使用片段着色器将它们混合以重新创建 Photoshop 叠加效果。

我遇到了一个问题,似乎 fbo 不适用于多重采样,所以如果我在 fbo 上绘图,我会得到锯齿状的线条。我注意到有一个针对使用 ios 的人的解决方案,但我在 Android 上没有找到任何东西。 有没有比我解决这个问题的方式更好的方法来实现我想要做的事情?原谅我对opengl有点陌生。

非常感谢。

【问题讨论】:

【参考方案1】:

多重采样(您在创建 OpenGL 上下文时设置)仅适用于默认帧缓冲区。

要在 FBO 上进行多重采样,您必须使用以下扩展之一:

GL_IMG_multisampled_render_to_texture GL_APPLE_APPLE_framebuffer_multisample GL_EXT_multisampled_render_to_texture

您也可以使用FXAA 之类的东西来实现全屏抗锯齿。即使是移动设备,它的“PC 控制台”版本也非常快。

【讨论】:

感谢您的回答! :) 我还不知道如何使用扩展,所以也许我会尝试最后一个选项,我相信可以使用片段着色器。 是的,FXAA 基本上要求您将场景渲染为常规纹理(例如使用 FBO),然后使用 FXAA 着色器将此纹理的所有内容渲染到屏幕上,从而获得纹理的抗锯齿内容绑定到 FBO。 你有一个类型,苹果的扩展名是GL_APPLE_framebuffer_multisample

以上是关于使用 Android 上的 OpenGL ES 2.0,在帧缓冲区上渲染时是不是可以保留多重采样?的主要内容,如果未能解决你的问题,请参考以下文章

Android设备上的OpenGL ES 2.0扩展[关闭]

使用 Android 上的 OpenGL ES 2.0,在帧缓冲区上渲染时是不是可以保留多重采样?

Android 上的 Opengl ES:如何使用 gluUnProject?

如何确定Android OpenGL ES上的最大纹理内存

Android OpenGL ES 纹理映射/绘图问题 - 倾斜图像

如何在Android上使用OpenGL ES 2.0绘制点