繁体   English   中英

在OpenGL ES中渲染“图层”

[英]Rendering “layers” in OpenGL ES

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

我知道我将先渲染到Textures,然后在帧缓冲区中将这些纹理彼此渲染,但是我不明白要遵循此过程需要编写什么代码。 在另一个答案中,我找到了我想做的事情,但是我不知道什么代码可以完成此任务: 如何在iOS上使用OpenGL ES实现多层绘图? (例如,如何“绑定纹理1,然后绘制它”?对“附加纹理1”意味着什么?)

我也查看了有关此技术的Apple文档 ,但对于过程的实际呈现部分的步骤或代码尚不清楚。

我将如何去做呢? (希望能提供每个步骤的代码示例,因为我还不了解让我只是知道每个步骤需要什么的参差不齐的指令)

这是我要处理的示例。 球体将被渲染到“图层”或Texture2D中,然后我将通过着色器,然后在已经部分渲染的场景之上进行渲染。 我不知道究竟哪种openGL代码可以做到这一点。

您在找错地方。 要使用OpenGL,您需要学习OpenGL,而不是其他任何东西。 苹果公司不提供任何OpenGL文档,因为它是一个开放标准,因此这些规范可以免费发布。 Apple假设您已经熟悉它。

我认为您遇到了麻烦,因为您不了解GL专用术语。 规范非常清楚地描述了它们。 因此,请阅读规格。 这样可以节省大量时间。 否则,您将保持麻烦。

另外,我想介绍一个站点,该站点对OpenGL管道有非常好的概念描述。

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

该网站的目标是桌面GL,某些API可能有所不同。 请专注于概念上的理解。 例如,这是该网站的插图。

有关更多教程,请使用诸如OpenGL ES 2.0 tutorials (或操作方法)之类的适当关键字的google。 这是一个示例链接 ,将很有帮助。 还有更多的教程。 如果规范太无聊,与导师一起玩也很好。

更新

我想再说一遍。 IMO,OpenGL都是关于绘制三角形的 最终,所有内容都将转换为3D空间中的三角形以表示某种形状。 其他所有内容仅用于优化。 在大多数情况下,GL选择批处理作为主要的优化策略。 因为对于大多数游戏来说,每个绘图调用的开销都负担不起。

启动OpenGL ES非常困难,因为它是桌面GL的优化版本,因此剥夺了所有方便或便捷的绘图功能。 即使在最新版本的桌面GL上也是如此。

因此,没有这样的drawOneTriangle函数。 相反,GL有类似

  1. 做一个缓冲,
  2. 放很多三角形的清单
  3. 选择下一个绘图的缓冲区。
  4. 一次绘制当前缓冲区中的所有三角形
  5. 删除缓冲区。

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

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

GL上所有过于复杂的东西都存在以进行优化。 乍一看这很奇怪,但是通常有很好的设计理由。

更新2

现在,我认为您正在寻找渲染到纹理的功能。 (实际上您已经提到了这一点……)

您可以将渲染的图像用作纹理源。 去做这个,

  1. 您需要使用诸如glFramebufferTexture函数将帧缓冲区与纹理对象绑定,然后与渲染缓冲区对象glFramebufferTexture

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM