我想知道是否有更快(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();
请注意,像素必须与模板缓冲区进行交互。
答案 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'只是一个初始化为所需颜色的数据块。
<强>速度强>
为了提高执行速度,您可以:
glDrawPixels
类似,但将纹理保留在纹理内存中可以提高速度。glDrawArrays
而不是使用glBegin
/ glVertex
/ glend
来获得一些速度。实际上,鉴于你只有四个顶点,这可能不会产生足够的差异来关心。