Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用顶点着色器GLSL永久移动顶点_C++_Opengl_Glsl - Fatal编程技术网

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

C++ 使用顶点着色器GLSL永久移动顶点,c++,opengl,glsl,C++,Opengl,Glsl,我正在学习GLSL和一些OpenGL,我在顶点移动和管理方面遇到了一些问题。 我擅长相机旋转和平移,但现在我需要移动一些顶点,让它们保持在新的位置 我想做的是使用顶点着色器移动它们,但也不通过矩阵跟踪它们的新位置(因为我需要独立地移动它们,而且存储这么多矩阵的内存和计算能力非常昂贵) 如果有一种方法可以直接从顶点着色器更改它们在VBO中的位置值,那将是最佳选择 有办法吗?你还有什么建议吗? 提前谢谢 PS我使用的是GLSL 1.30版虽然可以将着色器中的值写入缓冲区,然后从CPU客户端读取(即,

我正在学习GLSL和一些OpenGL,我在顶点移动和管理方面遇到了一些问题。 我擅长相机旋转和平移,但现在我需要移动一些顶点,让它们保持在新的位置

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

如果有一种方法可以直接从顶点着色器更改它们在VBO中的位置值,那将是最佳选择

有办法吗?你还有什么建议吗? 提前谢谢


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方面所做的任何更改,那么你必须查看和/或