Почему OpenGL делает мою сцену более светлой при мультисэмплинге с FBO?

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

Однако, когда я включаю мультисэмплинг в буферах рендеринга (через glRenderbufferStorageMultisample), кажется, что каждый цвет в сцене стал ярче (что дает разные цвета, чем часть без мультисэмплинга).

Я подозреваю, что есть какая-то glEnable опция, которую мне нужно установить для сохранения тех же цветов, но я не могу найти упоминания об этой проблеме в другом месте.

Любые идеи?


person Ross Light    schedule 01.02.2012    source источник
comment
Не могли бы вы предоставить снимки проблемы и ожидаемый правильный результат?   -  person rotoglup    schedule 04.02.2012


Ответы (2)


Я наткнулся на ту же проблему из-за отсутствия надлежащей понижающей дискретизации из-за несоответствия местоположений сэмплов. Для меня сработало:

  • Отдельный «единичный образец» FBO с идентичными вложениями, форматом и размером (с прикрепленной текстурой или буфером рендеринга) для преобразования для понижения дискретизации, а затем отрисовки / преобразования его в буфер окна
  • Выполните рендеринг в буфер окна с несколькими сэмплами с текстурой с множеством сэмплов, имеющей то же количество сэмплов, что и вход, путем передачи всех соответствующих сэмплов на фрагмент с помощью шейдера фрагмента GLSL. Это работало с включенным сэмпл-затенением и является излишним подходом для отложенного затенения, поскольку вы можете рассчитывать свет, тень, АО и т. Д. Для каждого сэмпла.
  • Я также сделал довольно неаккуратное ручное понижение дискретизации до кадровых буферов одиночной выборки, используя GLSL, где мне пришлось получать каждую выборку отдельно, используя texelFetch().

С мультисэмплингом дела пошли очень медленно. Хотя CSAA работает лучше, чем MSAA, я рекомендую взглянуть на шейдеры FXAA для постобработки как на значительную альтернативу, когда производительность является проблемой или когда требуются довольно новые расширения, такие как ARB_texture_multisample, недоступны.

Доступ к образцам в GLSL:

vec4 texelDownsampleAvg(sampler2DMS sampler,ivec2 texelCoord,const int sampleCount)
{
    vec4 accum = texelFetch(sampler,texelCoord,0);
    for(int sample = 1; sample < sampleCount; ++sample) {
        accum += texelFetch(sampler,texelCoord,sample);
    }
    return accum / sampleCount;
}

11) Должны ли быть разрешены блит-биты между буферами разного размера бит?

Resolved: Yes, for color buffers only.  Attempting to blit
between depth or stencil buffers of different size generates
INVALID_OPERATION.

13) Как следует указать преобразование цветового пространства BlitFramebuffer? Разрешаем ли мы состоянию ограничения контекста влиять на блит?

Resolved: Blitting to a fixed point buffer always clamps,
blitting to a floating point buffer never clamps.  The context
state is ignored.
person Community    schedule 02.02.2012

Решение, которое сработало для меня, заключалось в изменении цветового формата буфера рендеринга. Я выбрал GL_RGBA32F и GL_DEPTH_COMPONENT32F (полагая, что мне нужна высочайшая точность), и драйверы NVIDIA интерпретируют это по-разному (я подозреваю, что компенсация sRGB, но могу ошибаться).

Форматы изображений буфера рендеринга, которые я обнаружил, работают: GL_RGBA8 с GL_DEPTH_COMPONENT24.

person Ross Light    schedule 08.02.2012
comment
Похоже, что этот формат равен формату пикселей вашего окна, где, как вы заявили, причиной может быть преобразование цветового формата. У меня есть RGB16F в RGB8, используя этот фрагмент GLSL, где может подразумеваться преобразование. Тем не менее, я пока не вижу причину в sRGB, поскольку это должно быть ошибкой оптимизации драйвера, потому что sRGB имеет специальные расширения. - person Sam; 08.02.2012
comment
Тогда я этого не понимал. Ваше решение решает проблему в более общем плане, чем то, что мне было нужно, но это более правильный ответ. - person Ross Light; 08.02.2012
comment
Я не утверждаю, что мой ответ правильный, пока я сам не знаю точной причины. Понижение частоты дискретизации с использованием GLSL - скорее неэффективное решение, чем все, что я мог бы назвать «современным». - person Sam; 08.02.2012
comment
Другая мысль: что происходит с вашими альфа-значениями? Активны ли какие-либо бленды или альфа-тесты / функции? Что произойдет, если вы выполните рендеринг в RGB32F с множественной выборкой или отключите эти тесты? Я попробую как можно скорее. - person Sam; 09.02.2012