我对 OpenGL 和 ES2.0 还很陌生。我分享了我用来在 ios 和 android 上绘制的 c++ opengl es2 代码(使用 ndk CMake)...它大部分都可以工作,但现在我需要抗锯齿并且它有点令人困惑,我看到的解决方案是依赖于平台和 android 端的比较困惑并且有局限性。我一直在寻找解决方案,但需要更清晰的说明。
什么应该对两者都有效: 显然,Kronos RenderBuffer描述说
Renderbuffer objects also natively accommodate Multisampling (MSAA).
但是es 2.0似乎不支持这个。 iOS 有自己的方法 glRenderbufferStorageMultisampleAPPLE
在 es 2.0 上支持它,但 android 没有。 android 也不能 Blit FrameBuffers,而 ios 有自己的方法(再次)glResolveMultisampleFramebufferAPPLE
来做到这一点。
如果这是特定于平台的:iOS 可以执行 setDrawableMultisample:GLKViewDrawableMultisample4X
这似乎有效。但是android有局限性,有EGLConfigChooser
的chooseConfig
来做到这一点,但我读到并不是所有的android设备都支持这样的抗锯齿(我也无法在模拟器),所以我必须在 native C++ 代码中再次执行此操作。
其他:我一直在阅读,有一些方法,比如在圆形中多次绘制所有内容(更精确),或者将整个 View 放大到 2 倍并绘制,然后缩小到获得更平滑的线条...另一种方式,我不确定它是否有效,但绘制到纹理或图像,以某种方式进行抗锯齿或支持它(需要更好地理解这一点)
我现在需要什么:我的要求是仅使用 glDrawArrays
方法绘制带有颜色的顶点(我通过这个完成我的工作)。绘制的所有内容都应该是平滑的或抗锯齿的。我应该如何处理这个问题?我需要更好的引用资料或教程,在那里我可以正确阅读任何适用于两者的方法。我不介意阅读和学习,但我有点被太多的选择所困扰,但对它们的背景却知之甚少。编辑:我正在 2D 中绘制(始终为 z=0),不存在深度问题。
最佳答案
OpenGL ES 2.0 针对低端平台,因此不需要抗锯齿。然而,由于许多硬件超出了 ES 2.0 的要求,因此经常会实现扩展。
假设您需要在不支持它的平台上执行此操作,尽管这是一个不公平的要求(流浪汉如果想要视觉完美,就应该购买令人惊叹的硬件),但有一些事情可能会起作用 取决于渲染场景和开发预算:
- 在着色器中手动计算 fragment 覆盖率,设置alpha,使用GL_ALPHA_SATURATE进行混合;在我看来,这是目前最好看的 AA 技术,尽管只有不透明的表面(奇怪的是,尽管没有平滑的多边形,ES 2.0 仍然支持?)
- Temporal supersampling 。将最近渲染的几个帧合并在一起,并有轻微的偏移。如果展示的东西发生了很大的变化,这可能不是更好的选择。
- 使用透明线过度绘制。对于任何表面,绘制具有透明度的线框。边缘会变得更光滑一些,但表面也会变大一点。
- 将顶点固定到着色器中的像素中心。这会稍微降低垂直/水平边缘附近的移动感觉,但在某些情况下可能会产生不太平滑的感觉。
- 选择更能抵抗锯齿的视觉样式。当像素对齐的四边形效果同样好时,我会避免使用圆圈。当由于像素几何形状而存在色彩锯齿的风险时,我会更仔细地选择背景和前景色。从某种意义上说,这是设计级别上的 AA,而不是渲染级别上的,并且不应低估,因为它通常便宜且便携。
如果您实现上述任何一项,我会对您的结果和场景的更多详细信息非常感兴趣。
关于android - OpenGL ES 2.0 通过共享 C++ 代码在 ios 和 android 上进行抗锯齿或平滑处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48943394/