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.

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

Intereting Posts
Android WebView getContentHeight () всегда возвращает 0 Android: как постоянно и полностью НЕ показывать по умолчанию мягкую клавиатуру для EditText? Использование serviceloader на Android Не удалось загрузить libfoo: findLibrary возвратил null «Android Asset Studio» добавляет дополнительное пространство, когда я загружаю свои значки .png, но не использует его внутренние клики. Зачем? Android Studio 2.0 – плагин слишком стар, обновите его до более поздней версии или установите переменную окружения ANDROID_DAILY_OVERRIDE в Android Back Arrow на панели инструментов (AppCompatActivity) React Native – packager висит на преобразовании (100% 393/394) в демонстрационном приложении (Android) Android: «Путь к проекту должен иметь только один сегмент» Искать все вхождения строки во всем проекте в Android Studio Отправьте файл .apk клиенту для просмотра ArrayAdapter: вы должны указать идентификатор ресурса для текстового просмотра Как заблокировать доступ к моему приложению для совместного использования через Bluetooth? Пользовательские вкладки Chrome и текстовое окно Android: Как создать уведомление из командной строки (эмулятор терминала или сценарий оболочки)?