более эффективно писать один сложный шейдер или несколько разных шейдеров? - PullRequest
4 голосов
/ 18 марта 2012

Я только изучаю 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.

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

1 Ответ

2 голосов
/ 18 марта 2012

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

Вы можете скомпилировать все необходимые программы шейдеров один раз и переключить каждый объект для рисования на требуемую программу шейдера:

void Draw(){

    glUseProgram(yourShaderProgram);

    glUniformX(yourUniformVariables);

    glDrawArrays(yourVAO);

}

То, что вы НЕ хотите делать, это загружать и связывать шейдерную программу каждый раз, когда вам это нужно.

Скорее, храните список всех шейдерных программ где-либо или передавайте идентификатор программы каждому объекту, чтобы они могли его использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...