仅对顶点缓冲区的一部分进行矩阵运算(opengl-tutorial.org)

时间:2013-03-28 16:51:55

标签: c++ opengl

我最近了解到:

glBegin(GL_TRIANGLES);
glVertex3f( 0.0f, 1.0f, 0.0f);
glVertex3f(-1.0f,-1.0f, 0.0f);
glVertex3f( 1.0f,-1.0f, 0.0f);
glEnd();

其实并非如此。我一直在使用opengl-tutorial.org的教程,向我介绍了VBO。现在我将它全部迁移到一个类中并试图改进我的理解。
我的情况类似于this。我理解如何使用矩阵进行旋转,我可以自己完成所有操作,然后将其交给gl和朋友。但我确信效率低得多,而且会涉及到与显卡的更多通信。该网站上的教程17显示了如何旋转内容,它使用:

// Send our transformation to the currently bound shader, 
// in the "MVP" uniform
glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]);
glUniformMatrix4fv(ModelMatrixID, 1, GL_FALSE, &ModelMatrix[0][0]);
glUniformMatrix4fv(ViewMatrixID, 1, GL_FALSE, &ViewMatrix[0][0]);

旋转对象。我认为这比我能生产的任何东西都更有效率。我想要的是做这样的事情,但只将矩阵乘以一些网格,而不将网格分成碎片(因为这会破坏三角形 - 顶点 - 索引关系,我最终会将它拼接回一起)。
是否有单独的功能?是否有一些更高级别的库可以处理我应该使用的网格和骨骼(因为其他人发布的一些回复似乎暗示)?我不想再次使用过时和低效的东西,只是为了以后再次重做所有内容。

2 个答案:

答案 0 :(得分:1)

制服是如此命名的,因为它们是制服:在渲染调用过程中保持不变。着色器只能对输入值(每个输入类型提供。顶点着色器的每顶点,片段着色器的每个片段等),制服(对于单个渲染调用是固定的)和全局变量(它们是为着色器的每个实例化重置为原始值。)

如果要在单个渲染调用中为对象的不同部分执行不同的操作,则必须基于输入变量执行此操作,因为只有输入在单个渲染调用中更改。听起来你正试图用矩阵蒙皮或对象的层次结构做一些事情,所以你可能想给每个顶点一个矩阵索引或某些东西作为输入。您可以使用此索引查找统一矩阵数组以获取要使用的实际矩阵。

答案 1 :(得分:0)

OpenGL不是场景图。它没有在网格或几何中思考。指定制服时,它不会“应用”到网格中。它只设置一个着色器访问的寄存器。稍后当您从顶点数组(可能包含在VBO中)中绘制基元时,对glDraw…的调用将确定VA的哪些部分被批处理以进行绘制。 glDraw…只是VA的一个子集,然后切换制服,并绘制另一个子集,这是完全可能和合理的。

在任何情况下,OpenGL都不会更改VA中的数据。