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

时间:2012-12-13 12:05:31

标签: opengl transformation vertex-buffer

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)而不是另一端。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

相关问题