基本上,我正在使用由两个三角形和一个片段着色器组成的屏幕大小的矩形来进行某种图像处理,这将完成整个处理工作。实际效果类似于动画,它取决于一个称为current_frame的统一变量。

我对衡量“MPix / s”的性能非常感兴趣。我所做的是这样的:

/* Setup all necessary stuff, including:                 */
/* - getting the location of the `current_frame` uniform */
/* - creating an FBO, adding a color attachment          */
/*   and setting it as the current one                   */

double current_frame = 0;
double step = 1.0f / NUMBER_OF_ITERATIONS;

tic(); /* Start counting the time */

for (i = 0; i < NUMBER_OF_ITERATIONS; i++)
{
    glUniform1f(current_frame_handle, current_frame);
    current_frame += step;
    glDrawArrays(GL_TRIANGLES, 0, NUMBER_OF_INDICES);
    glFinish();
}

double elapsed_time = tac(); /* Get elapsed time in seconds */

/* Calculate achieved pixels per second */
double pps = (OUT_WIDTH * OUT_HEIGHT * NUMBER_OF_ITERATIONS) / elapsed_time;

/* Sanity check by using reading the output into a buffer */
/* using glReadPixels and saving this buffer into a file  */

就理论而言,我的概念有什么问题吗?

另外,我给人的印象是,移动硬件上的glFinish()不一定等待先前的渲染调用,并且可能会进行一些优化。

当然,我总是可以在每次绘制后通过执行glReadPixels()来强制执行此操作,但这会非常慢,因此这实际上并没有帮助。

您能否建议我有关我的测试方案是否合理以及是否还有其他可以做的事情。

最佳答案

关于速度,使用glDrawArrays()仍会复制共享顶点。



http://www.songho.ca/opengl/gl_vertexarray.html

只是把它扔在那里,以帮助加快您的结果。就您的计时概念而言,对我来说,这看起来不错。您得到的结果与您希望的结果相似吗?

09-25 23:19