Я только изучаю OpenGL, и я понимаю, что для более сложных эффектов шейдера, в основном, есть две стратегии, которые вы можете использовать для их реализации. Первый заключается в написании одного сложного вершинного и фрагментного шейдера, который принимает множество различных однородных переменных из основной программы и решает, что делать в шейдере. Ex. если я хочу сделать пиксели в одном контексте синим, а в другом контексте зеленым, я могу сделать это в GLSL:
uniform int whichColor;
int main() {
if (whichColor == 1) {
gl_FragColor = vec4(0,1.0,0,1.0);
}
else {
gl_FragColor = vec4(0,0,1.0,1.0);
}
}
и передать различные целочисленные значения элементу COLOR в моем цикле рисования C ++. В качестве альтернативы, я мог бы просто определить две отдельные программы шейдеров, одна из которых устанавливает gl_FragColor на синий, а другая на зеленый, и просто загружать одну или другую, когда мне пора нарисовать определенный объект в моей сцене OpenGL.
Я не могу найти информацию о том, какая из этих стратегий лучше. Я мог бы ожидать, что первая стратегия, включающая всю сложность визуализации на видеокарте, будет более производительной, но в некоторых случаях я думаю о том, что рисовать - это не расчёт на пиксель, а выгоды от распараллеливания Я не очень понимаю, как шейдерные программы работают на видеокарте и какова стоимость связывания и передачи переменных, поэтому я не уверен, что моя интуиция здесь на самом деле верна.