Рассмотрим следующий код. 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
Конечно, я комментирую цикл for при использовании GL_FRAMEBUFFER_SRGB, что должно быть очевидно из сгенерированного изображения. Ну, так как для меня нет штрафа, кроме небольшого отставания в графическом интерфейсе, я дам GPU быть одному, чтобы сделать фактический трассировка лучей. Спасибо за вашу помощь. – apartridge