是否可以在顶点着色器内持续更改 iPhone OpenGL ES 2.0 上的 VBO 值?
Posted
技术标签:
【中文标题】是否可以在顶点着色器内持续更改 iPhone OpenGL ES 2.0 上的 VBO 值?【英文标题】:Is it possible to persistently change the values of a VBO on the iPhone OpenGL ES 2.0 inside a vertex shader? 【发布时间】:2011-08-23 00:55:51 【问题描述】:我是 Opengl ES 2.0 新手(和 GLSL 新手),如果这是一个明显的问题,请原谅我。
如果我有一个 VBO,我在程序开始时在 CPU 上初始化一次,是否可以使用顶点着色器在每帧更新它而不在 cpu 上进行计算,然后将其重新上传到 GPU?我不是指发送制服并基于此操作数据。相反,我的意思是导致 GPU 本身的 VBO 发生持续变化。
所以我能想到的最简单的例子是每次渲染帧时在顶点着色器中的 gl_Position 的 x、y 和 z 分量上加 1。这意味着如果我只有一个顶点,并且它在 cpu 上的初始位置设置为 (0,0,0,1),那么在 30 帧之后它将是 (30,30,30,1)。
如果这是可能的,它在代码中会是什么样子?
【问题讨论】:
【参考方案1】:在现代桌面硬件 (GL3/DX10) 上,您可以使用变换反馈将顶点或几何着色器的输出写回缓冲区,但我真的怀疑 iPhone(或 ES 中的一般)。
如果支持 PBO(我也对此表示怀疑),您至少可以使用一些 GPU-GPU 副本来实现。只需将顶点缓冲区复制到纹理中(通过将其绑定为 PBO),然后渲染带纹理的全屏四边形并在片段着色器中执行更新。之后,您将帧缓冲区(现在包含更新的顶点数据)复制到顶点缓冲区(再次将其绑定为 PBO)。但是这种方式你必须做 2 个副本(尽管它们都应该完全发生在 GPU 上),如果顶点数据是浮点数据,你还需要支持浮点渲染目标和帧缓冲对象。
我认为在 ES 中最好的解决方案是在 CPU 上进行计算。只需保存一份 CPU 副本(这样您至少没有不必要的 GPU-CPU 回读)并每帧更新缓冲区数据(使用 GL_DYNAMIC_DRAW
甚至 GL_STREAM_DRAW
作为缓冲区使用情况)。
也许您还可以通过使更改依赖于另一个更简单的数据来完全防止持久更新。在您的示例中,您可以只使用统一的帧号并将其设置为每帧顶点着色器中的坐标,但我不知道您的更新函数到底有多复杂。
【讨论】:
我正在尝试这样做:http.developer.nvidia.com/GPUGems2/gpugems2_chapter44.html 我不能在 iPhone 上渲染到浮点纹理,因为它还不支持。所以我的下一个想法是尝试通过 VBO 进行某种更新,但这似乎也不支持。知道如何做到这一点吗? 我确实有浮动纹理,但我无法渲染到它们中。以上是关于是否可以在顶点着色器内持续更改 iPhone OpenGL ES 2.0 上的 VBO 值?的主要内容,如果未能解决你的问题,请参考以下文章