OpenGL:绘制2D图像的最快方法

时间:2015-05-27 16:26:44

标签: opengl

我正在编写一个交互式路径跟踪器,我想知道在现代GL中在屏幕上绘制结果的最佳方法是什么。我将渲染的结果存储在每次传递(+1 ssp)时更新的像素缓冲区中。我想在每次传球后在屏幕上画画。我做了一些搜索,人们建议绘制一个纹理四边形来显示2D图像。这是否意味着我每次更新时都会创建一个新纹理?鉴于我的像素经常更新,这仍然是一个好主意吗?

1 个答案:

答案 0 :(得分:8)

每次要更新内容时,无需创建全新的纹理。如果大小保持不变,则可以使用"newStatus"保留存储一次,并将NULL作为最后一个参数。例如。对于具有8位组件精度的512x512 RGBA纹理:

glTexImage2D()

在OpenGL 4.2及更高版本中,您还可以使用:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 512, 512, 0,
             GL_RGBA, GL_UNSIGNED_BYTE, NULL);

然后,您可以使用glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 512, 512); 更新纹理的全部或部分内容。例如,要按照上面的示例更新整个纹理:

glTexSubImage2D()

当然,如果每次只改变纹理的矩形部分,可以通过相应地选择第2到第5个参数来使更新更具选择性。

一旦您的当前数据在纹理中,您可以绘制带纹理的屏幕尺寸四边形,或使用glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 512, 512, GL_RGBA, GL_UNSIGNED_BYTE, data); 将纹理复制到默认的帧缓冲区。您应该能够找到第一个选项的大量示例代码。第二个选项的代码如下所示:

glBlitFramebuffer()