繁体   English   中英

是否可以在顶点着色器内持久更改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?

我是一个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)。

如果这是可能的,它在代码中会是什么样子?

在现代桌面硬件(GL3 / DX10)上,您可以使用变换反馈将顶点或几何着色器的输出写回缓冲区,但我真的怀疑iPhone(或一般来说是ES)支持transform_feedback扩展。

如果支持PBO(我也怀疑),你至少可以使用一些GPU-GPU副本。 只需将顶点缓冲区复制到纹理中(通过将其绑定为PBO),然后渲染纹理化的全屏四边形并在片段着色器中执行更新。 之后,将帧缓冲区(现在包含更新的顶点数据)复制到顶点缓冲区中(再次将其绑定为PBO)。 但是这样你必须做2个副本(虽然它们都应该完全在GPU上发生),如果顶点数据是浮点数,你也需要支持浮点渲染目标和帧缓冲对象。

我认为在ES中,最好的解决方案就是在CPU上进行计算。 只需保存一个CPU副本(这样您至少没有必要的GPU-CPU回读)并每帧更新缓冲区数据(使用GL_DYNAMIC_DRAW或甚至GL_STREAM_DRAW作为缓冲区使用)。

也许您还可以通过使更改依赖于另一个更简单的数据来完全阻止持久更新。 在你的例子中,你可以使用一个统一的帧号,并在每个帧中将其设置为顶点着色器中的坐标,但我不知道你的更新函数到底有多复杂。

暂无
暂无

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

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