最便宜的方式绘制全屏四核

时间:2010-03-25 18:09:52

标签: optimization opengl

我想知道是否有更快(GPU时间)的方式在OpenGL中绘制全屏四边形:

NewList();
PushMatrix();
LoadIdentity();
MatrixMode(PROJECTION);
PushMatrix();
LoadIdentity();
Begin(QUADS);
Vertex(-1,-1,0);  Vertex(1,-1,0);  Vertex(1,1,0);  Vertex(-1,1,0);
End();
PopMatrix();
MatrixMode(MODELVIEW);
PopMatrix();
EndList();

请注意,像素必须与模板缓冲区进行交互。

2 个答案:

答案 0 :(得分:1)

更快到哪里?在CPU?与在GPU上发生的工作相比,全屏四核的工作量在CPU上是可忽略的。

所以在这种情况下最重要的通常是优化GPU方面,不管你信不信,有一件事是相当重要的。我所知道的所有GPU都在内部将四边形转换为2个三角形。这些三角形中的每一个都分别进行栅格化。碰巧,你最终没有完全使用GPU,因为在两个三角形之间的对角线上,GPU必须工作两次(这是因为GPU一次只能工作16或32像素,形状为正方形或矩形。最小值为4,已经做了额外的工作。)

如何避免边缘的额外工作?在整个区域上绘制一个三角形,并将剪刀绘制到要绘制的区域。

类似的东西(虽然我通常从0到1而不是-1到1 ......):

glBegin(GL_TRIANGLES);
glVertex(-1,-1,0);  glVertex(3,-1,0);  Vertex(-1,3,0);
glEnd();

答案 1 :(得分:0)

如果您只想以指定颜色绘制整个视口,可以使用glClear:

glClearColor(/* specify color here*/);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

编辑:根据您添加的内容,显然无效。这确实留下了一个问题:“最快”你的意思是写得最快(即,你想要更简单的代码)还是最快的执行?

<强>简单

如果您想要简洁,glDrawPixels应该有效:

glRasterPos2i(-1,-1);
glDrawPixels(width, height, GL_RGBA, GL_UNSIGNED_BYTE, image);

其中'image'只是一个初始化为所需颜色的数据块。

<强>速度

为了提高执行速度,您可以:

  1. 将调用放入显示列表并在需要时执行。这对硬件和驱动程序有多大帮助。例如,对于nVidia比ATI更有用。
  2. 使用纹理。与glDrawPixels类似,但将纹理保留在纹理内存中可以提高速度。
  3. 理论上,您也可以通过拨打glDrawArrays而不是使用glBegin / glVertex / glend来获得一些速度。实际上,鉴于你只有四个顶点,这可能不会产生足够的差异来关心。