2012-02-01 2 views
2

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

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

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

Любые идеи?

+0

Не могли бы вы предоставить моментальные снимки проблемы и ожидаемый правильный результат? – rotoglup

ответ

3

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

  • Отдельный «один образец» FBO с одинаковыми вложениями, формат и размер (с текстурой или renderbuffer прилагается) к блитированию в течение субдискретизации, а затем сделать/Blit этого окна буфера
  • Вставка в буфер мультисэмпл-окна с мультисэмпльной текстурой, имеющей тот же отсчет, что и вход, путем передачи всех соответствующих выборок на фрагмент с использованием шейдера фрагмента 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) Если Blits быть разрешены между буферами различных битовых размеров?

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

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

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

+0

Звучит, как будто этот формат равен формату пикселя вашего окна, где преобразование цветового формата может быть причиной, о которой вы говорили. У меня RGB16F в RGB8, используя этот фрагмент GLSL, где может быть подразумевается преобразование. Тем не менее, я пока не вижу причины в sRGB, так как это должно быть ошибкой оптимизации драйверов, потому что sRGB имеет выделенные расширения. – Sam

+0

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

+0

Я не утверждаю, что мой ответ верен, до тех пор, пока я сам не знаю точно. Даунсэмплингом с использованием GLSL является скорее неэффективное обходное решение, чем все, что я могу расценивать как «современное состояние». – Sam

Смежные вопросы