OpenGL ES 2.0 Несколько программ или несколько шейдеров что ли? Как это работает?

Проблема (TL; DR)

Моя проблема, по сути, в том, что я не знаю, как OpenGL ES 2.0 ожидает от меня написания и использования нескольких шейдеров; или если это даже желательно / ожидается, что человек это сделает.

Фундаментальный вопрос здесь: если у меня есть яблоко, светящийся камень и нечеткая сетка, все в одном и том же трехмерном мире, все лучше всего нарисовано с помощью разных шейдерных программ, но с использованием одной и той же mvpMatrix, тогда как я могу использовать все из них в одном рендере OpenGL, так что все они используют свои наиболее подходящие шейдеры, которые я написал?

Что я сделал

Итак, я написал базовую программу OpenGL ES 2.0 для моей игры для Android, которая отлично работает в этой он может рисовать контуры объектов на экране. Но больше ничего не делает; в значительной степени потому, что шейдеры выглядят так:

Vertex Shader

uniform mat4 uMVPMatrix;
attribute vec4 aPosition;

void main() {
    gl_Position = uMVPMatrix * aPosition;
}

Fragment Shader

void main() {
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}

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

У меня такое чувство, что это должно быть базовыми знаниями для всех, кто работает с OpenGL ES 2.0 день за днем, поэтому я надеюсь, что кто-нибудь сможет ответить на мой вопрос или указать мне правильное направление.

У меня есть:

  • Просмотрел несколько уроков; ни один из них не использует ничего, кроме самых простых шейдеров.
  • Прочтите всю спецификацию OpenGL ES 2.0 GLSL (ни в одной из которых не упоминалось, как она предназначена для использования; речь шла только о том, что все делает, а не о том, как они сочетаются друг с другом).
  • Пытался немного доработать свои шейдеры.

Итак, я надеюсь, что я близок к пониманию рабочего процесса OpenGL, но, похоже, я еще не добрался до него.

Правка: Впоследствии я нашел это хорошо:

Если ваше приложение написано для OpenGL ES 2.0, не создавайте ни одного шейдера с множеством переключателей и условий, который выполняет все задачи, необходимые вашему приложению для рендеринга сцены. Вместо этого скомпилируйте несколько программ шейдеров, каждая из которых выполняет конкретную конкретную задачу.

Это из рекомендаций iOS OpenGL ES 2.0.

54
задан Robert Massaioli 13 May 2012 в 17:00
поделиться