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

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

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

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

Что я сделал

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

Vertex Shader

uniform mat4 uMVPMatrix; attribute vec4 aPosition; void main() { gl_Position = uMVPMatrix * aPosition; } 

Фрагментный шейдер

 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.

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

Вы можете использовать несколько шейдеров, но переключаться между ними может быть довольно дорогостоящим, поэтому рекомендуется использовать каждый объект шейдера, затем переключиться на следующий шейдер и нарисовать все объекты, используя этот и т. Д.
Для переключения между шейдерами вы вызываете glUseProgram() .