android - OpenGL ES 2.0 通过共享 C++ 代码在 ios 和 android 上进行抗锯齿或平滑处理

标签 android c++ ios opengl-es-2.0 antialiasing

我对 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有局限性,有EGLConfigChooserchooseConfig来做到这一点,但我读到并不是所有的android设备都支持这样的抗锯齿(我也无法在模拟器),所以我必须在 native C++ 代码中再次执行此操作。

其他:我一直在阅读,有一些方法,比如在圆形中多次绘制所有内容(更精确),或者将整个 View 放大到 2 倍并绘制,然后缩小到获得更平滑的线条...另一种方式,我不确定它是否有效,但绘制到纹理或图像,以某种方式进行抗锯齿或支持它(需要更好地理解这一点)

我现在需要什么:我的要求是仅使用 glDrawArrays 方法绘制带有颜色的顶点(我通过这个完成我的工作)。绘制的所有内容都应该是平滑的或抗锯齿的。我应该如何处理这个问题?我需要更好的引用资料或教程,在那里我可以正确阅读任何适用于两者的方法。我不介意阅读和学习,但我有点被太多的选择所困扰,但对它们的背景却知之甚少。编辑:我正在 2D 中绘制(始终为 z=0),不存在深度问题。

最佳答案

OpenGL ES 2.0 针对低端平台,因此不需要抗锯齿。然而,由于许多硬件超出了 ES 2.0 的要求,因此经常会实现扩展。

假设您需要在不支持它的平台上执行此操作,尽管这是一个不公平的要求(流浪汉如果想要视觉完美,就应该购买令人惊叹的硬件),但有一些事情可能会起作用 取决于渲染场景和开发预算:

  1. 在着色器中手动计算 fragment 覆盖率,设置alpha,使用GL_ALPHA_SATURATE进行混合;在我看来,这是目前最好看的 AA 技术,尽管只有不透明的表面(奇怪的是,尽管没有平滑的多边形,ES 2.0 仍然支持?)
  2. Temporal supersampling 。将最近渲染的几个帧合并在一起,并有轻微的偏移。如果展示的东西发生了很大的变化,这可能不是更好的选择。
  3. 使用透明线过度绘制。对于任何表面,绘制具有透明度的线框。边缘会变得更光滑一些,但表面也会变大一点。
  4. 将顶点固定到着色器中的像素中心。这会稍微降低垂直/水平边缘附近的移动感觉,但在某些情况下可能会产生不太平滑的感觉。
  5. 选择更能抵抗锯齿的视觉样式。当像素对齐的四边形效果同样好时,我会避免使用圆圈。当由于像素几何形状而存在色彩锯齿的风险时,我会更仔细地选择背景和前景色。从某种意义上说,这是设计级别上的 AA,而不是渲染级别上的,并且不应低估,因为它通常便宜且便携。

如果您实现上述任何一项,我会对您的结果和场景的更多详细信息非常感兴趣。

关于android - OpenGL ES 2.0 通过共享 C++ 代码在 ios 和 android 上进行抗锯齿或平滑处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48943394/

相关文章:

java - Drive Rest API V3 中的可恢复上传

android - 如何知道android中的音频何时开始播放

c++ - 从初始值设定项列表返回值

c++ - 使用 c++ makefile 查找 header 时出现问题

iphone - 高分辨率图像和视网膜显示

android - 将对象从我的 Activity 传递到我的 fragment

c++ - boost::shared_ptr parent <-> child 通信

javascript - UIWebView 性能与 JS onclick 功能

iphone - iOS 将 View 和图像编码/解码到文件目录中

android - 在 webview 应用程序之前显示的异步启动画面