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