使用顶点着色器 GLSL 永久移动顶点
Permanently move vertices using vertex shader GLSL
我倾向于GLSL,一般来说是一些OpenGL,我在顶点移动和管理方面遇到了一些麻烦。 我擅长相机旋转和平移,但现在我需要移动一些顶点并让它们保持在新位置。
我想做的是使用顶点着色器移动它们,但也不跟踪它们在矩阵中的新位置(因为我需要独立移动它们,并且在内存和计算能力方面存储这么多矩阵会非常昂贵)。
如果有一种方法可以直接从顶点着色器更改它们在 VBO 中的位置值,那将是最佳的。
有没有办法做到这一点?您还建议其他哪些方法? 提前谢谢。
PS 我正在使用 GLSL 版本 1.30
虽然可以将着色器中的值写入缓冲区,然后从 CPU 客户端读取它(即通过使用glReadPixels()
),但我认为这不是您的情况。
您可以使用单个矩阵移动一组顶点,所有这些顶点都具有相同的移动。为什么不使用 CPU 并存储结果,在需要时更新其 gl-buffer?(如果您只是更新 glBuffer,VAO 保持不变)一旦它们被移动,你就不再需要那个矩阵了,对吧?或者,如果您想撤消运动,那么,是的,您还需要存储矩阵。
似乎转换反馈正是您所需要的。
我想做的是使用顶点着色器移动它们,但也不跟踪它们通过矩阵的新位置
如果我理解正确,那么您想要的是将一些顶点发送到 GPU。然后让顶点着色器移动它们。不能,因为顶点着色器只能从顶点缓冲区读取,而不能写回顶点缓冲区。
在内存和计算能力方面,存储这么多矩阵将非常昂贵。
考虑到:
我擅长相机旋转和平移
那么在里面一点也不贵。考虑到您已经拥有相机和视口的view
和projection
矩阵。然后,让一个model
矩阵包含每个对象的平移、旋转和缩放并不是瓶颈。
在顶点着色器中,您只需拥有:
uniform mat4 mvp; // model view projection matrix
...
gl_Position = mvp * vec4(position, 1.0);
在 CPU 端,您要做的事情:
mvp = projection * view * model;
GLint mvpLocation = glGetUniformLocation(shaderGeometryPass, "mvp")
glUniformMatrix4fv(mvpLocation, 1, GL_FALSE, (const GLfloat*)&mvp);
如果这给您带来了性能问题,那么问题出在其他地方。
如果你真的想"保存"你在GPU方面所做的任何更改,那么你必须研究着色器存储缓冲区对象和/或转换反馈。
- 如何循环打印顶点结构
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- D3D11-将混合权重和索引传递到顶点着色器
- GLSL 将颜色数据从片段着色器发送到顶点着色器似乎总是等于 0
- GLSL 顶点着色器编译错误
- GLSL ES 顶点着色器错误
- 使用顶点着色器 GLSL 永久移动顶点
- GLSL着色器不渲染任何内容,VAO已填充,VBO已填充顶点
- 在glsl中使用实例化时,为什么纹理缓冲区比顶点输入快
- 间歇性GLSL顶点着色器编译错误
- 如何在 GLSL 中使用 4x4 矩阵作为顶点属性
- glsl顶点着色器glGetUniformLocation失败
- 如何在使用glDrawElements时将法线传递到GLSL中的顶点着色器
- 如何在 GLSL 中将属性传递给顶点着色器
- 将自定义顶点结构传递给 GLSL 着色器
- GLSL逐顶点固定大小数组
- GLSL-调用的顶点和片段的时间和位置
- 顶点着色器中的 GLSL 奇怪'<'语法错误
- 仅使用顶点着色器对象的GLSL会丢失颜色/纹理
- 如何使用glsl改变顶点位置