Проблема (TL; DR)
По сути, моя проблема в том, что я не знаю, как OpenGL ES 2.0 ожидает от меня написания и использования нескольких шейдеров; или если это даже желательно / ожидается, что человек сделает это.
Фундаментальный вопрос здесь: если у меня есть яблоко, светящийся камень и нечеткая сетка, все в одном и том же трехмерном мире, лучше всего нарисованные с помощью различных шейдерных программ, но с использованием одной и той же mvpMatrix, то как бы я использовал все из них в том же OpenGL рендере, что все они используют свои наиболее подходящие шейдеры, которые я написал?
Что я сделал
Итак, я написал базовую программу OpenGL ES 2.0 для моей игры для Android, которая прекрасно работает, поскольку позволяет рисовать контуры объектов на экране. Но это ничего не делает; в значительной степени потому, что шейдеры выглядят так:
Вершинный шейдер
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.