мультидискретные и фрагментные шейдеры в GLSL 330 - PullRequest
2 голосов
/ 12 января 2012

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

Я установил мультисэмплерный FBO с цветом и буфером рендеринга глубины / трафарета .. отлично

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

Я рисую линию - линия отображается сглаженной .. отлично

Теперь, если в фрагментном шейдере вместо тупого возврата черного цвета я извлекаю texelFetch из текстуры с несколькими выборками, всегда читая образец с номером 0 (то есть черный), я получаю зубчатую линию ..

в чем разница между простым myoutcolor=vec4(0.0) и myoutcolor=texelFetch(mysampler2DMS,...,0)?

В спецификации указывается, что фрагментный шейдер выполняется на уровне выборки, только если он статически использует gl_SampleID, gl_Samplemask[] или имеет квалификаторы хранения «выборки» .. (во всех этих случаях это означает GLSL #version 400 или выше), в противном случае он выполняется на уровне фрагмента ..

но как это может быть? В приведенном выше примере я получил сглаженную линию, даже если я всегда возвращал один и тот же цвет, поэтому я решил, что фрагментный шейдер ВСЕГДА выполнялся на уровне семпла в многосэмплированном кадровом буфере ... с другой стороны, если это не так, я должен получить гладкие результаты, даже если вы возвращаете всегда один и тот же образец из текстуры MS.

Может кто-нибудь помочь мне разобраться?

PS: в настоящее время я использую #version 330, но я обнаружил, что каждый идентификатор оператора, поддерживающий множественную выборку, должен правильно обрабатывать MS (gl_SampleID, gl_Samplemask[], sample ..), поддерживается только в GLSL 400 или выше. Итак, что именно предлагает GLSL 330 для правильной обработки мультисэмплинга? Как я могу обрабатывать текстуры MS в GLSL 330?

1 Ответ

1 голос
/ 24 февраля 2018

в приведенном выше примере, я получил сглаженную линию, даже если я всегда возвращал один и тот же цвет

, потому что вот что такое мультисэмплинг это .

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

...