c++ - 设置每个像素的最快方法

标签 c++ opengl pixel blit

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

我尝试在 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);

最佳答案

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

此外,不要从显存中读取数据。它往往很慢。只写给 PBO。

这看起来像是一个同步问题。我不确定您是否需要在每一帧都映射 pbo。在 OpenGL Pixel Buffer Object (PBO) 上查看此链接.还有一个可以改善问题的摊位解决方法

关于c++ - 设置每个像素的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18673040/

相关文章:

c++ - 为什么编译器不提示将 char 添加到 char*?

c++ - 在 C++ 中回调类成员

opengl - glGenBuffers() 因段错误而崩溃。 (C++/GLFW/GLEW)

c++ - Opengl GL_QUADS 产生错误 0x506

unity-game-engine - Unity 3D - 具有相同物理尺寸的 Sprite

c++ - 将输入字符串转换为 float / double C++

c++ - 在保持纵横比的 openGL 中调整圆圈的大小

java - 读入 Bufferedimage 像素值,然后操作每个像素值并写入文件

python - 使用 Imagemagick 查找相似颜色的区域

c++ - 通过 std::bind 传递右值