C++ 使用顶点着色器GLSL永久移动顶点
我正在学习GLSL和一些OpenGL,我在顶点移动和管理方面遇到了一些问题。 我擅长相机旋转和平移,但现在我需要移动一些顶点,让它们保持在新的位置 我想做的是使用顶点着色器移动它们,但也不通过矩阵跟踪它们的新位置(因为我需要独立地移动它们,而且存储这么多矩阵的内存和计算能力非常昂贵) 如果有一种方法可以直接从顶点着色器更改它们在VBO中的位置值,那将是最佳选择 有办法吗?你还有什么建议吗? 提前谢谢C++ 使用顶点着色器GLSL永久移动顶点,c++,opengl,glsl,C++,Opengl,Glsl,我正在学习GLSL和一些OpenGL,我在顶点移动和管理方面遇到了一些问题。 我擅长相机旋转和平移,但现在我需要移动一些顶点,让它们保持在新的位置 我想做的是使用顶点着色器移动它们,但也不通过矩阵跟踪它们的新位置(因为我需要独立地移动它们,而且存储这么多矩阵的内存和计算能力非常昂贵) 如果有一种方法可以直接从顶点着色器更改它们在VBO中的位置值,那将是最佳选择 有办法吗?你还有什么建议吗? 提前谢谢 PS我使用的是GLSL 1.30版虽然可以将着色器中的值写入缓冲区,然后从CPU客户端读取(即,
PS我使用的是GLSL 1.30版虽然可以将着色器中的值写入缓冲区,然后从CPU客户端读取(即,使用
glReadPixels()
),但我认为这不是您的情况。
可以使用单个矩阵移动一组顶点,所有顶点都具有相同的移动。为什么不使用CPU来执行此操作并存储结果,在需要时更新其gl缓冲区?(如果只更新glBuffer,VAO将保持不变)一旦它们被移动,您就不再需要该矩阵了,对吗?或者,如果您想撤消移动,那么,是的,您还需要存储矩阵。虽然可以将着色器中的值写入缓冲区,然后从CPU客户端读取它(即,使用
glReadPixels()
),但我不认为这是您的情况。
可以使用单个矩阵移动一组顶点,所有顶点都具有相同的移动。为什么不使用CPU来执行此操作并存储结果,在需要时更新其gl缓冲区?(如果只更新glBuffer,VAO将保持不变)一旦它们被移动,您就不再需要该矩阵了,对吗?或者,如果您想撤消移动,那么,是的,您还需要存储矩阵。这似乎正是您所需要的。这似乎正是您所需要的
我想做的是使用顶点着色器移动它们,但也不要通过矩阵跟踪它们的新位置
如果我理解正确,那么您想要的是将一些顶点发送到GPU。然后让顶点着色器移动它们。您不能这样做,因为顶点着色器只能从顶点缓冲区读取,而不能写回它
在内存和计算能力方面,存储这么多矩阵是非常昂贵的
考虑到:
我擅长相机旋转和平移
那就不会太贵了。考虑到相机和视口已经有了视图
和投影
矩阵。那么,拥有一个包含每个对象的平移、旋转和缩放的模型
矩阵并不是一个瓶颈
在顶点着色器中,您只需要:
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方面所做的任何更改,那么你必须查看和/或
我想做的是使用顶点着色器移动它们,但也不要通过矩阵跟踪它们的新位置
如果我理解正确,那么您想要的是将一些顶点发送到GPU。然后让顶点着色器移动它们。您不能这样做,因为顶点着色器只能从顶点缓冲区读取,而不能写回它
在内存和计算能力方面,存储这么多矩阵是非常昂贵的
考虑到:
我擅长相机旋转和平移
那就不会太贵了。考虑到相机和视口已经有了视图
和投影
矩阵。那么,拥有一个包含每个对象的平移、旋转和缩放的模型
矩阵并不是一个瓶颈
在顶点着色器中,您只需要:
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方面所做的任何更改,那么你必须查看和/或