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 Espresso typeText в EditText в ActionBar Невозможно скомпилировать, Невозможно выполнить dex, не может объединиться, не-jumbo инструкция Android Как отредактировать меню панели действий из фрагмента Android автономная документация и коды образцов Мой проект Android продублировал объявления между Enum и string.xml Версия платформы платформы SDK ((23)) слишком старая, чтобы проверять API, скомпилированные с API 23 Как закодировать операцию «синхронизация сейчас» на Android? Цвет фона кнопки Android Как скрыть несколько курсоров при отображении EditText в ListView? ActionbarSherlock – вкладки не реагируют в альбомной ориентации Эмулятор Cordova android перестает работать Использование воспроизведения IntentService для MediaPlayer Android 6.0 требует перезагрузки после предоставления разрешения пользователя во время выполнения RecyclerView item layout_weight, размеры не обновляются Просмотр MATCH_PARENT в представлении WRAP_CONTENT