使用顶点着色器GLSL永久移动顶点

时间:2017-03-15 17:42:39

标签: c++ opengl glsl

我倾向于GLSL,一般都是OpenGL,我在顶点移动和管理方面遇到了一些麻烦。 我很擅长相机旋转和平移,但现在我需要移动一些顶点并让它们保持新的位置。

我想做的是使用顶点着色器移动它们,但也不通过矩阵跟踪它们的新位置(因为我需要独立移动它们,因此在内存和计算能力方面会非常昂贵存储那么多矩阵。)

如果有办法直接从顶点着色器更改VBO中的位置值,那将是最佳的。

有办法吗?您还有其他什么方法可以建议? 提前谢谢。

PS我正在使用GLSL版本1.30

3 个答案:

答案 0 :(得分:2)

虽然可以将着色器中的值写入缓冲区,然后从CPU客户端读取它(即使用glReadPixels()),但我不认为这是你的案件。

您可以使用单个矩阵移动一组具有相同移动的顶点。为什么不用CPU来存储结果,在需要时更新gl-buffer? (如果你只是更新glBuffer,VAO保持不变)移动后,你不再需要那个矩阵,对吧?或者,如果你想撤消移动,那么,是的,你还需要存储矩阵。

答案 1 :(得分:0)

似乎transform feedback正是您所需要的。

答案 2 :(得分:0)

  

我想做的是使用顶点着色器移动它们,但也不通过矩阵跟踪它们的新位置

如果我理解正确,那么你想要的是将一些顶点发送到GPU。然后让顶点着色器移动它们。你不能因为顶点着色器只能从顶点缓冲区读取,它无法回写它。

  

在存储许多矩阵的内存和计算能力方面会非常昂贵。

考虑到:

  

我很擅长相机旋转和翻译

然后在一点也不贵。考虑到您已经为相机和视口设置了viewprojection矩阵。然后让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方面做出的改变,那么你必须调查Shader Storage Buffer Object和/或Transform Feedback