sRGB FBO рендерится в текстуру - PullRequest
1 голос
/ 27 февраля 2012

В моем рендерере я создаю сглаженную сцену для мультисэмплера FBO, который скрыт от FBO, цветовая привязка которого является текстурой.Текстура затем читается во время рендеринга в кадровый буфер.

Я бы хотел обновить его, чтобы получить гамма-корректные результаты.Преимущество использования кадрового буфера sRGB состоит в том, что он позволяет получить несколько лучшую точность цветопередачи, сохраняя нелинейные значения sRGB непосредственно в кадровом буфере.

В чем я не уверен, так это в том, какие изменения я должен внести, чтобы получить это, и что меняют различные настройки.

Это выглядит как расширение ARB_framebuffer_sRGB просто имеет дело с операциями чтения и смешивания с кадровыми буферами sRGB.В моей ситуации мне нужно будет использовать текстуру, указывающую тип представления sRGB, что означает, что я буду использовать расширение EXT_texture_sRGB ... использование линейного формата текстуры отключит трансляцию sRGB.

Редактировать: Но я только что видел это:

3) Должна ли способность поддерживать обновление и смешивание кадрового буфера sRGB атрибутом кадрового буфера?

РАЗРЕШЕНО:Да.В некоторых пиксельных форматах (в основном, вероятно, только RGB8 и RGBA8) должна быть возможность включения смешивания sRGB.

Это позволяет реализации просто пометить существующие форматы пикселей RGB8 и RGBA8 как поддерживающие смешивание sRGB изатем просто предоставьте функциональность для обновления и смешивания sRGB для таких форматов.

Теперь я не совсем уверен, что указать для формата пикселей моей текстуры.

Хорошо, а как насчетrenderbuffers?документ ARB_framebuffer_sRGB не упоминает ничего о рендербуферах.Можно ли использовать glRenderbufferStorageMultisample с форматом sRGB, чтобы я мог получить смешивание с включенным хранилищем sRGB?

Кроме того, в чем разница между GL_SRGB_ALPHA и GL_SRGB8_ALPHA8 при указании внутреннего формата для glTexImage2D?

1 Ответ

5 голосов
/ 27 февраля 2012

Что я не уверен, так это какие изменения я должен сделать, чтобы получить это

Это потому, что ваш вопрос кажется неуверенным в том, что вы пытаетесь сделать.

Ключом ко всему этому является постоянное знание ваших входных данных и выходных данных.

Ваш первый шаг - узнать, что хранится в каждой из ваших текстур. Сохраняет ли конкретная текстура линейные данные или данные в цветовом пространстве 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 даже имеет форматы некоторых размеров, которые должны поддерживаться явно, как указано .

...