能否通过顶点着色器修改GPU中的顶点缓冲区数据?
结论
你写的这段代码不可行,有两层核心问题:
- 第一,代码本身编译不通过。GLSL中用
in限定符声明的顶点输入属性是只读变量,不允许在着色器中直接对其赋值,你的position = position * someTransformation;写法会直接触发编译错误。 - 第二,即便绕过编译问题,也不可能通过顶点着色器直接修改GPU上存储的原始顶点属性数据:顶点着色器的输入仅能从顶点缓冲区读取原始值,没有直接回写原始缓冲区的权限。
替代实现方案
如果你只是需要在当前渲染管线的后续阶段使用变换后的位置值,直接声明临时变量存储变换结果即可,不需要修改输入属性:
#version 330 core layout(location = 0) in vec4 position; uniform mat4 someTransformation; // 如果需要把变换后的位置传递给片元着色器可以加如下输出变量 out vec4 transformedPosition; void main() { vec4 newPosition = position * someTransformation; transformedPosition = newPosition; gl_Position = newPosition; }
如果你确实需要将变换后的顶点属性持久化更新到GPU缓冲区用于后续渲染,可以使用对应版本的适配方案:
- 如果你使用的是OpenGL 3.3版本,可以用**变换反馈(Transform Feedback)**功能,专门用于捕获顶点着色器的输出结果并写入到目标缓冲区中,你可以将变换后的位置输出写入新的顶点缓冲区,后续渲染直接绑定该新缓冲区即可完成顶点属性的更新。
- 如果你使用的是OpenGL 4.3及以上版本,也可以用计算着色器读写着色器存储缓冲区(SSBO),直接批量修改顶点数据。
内容的提问来源于stack exchange,提问作者Jurby
相关产品推荐
相关产品推荐

