1
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);

我想制作一些动画来改变线(linePos [0])一端的位置(ex.translate),而不是另一端。我怎样才能做到这一点?

4

2 回答 2

1

在您的顶点着色器中检查gl_VertexID是奇数还是偶数,并根据它决定是否应用转换。

于 2012-12-13T13:26:35.050 回答
0

您基本上有 2 个选项:更新 linePos 数组中的顶点位置并重新上传到顶点缓冲区对象。您可以使用glBufferSubData更新数据。第二,我认为更好(更快)的方法是在顶点中转换您的线shader.Anyways ,如果您需要修改单个顶点位置,第一种方法就是您需要的。这是一个流行的教程,介绍如何使用可编程管道完成它。

顺便说一句,我想扩展基于着色器的解决方案。我建议这样做是因为你的线只有 2 个点:开始和结束。所以改变它们中的任何一个的位置就像用矩阵变换整条线。这就是为什么我认为它是最好在顶点着色器中进行。如果您有一条至少由 3 个向量定义的线,那么要修改特定顶点的位置将需要在 CPU 上修改顶点数组。好吧,您可以在几何着色器中进行,但这是高级的东西。

于 2012-12-13T12:44:07.493 回答