Подтвердить что ты не робот

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.

4b9b3361

Ответ 1

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