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