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 рекомендации.

649   1  

1 ответ:

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

Comments

    Ничего не найдено.