我倾向于GLSL,一般都是OpenGL,我在顶点移动和管理方面遇到了一些麻烦。 我很擅长相机旋转和平移,但现在我需要移动一些顶点并让它们保持新的位置。
我想做的是使用顶点着色器移动它们,但也不通过矩阵跟踪它们的新位置(因为我需要独立移动它们,因此在内存和计算能力方面会非常昂贵存储那么多矩阵。)
如果有办法直接从顶点着色器更改VBO中的位置值,那将是最佳的。
有办法吗?您还有其他什么方法可以建议? 提前谢谢。
PS我正在使用GLSL版本1.30
答案 0 :(得分:2)
虽然可以将着色器中的值写入缓冲区,然后从CPU客户端读取它(即使用glReadPixels()
),但我不认为这是你的案件。
您可以使用单个矩阵移动一组具有相同移动的顶点。为什么不用CPU来存储结果,在需要时更新gl-buffer? (如果你只是更新glBuffer,VAO保持不变)移动后,你不再需要那个矩阵,对吧?或者,如果你想撤消移动,那么,是的,你还需要存储矩阵。
答案 1 :(得分:0)
似乎transform feedback正是您所需要的。
答案 2 :(得分:0)
我想做的是使用顶点着色器移动它们,但也不通过矩阵跟踪它们的新位置
如果我理解正确,那么你想要的是将一些顶点发送到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方面做出的改变,那么你必须调查Shader Storage Buffer Object和/或Transform Feedback