【问题标题】:How to achieve multi-layered drawing with OpenGL ES on iOS?如何在iOS上用OpenGL ES实现多层绘图?
【发布时间】:2012-08-10 12:29:52
【问题描述】:

我想很快为 iOS 制作一个简单的绘图应用程序,但我不能完全让绘图工作 - 好吧,保存每个图层上的内容并恢复图层。看起来所有图层都保存相同的像素..

这个想法是有三层并使用 OpenGL ES 在每一层上绘制。由于没有这方面的经验,我只是平铺了三个 UIView,并为每个 UIView 添加了一个 OpenGL 绘图画布(教程中的 PaintingView 的修改版本)。当用户交换绘图层时,我只是禁用了其他层上的用户交互。

使用这种方法,我会遇到很多奇怪的事情,我认为这些都是我的方法造成的。所以现在,我认为我应该以某种方式在同一个 PaintingView 中制作三个全屏缓冲区,并在它们之间切换 OpenGL。

我在做某事吗?有没有人可行的方法?

任何与主题相关的内容都可能有所帮助。谢谢。

【问题讨论】:

  • 为什么需要三层?
  • 为什么不研究 coreGraphic 框架呢?苹果有据可查,应该做你想做的事。
  • 我支持@geminiCoder——我认为 OGL 会比使用核心动画层 + 核心图形更有效

标签: ios opengl-es uiview paint


【解决方案1】:

您可以制作两种不同的帧缓冲区:一种用于绘制到屏幕,另一种用于绘制到纹理。 然后,您可以制作 3 种不同的纹理,它们将成为您的图层。吸引他们。 最后,您可以将您拥有的纹理绘制到第一个帧缓冲区并呈现在屏幕上。

你的抽奖周期会是这样的:

  • 绑定 RenderToTextureFramebuffer
  • 将 texture1 附加到 RenderToTextureFramebuffer
  • 在第 1 层画出你想要的东西
  • 将 texture2 附加到 RenderToTextureFramebuffer
  • 在第 2 层画出你想要的东西
  • 将 texture3 附加到 RenderToTextureFramebuffer
  • 在第 3 层画出你想要的东西
  • 绑定 RenderToScreenFramebuffer
  • 绑定纹理1
  • 绘制纹理 1(您的图层 1)
  • 绑定纹理2
  • 绘制纹理 2(您的图层 2)
  • 绑定纹理3
  • 绘制纹理3(您的图层3)
  • 在屏幕上呈现最终图片

【讨论】:

  • 我按照上面的程序。我遇到的问题是,我必须通过调用 glClear(GL_COLOR_BUFFER_BIT) 在每一帧将图层重新绘制到屏幕上,然后再绘制到屏幕上。这会产生闪烁效果。我做错了什么还是可以预料到的?
  • Amendale,每帧重绘屏幕并在绘图前调用 glClear(GL_COLOR_BUFFER_BIT) 即可,不应导致闪烁。也许你的缓冲区有问题。也许您应该开始另一个问题并在那里发布您的代码,以便人们可以更好地理解您的问题。
【解决方案2】:

拥有画家的所有功能 - 撤消/重做等 恕我直言,您只需要几个图形对象数组,并在每次渲染过程中迭代它们。

【讨论】:

  • 他可以将逻辑部分从图形中分离出来并保留操作历史,并根据当前的逻辑状态重新绘制场景。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多