设置每个像素的最快方法

时间:2013-09-07 11:57:08

标签: c++ opengl pixel blit

我用c ++编写了一个小的光线跟踪器,
并希望在窗口中显示光线跟踪图像。

我尝试在pixel buffer object中使用opengl
然后将缓冲区映射到内存中并逐个操作像素,
但在全屏分辨率1920x1080,我只得到4 fps
不使用光线追踪而不更改像素颜色
只是映射和取消映射!

所以我基本上都在寻找在窗口中显示光线追踪图像的最快方法。

我目前正在这样做:

glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pbo);
glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, width * height * 4, 0, GL_STREAM_DRAW_ARB);
if (pixels = (uint*)glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY_ARB))
{
    //modify pixels
    glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB);
}
else
    return;


//copy from pbo to texture
glBindTexture(GL_TEXTURE_2D, pbo_texture);
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pbo);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, 0);

glEnable(GL_TEXTURE_2D);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

//draw image
glColor4f(1.0, 1.0, 1.0, 1.0);
glBindTexture(GL_TEXTURE_2D, pbo_texture);
glBegin(GL_QUADS);
    glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, -1.0, 0.0);
    glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, -1.0, 0.0);
    glTexCoord2f(1.0, 0.0); glVertex3f( 1.0,  1.0, 0.0);
    glTexCoord2f(0.0, 0.0); glVertex3f(-1.0,  1.0, 0.0);
glEnd();

glutSwapBuffers();

glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
glBindTexture(GL_TEXTURE_2D, 0);

1 个答案:

答案 0 :(得分:6)

如果使用循环,请检查内存遍历。您应该以正确的顺序遍历缓冲区,否则您可能在每次迭代时都有缓存未命中。如果使用嵌套循环,有时只需要切换x / y迭代顺序。

另外,请勿从图形内存中读取数据。它往往很慢。只写PBO。

它看起来像一个syncro问题。我不确定你需要在每一帧都映射pbo。在OpenGL Pixel Buffer Object (PBO)上查看此链接。还有一个可以改善事情的摊位的解决方法