請考慮以下代碼。 imageDataf是一個float *。事實上,如代碼所示,它由由光線追蹤器創建的float4值組成。當然,顏色值是線性空間,我需要它們伽馬校正屏幕上的輸出。 所以我可以做的是一個簡單的循環與伽瑪校正2.2(見循環)。另外,我可以使用GL_FRAMEBUFFER_SRGB_EXT,它的工作原理幾乎相同,但具有「帶狀」問題。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);
+1:很好的答案 – radical7
當然,我使用GL_FRAMEBUFFER_SRGB註釋掉for循環,這應該從生成的圖像中明顯看出。那麼,因爲除了圖形用戶界面稍微滯後之外,我不會因此受到任何處罰,因此我將讓GPU獨自進行實際的光線追蹤。謝謝你的幫助。 – apartridge