Почему OpenGL осветляет мою сцену при мультисэмплинге с FBO? - PullRequest
2 голосов
/ 02 февраля 2012

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

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

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

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 03 февраля 2012

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

  • Отдельный FBO "одиночного образца" с идентичными вложениями, форматом и размером (с прикрепленной текстурой или рендербуфером), в который нужно вписаться для понижающей дискретизации, а затем нарисовать / разбить это в окнеbuffer
  • Рендеринг в оконный буфер мультисэмпла с текстурой мультисэмпла, имеющей то же количество отсчетов, что и на входе, путем передачи всех соответствующих отсчетов на фрагмент с использованием фрагментного шейдера GLSL.Это работало с включенным затенением сэмплов и является подходом излишнего для отложенного затенения, так как вы можете рассчитывать свет, тень, AO и т. Д. На сэмпл.Мне приходилось выбирать каждый образец отдельно, используя 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.
1 голос
/ 08 февраля 2012

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

Форматы изображений renderbuffer Iнайдены для работы GL_RGBA8 с GL_DEPTH_COMPONENT24.

...