gpt4 book ai didi

iphone - 是否可以在顶点着色器内持续更改 iPhone OpenGL ES 2.0 上 VBO 的值?

转载 作者:行者123 更新时间:2023-12-03 19:22:02 25 4
gpt4 key购买 nike

我是 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 副本来实现。只需将顶点缓冲区复制到纹理中(通过将其绑定(bind)为 PBO),然后渲染带纹理的全屏四边形并在片段着色器中执行更新。之后,将帧缓冲区(现在包含更新的顶点数据)复制到顶点缓冲区(再次将其绑定(bind)为 PBO)。但这样你就必须做 2 个副本(尽管它们都应该完全在 GPU 上发生),并且如果顶点数据是浮点,你还需要支持浮点渲染目标和帧缓冲区对象。

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

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

关于iphone - 是否可以在顶点着色器内持续更改 iPhone OpenGL ES 2.0 上 VBO 的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7155245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com