Проблема (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.