2014-12-01 62 views
1

当我可以自己排列位置数学时,推动/弹出矩阵来转换形状的目的是什么?我可以理解使用上述矩阵做更困难的操作(例如旋转),但为什么要特别翻译?我为什么要使用glTranslate?

public void render() 
     { 
      positionX++; 

      GL.PushMatrix(); 
      GL.Translate(positionX, positionY, 0); 

      GL.MatrixMode(MatrixMode.Modelview); 
      GL.LoadIdentity(); 

      GL.Begin(PrimitiveType.Quads); 

      GL.Vertex2(0, 0); 
      GL.Vertex2(0 + widthX, 0); 
      GL.Vertex2(0 + widthX, 0 + widthY); 
      GL.Vertex2(0, 0 + widthY); 

      GL.PopMatrix(); 

      GL.End(); 
     } 

public void render() 
     { 
      positionX++; 
      GL.MatrixMode(MatrixMode.Modelview); 
      GL.LoadIdentity(); 

      GL.Begin(PrimitiveType.Quads); 

      GL.Vertex2(positionX, positionY); 
      GL.Vertex2(positionX + widthX, positionY); 
      GL.Vertex2(positionX + widthX, positionY + widthY); 
      GL.Vertex2(positionX, positionY + widthY); 

      GL.End(); 
     } 
+1

一般来说,矩阵的使用允许轻松地链接操作。不知道这是*的原因,或者它是否回答你的问题。 – BradleyDotNET 2014-12-01 22:38:15

+2

你不应该;该函数与GL.Begin和GL.End函数一起被弃用 – 2014-12-01 22:40:47

+1

在'glTranslatef'后面添加'glRotatef(45,0,0,1)',并运行程序。现在将'glRotatef'移动到'glTranslatef'之前,然后重新运行你的程序。 – 2014-12-01 22:43:19

回答

2

我不认为这是一个愚蠢的问题,尽管当您更多地使用OpenGL时,答案可能会变得清晰。

使用glTranslate(或类似的方法)进行翻译当您需要不同的转换顺序时,一定能派上用场。如果翻译是您想要执行的第一个转换,则只能更改顶点坐标。如果你想做的话,例如,旋转,然后翻译,然后再旋转,你必须使用矩阵。

但是,主要原因是通常你不会在每一帧都发送顶点到GPU。这是非常缓慢的,实际上,您使用的所有GL.*方法现在已被弃用。它是目前实现的方法是:

  1. 发送的GPU,一旦你开始渲染任何东西之前所有的顶点数据(记住它可能是几千个多边形或更多的)。
  2. GPU将数据存储在其内部存储器中(这就是为什么您的显卡上有很多MB/GB的RAM),并为您提供一个ID(例如1)。
  3. 渲染帧时,只需告诉GPU“用id 1保存的东西”即可。这是一个单一的OpenGL调用 - 请记住,每个OpenGL调用都有一个代价(意味着时间),所以调用的调用越少,图形就会越快。

对于纹理,着色器和其他东西也一样。

因此,一般情况下,一旦将其发送到GPU,您一般不会修改顶点数据(技术上可以修改,但出于性能原因不可取)。所以如果你想做任何转换,你必须使用矩阵。作为最后一点,我会再次说,你正在使用已弃用的功能,这对学习一些基本概念我没有那么坏,但我肯定会推荐移动到当前的OpenGL(或者至少OpenGL 3 ),并且了解着色器,顶点缓冲区,顶点数组和所有新的有光泽的东西。

TL; DR:是的,你可以自己动手。但最好让你的显卡做它,因为它可以更快地做到这一点。事实上,这是拥有专用显卡的主要原因。

1

什么入栈/矩阵时,我可以排序的做位置数学自己翻译的形状的目的是什么?

因为它允许OpenGL将操作卸载到GPU,并在其中大规模并行化。好看,试图超越这一点。 GPU革命开始于第一批卸载这种操作的GPU。当时称为T'n'L加速(变换和照明),它对15年前开始的PC图形革命负有单一责任。

考虑到glTranslate和朋友都不赞成这样的事实,你的问题可能会被改写为

什么是供应平移矩阵到顶点着色均匀,当我可以只是有点做翻译的形状的目的数学自己呢?

好了,原因是,“做自己”,通常归结为像

foreach(v in vertices) 
    v_new.position = v.position + t 

这通常会在CPU上执行,即使你使用类似的openmpi的构建并行化仅限于CPU内核的数量。

通过OpenGL矩阵操作实现翻译,OpenGL实现可以大规模并行操作;在现代GPU的情况下,几千个“流”(大致以锁步运行的线程)并行执行。

尽管完全可以执行简单的翻译,但正如上面的着色器一样,您通常会使用矩阵将多个转换合并为一个单独的操作。