OpenGL-如何在顶点缓冲区中变换顶点的子集?

OpenGL-如何在顶点缓冲区中变换顶点的子集?,opengl,transformation,vertex-buffer,Opengl,Transformation,Vertex Buffer,我想制作一些动画来改变直线一端(linePos[0])的位置(例如translate),但不改变另一端。我该怎么做呢?您基本上有两种选择: 更新linePos数组中的顶点位置并重新上载到顶点缓冲区对象。您可以使用更新数据。其次,我认为在顶点着色器中转换线的方法更好(更快)。无论如何,如果您需要修改单个顶点的位置,第一种方法就是您所需要的。下面是一个关于如何使用可编程管道来完成的示例 顺便说一句,我想扩展基于着色器的解决方案。我建议这样做是因为直线只有两个点:起点和终点。因此,更改其中任何一个点的

我想制作一些动画来改变直线一端(linePos[0])的位置(例如translate),但不改变另一端。我该怎么做呢?

您基本上有两种选择: 更新linePos数组中的顶点位置并重新上载到顶点缓冲区对象。您可以使用更新数据。其次,我认为在顶点着色器中转换线的方法更好(更快)。无论如何,如果您需要修改单个顶点的位置,第一种方法就是您所需要的。下面是一个关于如何使用可编程管道来完成的示例


顺便说一句,我想扩展基于着色器的解决方案。我建议这样做是因为直线只有两个点:起点和终点。因此,更改其中任何一个点的位置就像通过矩阵变换整条直线。这就是为什么我认为最好在顶点着色器中执行此操作。如果有一条直线由至少3个向量定义,若要修改特定顶点的位置,需要在CPU上修改顶点数组。好的,你们可以在几何体着色器中完成,但这是高级的东西

您基本上有两种选择: 更新linePos数组中的顶点位置并重新上载到顶点缓冲区对象。您可以使用更新数据。其次,我认为在顶点着色器中转换线的方法更好(更快)。无论如何,如果您需要修改单个顶点的位置,第一种方法就是您所需要的。下面是一个关于如何使用可编程管道来完成的示例


顺便说一句,我想扩展基于着色器的解决方案。我建议这样做是因为直线只有两个点:起点和终点。因此,更改其中任何一个点的位置就像通过矩阵变换整条直线。这就是为什么我认为最好在顶点着色器中执行此操作。如果有一条直线由至少3个向量定义,若要修改特定顶点的位置,需要在CPU上修改顶点数组。好的,你们可以在几何体着色器中完成,但这是高级的东西

在顶点着色器中检查是奇数还是偶数,取决于您是否可以决定应用变换。

在顶点着色器中检查是奇数还是偶数,取决于您是否可以决定应用变换。

我理解您的第一个选择。你能澄清第二个问题吗?你使用着色器吗?如果没有,这里很难全部解释。但我建议你阅读我在答案中提到的教程。在第二部分中,作者解释了如何通过顶点着色器而不是顶点数组上传来移动三角形。这正是你的情况。OP使用顶点着色器来平移直线,但他只想平移它的一端。他可以使用lookAt()方法(参见GLM lib)构建旋转矩阵,并将其传递给顶点着色器。但是,是的,如果你不想做任何数学运算,那么重新上传顶点缓冲区是一种方法。我理解你的第一个选择。你能澄清第二个问题吗?你使用着色器吗?如果没有,这里很难全部解释。但我建议你阅读我在答案中提到的教程。在第二部分中,作者解释了如何通过顶点着色器而不是顶点数组上传来移动三角形。这正是你的情况。OP使用顶点着色器来平移直线,但他只想平移它的一端。他可以使用lookAt()方法(参见GLM lib)构建旋转矩阵,并将其传递给顶点着色器。但是,如果不想做任何数学运算,则可以重新上载顶点缓冲区。GL 4.0还有原子计数器GL 4.0也有原子计数器
float linePos[6]={0.0f,5.0f,0.0f,0.0f,30.0f,0.0f};    
...

glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*2, linePos, GL_STATIC_DRAW);

...
glUniformMatrix4fv(UniformColor.modelToWorldMatrixUnif, 1, GL_FALSE, glm::value_ptr(modelMatrix.Top()));
//this just transforms all vertices

glLineWidth(3);
glDrawArrays(GL_LINES,0,2);