Что я не уверен, так это какие изменения я должен сделать, чтобы получить это
Это потому, что ваш вопрос кажется неуверенным в том, что вы пытаетесь сделать.
Ключом ко всему этому является постоянное знание ваших входных данных и выходных данных.
Ваш первый шаг - узнать, что хранится в каждой из ваших текстур. Сохраняет ли конкретная текстура линейные данные или данные в цветовом пространстве sRGB? Если он хранит линейные данные, используйте один из форматов линейных изображений. Если в нем хранятся данные цветового пространства sRGB, используйте один из форматов изображений sRGB.
Это гарантирует, что вы выбираете нужные данные в ваших шейдерах. Когда приходит время записывать / смешивать их с кадровым буфером, вам нужно решить, как с этим справиться.
Ваш экран ожидает значения, которые были предварительно скорректированы с учетом гаммы устройства отображения. Таким образом, если вы предоставите линейные значения, вы получите неправильный вывод цвета.
Однако иногда вы хотите записать в промежуточные значения. Например, если вы выполняете прямой или отложенный рендеринг, вы будете записывать накопленное освещение в буфер с плавающей запятой, а затем использовать тональное отображение HDR, чтобы свести его к изображению [0, 1] для отображения. Методы постобработки могут быть снова использованы. Только выходные данные для [0, 1] должны быть изображениями в цветовом пространстве sRGB.
При записи линейных значений RGB, которые вы хотите преобразовать в sRGB, необходимо включить GL_FRAMEBUFFER_SRGB
. Это специальное разрешение (обратите внимание, что текстуры не имеют возможности отключить декодирование sRGB), потому что иногда вы хотите записать значения, которые уже находятся в sRGB. Это часто относится к виджетам интерфейса GUI, которые были разработаны и построены с использованием цветов, уже находящихся в цветовом пространстве sRGB.
Я рассматриваю вопросы, связанные с написанием гамма-корректных значений и чтением их из текстур в моей серии уроков. Первый объясняет, почему гамма важна и явно выполняет гамма-коррекцию в шейдере. Вторая ссылка посвящена использованию изображений sRGB как в текстурах, так и в буферах кадров.
Хорошо, а как насчет рендербуферов? документ ARB_framebuffer_sRGB не упоминает ничего о рендеринге буферов.
И с чего бы это? ARB_framebuffer_sRGB интересует только кадровый буфер и характер изображений в нем. Он не знает и не заботится, откуда взялись эти изображения. Неважно, идет ли речь о кадровом буфере по умолчанию, текстуре, прикрепленной к FBO, рендеринг-буфере, подключенном к FBO, или о чем-то совершенно новом, кто-то придумает завтра.
Расширение указывает, что происходит, когда целевое изображение находится в цветовом пространстве sRGB и когда GL_FRAMEBUFFER_SRGB
включено. Откуда исходит это изображение, зависит только от вас.
Кроме того, в чем разница между GL_SRGB_ALPHA и GL_SRGB8_ALPHA8 при указании внутреннего формата для glTexImage2D?
Один размером. Другой нет. Теоретически, GL_SRGB_ALPHA
может дать вам любую глубину, необходимую для реализации. Это может дать вам 2 бита на компонент. Вы даете свободу реализации выбирать то, что она хочет.
На практике я сомневаюсь, что вы найдете разницу. При этом всегда по возможности использовали внутренние форматы размера. Хорошо быть конкретным в том, что вы хотите, и не допустить, чтобы реализация сделала что-то глупое. OpenGL даже имеет форматы некоторых размеров, которые должны поддерживаться явно, как указано .