ios - 在 OpenGL ES 中渲染 "layers"

标签 ios opengl-es textures layer framebuffer

我正在制作一个 iOS 应用程序,我希望能够使用单独的“层”进行渲染,这样我就可以在它们之间进行混合,并在将它们全部混合在一起并渲染到屏幕之前分别对每个层使用着色器。

我知道我将渲染到纹理,然后在帧缓冲区中将这些纹理相互叠加渲染,但我不清楚需要编写哪些代码来遵循此过程。在另一个答案中,我找到了我想做的事情,但我不知道是什么代码完成了这个任务:How to achieve multi-layered drawing with OpenGL ES on iOS? (例如,我如何“绑定(bind)纹理 1,然后绘制它”?“附加纹理 1”是什么意思?)

我也看过 Apple's documentation关于此技术,但对于该过程的实际渲染部分的步骤或代码不是很清楚。

我该怎么做呢? (希望有每个步骤的代码示例,因为我还没有理解希望我只知道每个步骤需要什么的参差不齐的说明)

Here is an example of what I want to do with this.球体将被渲染成一个“层”或 Texture2D,然后我将其通过着色器,然后在已经部分渲染的场景之上进行渲染。我不知道什么样的 openGL 代码可以做到这一点。

最佳答案

你看错地方了。要使用 OpenGL,您需要学习 OpenGL,而不是其他任何东西。 Apple 不提供任何 OpenGL 文档,因为它是一个开放标准,所以规范是免费发布的。 Apple 假设您已经熟悉它。

我认为您遇到麻烦是因为您不了解 GL 特定条款。规范非常清楚地描述了它们。所以,请阅读规范。那会节省你很多时间。否则你会留下麻烦。

此外,我想介绍一个网站,该网站对 OpenGL 管道进行了非常好的概念性描述。

http://www.songho.ca/opengl/

此站点针对桌面 GL,某些 API 可能略有不同。请注重概念性理解。例如,这是来自网站的插图。

有关更多教程,请使用适当的关键字进行谷歌搜索,例如 OpenGL ES 2.0 tutorials(或 how-tos)。这是 an example link , 并且会有帮助。还有更多教程。如果 spec 太无聊,和导师一起玩也不错。

更新

我还想多说一句。 IMO,OpenGL 就是关于绘制三角形。一切最终都在 3D 空间中转化为三角形来表示某种形状。其他一切都只为优化而存在。并且在大多数情况下,GL 选择批处理 作为主要优化策略。因为大多数游戏都负担不起每次绘图调用的开销。

OpenGL ES 很难启动,因为它是桌面 GL 的优化版本,所以所有方便或简单的绘图功能都被剥离了。即使在最新版本的桌面 GL 上也是如此。

所以没有这样的drawOneTriangle函数。相反,GL 有类似

  1. 做一个缓冲区,
  2. 将许多三角形的列表放在那里
  3. 为下一个绘图选择缓冲区。
  4. 一次绘制当前缓冲区中的所有三角形
  5. 删除缓冲区。

通过使用缓冲区,您无需将重复的数据从 CPU 分派(dispatch)到 GPU。 GL 到处都使用这种方法。例如,您没有这样的 drawOneTriangleWithTexture 函数来使用纹理。相反,你必须

  1. 做一个缓冲区
  2. 将许多像素的列表放在那里(位图)
  3. 为下一个绘图选择缓冲区。
  4. 使用当前缓冲区中的纹理像素数据绘制所有三角形。
  5. 删除缓冲区。

GL上所有过于复杂的东西都是为了优化而存在的。乍一看这可能看起来很奇怪,但通常有很好的设计理由。

更新2

现在我认为您正在寻找渲染到纹理 功能。 (嗯,实际上你已经提到过这个……)

您可以使用渲染图像作为纹理源。为此,

  1. 您需要使用一些函数(例如 glFramebufferTexture)将帧缓冲区与纹理对象而不是渲染缓冲区对象绑定(bind)在一起。

  2. 渲染到纹理后,将帧缓冲区切换到最终缓冲区,并绑定(bind)您绘制的纹理和其他纹理,并执行最终绘制。您需要两个帧缓冲区:一个用于渲染到纹理,一个用于最终输出。

关于ios - 在 OpenGL ES 中渲染 "layers",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23569467/

相关文章:

ios - 应用因 IPV6 问题被 App Store 拒绝

ios - URLRequest 在超时前失败

android - 动态壁纸服务中的 min3D?

iphone - 有没有办法在不使用 OpenGL ES 的情况下增亮 UIImage?

3d - 为什么这些 UV 映射坐标用 0-1 和像素表示?他们不应该只使用0-1系统吗?

ios - webkit-overflow-scrolling 使元素消失

ios - 离开 NSLogs 是否存在安全风险?

android - 将 GLES 纹理从 GL_TEXTURE_EXTERNAL_OES 绑定(bind)到 GL_TEXTURE_2D

android - LibGDX抗锯齿使边缘变灰

iphone - 来自具有透明度的 PNG 的 openGL ES 纹理正在以奇怪的伪影进行渲染,这让我抓狂!