OpenGL ES 2.0 несколько программ или несколько шейдеров или что? Как это работает?
проблема (TL;DR)
моя проблема, по сути, заключается в том, что я не знаю, как OpenGL ES 2.0 ожидает, что я буду писать и использовать несколько шейдеров; или если это даже целесообразно/ожидается, что человек сделает это.
основной вопрос здесь: Если у меня есть яблоко, светящийся камень и нечеткая сетка, все в том же 3D-мире, все лучше всего рисуются с помощью разных шейдерных программ, но с использованием одной и той же 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 но, кажется, меня там еще нет.
Edit: я нашел это хорошо потом:
если ваше приложение написано для OpenGL ES 2.0, не создавайте ни одного шейдера с большим количеством переключателей и условных обозначений, который выполняет все задачи, необходимые вашему приложению для визуализации сцены. Вместо этого скомпилируйте несколько шейдерных программ, каждая из которых выполняет определенную, сфокусированную задачу.
то есть с iOS OpenGL ES 2.0 рекомендации.
1 ответ:
вы можете использовать несколько шейдеров, но переключение между ними может быть довольно дорогостоящим, поэтому рекомендуется нарисовать каждый объект шейдера, затем переключиться на следующий шейдер и нарисовать все объекты, используя этот и так далее.
Для переключения между шейдерами необходимо вызватьglUseProgram().
Comments