【问题标题】:Permanently move vertices using vertex shader GLSL使用顶点着色器 GLSL 永久移动顶点
【发布时间】:2017-03-16 02:18:16
【问题描述】:

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

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

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

有没有办法做到这一点?你有什么其他的建议? 提前致谢。

PS 我使用的是 GLSL 1.30 版

【问题讨论】:

    标签: c++ opengl glsl


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      看来transform feedback正是你所需要的。

      【讨论】:

        【解决方案3】:

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

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

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

        考虑:

        我擅长相机旋转和平移

        那么 in 一点也不贵。考虑到您已经有一个用于相机和视口的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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-08-31
          • 1970-01-01
          • 1970-01-01
          • 2017-08-11
          • 1970-01-01
          • 1970-01-01
          • 2022-01-04
          • 1970-01-01
          相关资源
          最近更新 更多