我应该使用多less个matrix来进行OpenGL转换?

当我开始深入了解(或者至less是一点点的)理解摄像机转换的工作原理时,我对一件事感到好奇:我应该使用多less个matrix

我的意思是,到目前为止,我一直在使用简单的二维正投影,我使用的是世界位置(不在-1.0到1.0的范围内),所以我刚在程序开始时创建了一个matrix,就是这样,但是当我想获得更多的3D(以获得不使用NDC的相同效果)我注意到(在教程中),他们使用了很多matrix(例如:他们为每个对象创建matrix,然后将其发送到GPU)。 这使我困惑,因为我认为我将只使用3个matrix(每个变换步骤)。 你能解释我在专业游戏中做得如何? 我是否需要为每个对象加载新的模型matrix(将其发送到顶点)? 或者在渲染每个对象的时候改变整个MVPmatrix? 它还足够吗? 谢谢

编辑关于效率:经常更改着色器variables是否有效? 我的意思是,我想用我的旧代码的批处理系统,现在看起来像这样:

1. Bind texture + VAO 2. Render object.1+object.n via glDrawArrays/Elements/Instanced 

但是现在呢会是:

 1. Bind texture + VAO 2. Load model matrix of object.1(via glUniformMat4fv) and render it, then load another model matrix for object2 and same for every object in batch 

改变着色器variables的效率不是很低吗?

Solutions Collecting From Web of "我应该使用多less个matrix来进行OpenGL转换?"

你的对象被转换成多个步骤,并且对于每一步,你通常使用一个matrix。

  • 您可以旋转,缩放和翻译每个模型。 这可以用三个独立的matrix来完成,但通常这三个操作被组合成一个大的变换/模型matrix,它将所有的东西放在一起。 每个模型都有它自己的变换matrix。
  • 目标是在正确的“世界空间”。 下一步是相机转换。 当你移动你的相机时,整个世界都将被转换,这是一个单一的matrix,被应用到你想渲染的每一个物体上。 (“ 你根据你的相机定位对象 ”)
  • 你需要的最后一个matrix是一个投影matrix。 这需要你的三维模型,并创建一个“深度”,即投影三维到二维屏幕。 您可以将其视为按照z坐标缩放所有x,y坐标以显得更近/更远。

一般来说,您可以创建matrix,并将其发送到您的着色器,其中将所有matrix应用于顶点。 GPU非常擅长并行工作,因此您不必花费宝贵的CPU周期来自行执行matrix乘法。

有关更多信息和实际实现的另一个关于简单射线select器的教程,它描述了openGL中的转换。

在职业游戏中,世界上的每一个物体都将拥有自己的世界matrix。 这通常存储在表示您的实体在世界中的某个结构,或挂在该实体(A类,结构等)的一些组件。

世界matrix不仅用于graphics,许多游戏逻辑也将依赖它。 这个matrix最终会以某种forms传递给渲染API。

我在graphics方面非常不熟悉,但是我认为通常情况下,渲染matrix会作为parameter passing给顶点着色器,而通过的matrix通常取决于顶点着色器的需求。 如果顶点着色器中的逻辑需要分别访问世界,查看和投影matrix,那么它们将分开传入。 如果着色器中的逻辑实际上只需要组合的Model * View * Projectionmatrix,那么可能会通过这种方式来减less着色器中的计算以及需要设置的常量的数量。

如果有意义的话,某些graphics技术甚至可能通过世界空间或相机空间的顶点。 不过,对于一次性效果而不是想要共享相同顶点缓冲区的对象,这将更加不寻常。 像粒子系统这样的dynamic效应就是一个很好的例子。

通常在专业质量引擎中,数据传递到graphicsAPI的方式通常会根据对象/材料types而变化。 例如,地形或其他types的静态世界几何体将与dynamic实体,蒙皮人物等非常不同。未被照明的几何体可能需要比受照明等影响的几何体更less的信息。