在 OpenGL ES 中渲染“层”

Posted

技术标签:

【中文标题】在 OpenGL ES 中渲染“层”【英文标题】:Rendering "layers" in OpenGL ES 【发布时间】:2014-05-09 16:18:35 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

OpenGL ES 2.0 spec manual pages

我认为您遇到了麻烦,因为您不了解 GL 特定条款。该规范非常清楚地描述了它们。所以,请阅读规范。这将节省您的时间很多。不然你就麻烦了。

另外,我想介绍一个网站,它对 OpenGL 管道有很好的概念描述。

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

本网站面向桌面 GL,某些 API 可能略有不同。请专注于概念理解。例如,这里是来自网站的插图。

如需更多教程,请使用适当的关键字在 Google 上搜索,例如 OpenGL ES 2.0 tutorials(或操作方法)。这是an example link,会很有帮助。还有很多教程。如果规范太无聊,和导师一起玩也不错。

更新

我想再说一个。 IMO,OpenGL 就是绘制三角形。一切最终都转换为 3D 空间中的三角形来表示某种形状。其他任何东西都只是为了优化而存在。而且在大多数情况下,GL 选择批处理作为主要优化策略。因为大多数游戏无法承受每次绘图调用的开销。

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

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

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

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

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

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

更新 2

现在我认为您正在寻找 渲染到纹理 功能。 (其实你已经提到了这个……)

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

    您需要将帧缓冲区与纹理对象绑定,而不是使用glFramebufferTexture 等函数绑定渲染缓冲区对象。

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

【讨论】:

我正在这样做。似乎没有任何地方可以清楚地解释 OpenGL 的作用,也没有清楚地解释缓冲区的目的,或者它们如何工作,或者绘制函数绘制的内容等等......我厌倦了代码没有明确的解释。这就是我在这里要问的全部内容,但是谢谢,直到现在我都在遵循您的方法,但是我仍然希望对该方法及其步骤背后的代码进行良好而清晰的解释。 @Danegraphics 不要沮丧。因为 OpenGL 和 DirectX 中的图形 API 中的对象概念非常复杂,因为它们已经开发了数十年。人们通常需要数年时间才能熟悉它们。 我已经掌握了基础知识。这是我现在需要进入的高级内容,而且清晰的资源很少。我在看this tutorial,尤其是关于屏幕外渲染的部分,我用谷歌搜索了“渲染到纹理 opengl”,现在我知道如何渲染到纹理,但不知道如何在另一个之上渲染纹理(或其他神奇的东西,比如像使用图像一样使用纹理),所以我必须把它拼凑起来。用互联网的碎片构建自己的代码是一件很慢的事情。 Another thing I'm looking at @Danegraphics 你的意思是像 alpha blending 这样的东西吗?

以上是关于在 OpenGL ES 中渲染“层”的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL ES 太好玩了图形渲染管线

OpenGL ES 太好玩了图形渲染管线

使用 OpenGL(和 OpenGL ES)渲染 SVG

我的OpenGL学习进阶之旅关于OpenGL ES 绘制中使用到的 Android中GLSurfaceView的两种渲染模式

我的OpenGL学习进阶之旅关于OpenGL ES 绘制中使用到的 Android中GLSurfaceView的两种渲染模式

OpenGL ES 渲染立体图形