考虑以下代码。imageDataf 是一个浮点数*。事实上,正如代码所示,它由光线追踪器创建的 float4 值组成。当然,颜色值在线性空间中,我需要对它们进行伽玛校正以在屏幕上输出。所以我能做的是一个简单的 for 循环,伽马校正为 2.2(参见 for 循环)。此外,我可以使用 GL_FRAMEBUFFER_SRGB_EXT,它几乎可以正常工作,但存在“条带”问题。
左边是使用 GL_FRAMEBUFFER_SRGB_EXT,右边是手动伽玛校正。右图看起来很完美。在某些显示器上发现它可能会有一些困难。有谁知道如何解决这个问题?我想“免费”进行伽玛校正,因为 CPU 版本使 GUI 有点滞后。请注意,实际的光线追踪是在另一个线程中使用 GPU(optix) 完成的,因此实际上它的渲染性能几乎一样快。
GLboolean sRGB = GL_FALSE;
glGetBooleanv( GL_FRAMEBUFFER_SRGB_CAPABLE_EXT, &sRGB );
if (sRGB) {
//glEnable(GL_FRAMEBUFFER_SRGB_EXT);
}
for(int i = 0; i < 768*768*4; i++)
{
imageDataf[i] = (float)powf(imageDataf[i], 1.0f/2.2f);
}
glPixelStorei(GL_UNPACK_ALIGNMENT, 8);
glDrawPixels( static_cast<GLsizei>( buffer_width ), static_cast<GLsizei>( buffer_height ),
GL_RGBA, GL_FLOAT, (GLvoid*)imageDataf);
//glDisable(GL_FRAMEBUFFER_SRGB_EXT);