GLSL: вершинный шейдер для фрагментного шейдера без изменения

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


person itun    schedule 05.05.2011    source источник
comment
Что вы подразумеваете под этим цветом, который я могу получить только в вершинном шейдере? Обычно в фрагментном шейдере можно использовать значения цвета, созданные вершинным шейдером. Итак, я не уверен, что вы спрашиваете.   -  person Himadri Choudhury    schedule 05.05.2011
comment
Извините, это опечатка.) @DasBoot Обычно вы можете использовать значения цвета во фрагментном шейдере, созданном вершинным шейдером. - Как это сделать? Я имею в виду, как его передать.   -  person itun    schedule 05.05.2011


Ответы (2)


Вот хороший учебник по GLSL: учебник NeHe GLSL

Если вы хотите обмениваться данными между вершинными и фрагментными шейдерами, используйте один из встроенных типов, например gl_Color

Если вы хотите передать цвет, вычисленный вершинным шейдером, через фрагментный шейдер, вы должны создать фрагментный шейдер со следующей строкой: gl_FragColor = gl_Color

gl_Color будет автоматически установлен для вас из цветов, записанных вершинным шейдером. Вы записываете цвет из вершинного шейдера, устанавливая одну из встроенных переменных, например gl_FrontColor, или одну из ее аналогов: gl_BackColor и т. д.

person Himadri Choudhury    schedule 05.05.2011
comment
Я думаю, что это не работает, я не вижу результата, и вершинный шейдер возвращает: предупреждение C7564: присвоение атрибуту gl_Color - person itun; 05.05.2011
comment
Правильно. Должен был упомянуть, что вы должны установить gl_FrontColor (или один из его аналогов, например gl_BackColor) в вершинном шейдере. gl_Color будет автоматически установлен для вас. - person Himadri Choudhury; 05.05.2011

Вы должны использовать переменную, потому что на каждый фрагмент «влияет» более чем одна вершина (если вы не визуализируете GL_POINTS), поэтому вам нужно интерполировать их по линии/многоугольнику. Последние версии GLSL позволяют задавать плоскую интерполяцию затенения, которая не интерполирует значение по всему примитиву, игнорируя значения из других вершин.

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

person UncleZeiv    schedule 11.05.2011