Я немного смущен об этом.OpenGL ES 2.0 с несколькими сетками? (только примеры реального мира)
Все, что я нашел в книгах, блогах, форумах и даже в спецификациях OpenGl, просто говорит об очень абстрактных методах. Ничего о реальных примерах мира.
И я с ума схожу с этим: как положить и управлять несколькими объектами (сетками) с помощью OpenGL ES 2.x?
В теории кажется простым. У вас есть шейдер вершин (vsh) и шейдер фрагмента (fsh), затем вы привязываете обе программы к одной программе (glGenProgram, glUseProgram, ...). В каждом цикле рендеринга эта программа будет выполнять VSH каждой вершиной и после этого будет выполнять FSH на каждом «пикселе» этого 3D-объекта и, наконец, отправить окончательный результат в буфер (очевидно, без разговора о per-vertex, растрирование и другие шаги в конвейере).
ОК, кажется, просто ...
Все это вызывается при вызове функции вытяжки (glDrawArrays или glDrawElements).
OK еще раз.
Теперь вещи меня смущают. И если у вас есть несколько объектов для рендеринга?
Давайте поговорим о примере реального мира. Представьте, что у вас есть пейзаж с деревьями и персонажем. Трава ландшафта имеет одну текстуру, деревья имеют текстуру для ствола и листьев (Texture Atlas), и, наконец, у персонажа есть другая текстура (Texture Atlas) и анимируется.
Представьте себе эту сцену, мой вопрос прост: Как вы это организуете?
Вы создаете отдельную программу (с одним VSH и FSH) для каждого элемента на сцене? Как Программа для облегчения травы и почвы, Программа для деревьев и Программа для персонажа?
Я пробовал, но ... когда я создаю несколько программ и пытаюсь использовать glVertexAttribPointer(), текстуры и цвета объектов вступают в конфликты друг с другом. Поскольку расположение атрибутов, индексов первой программы повторяется во второй программе.
Позвольте мне объяснить, я использовал glGetAttribLocation() в одном классе, который управляет полом сцены, поэтому ядро OpenGL вернул мне индекс 0,1 и 2 для атрибутов вершин. После того, как в классе деревьев я создал другую программу, другие шейдеры, а после использования glGetAttribLocation() в это время возвращается ядро OpenGL с индексами 0, 1, 2 и 3.
После этого в рендеринге цикл, я начал настройку первой программы с помощью glUseProgram(), и я внес изменения в ее атрибуты вершин с помощью glVertexAttribPointer() и, наконец, вызов glDrawElements(). После этого снова вызовите glUseProgram() во вторую программу и снова используйте glVertexAttribPointer() и, наконец, glDrawElements(). Но в этот момент вещи входят в конфликты, потому что индексы атрибутов вершин второй программы также влияют на вершины первой Программы.
Я пробовал много вещей, искал много, много просил ... Я измучен. Я не могу найти, что не так.
Так что я начал думать, что я делаю все неправильно!
Теперь я снова повторяю свой вопрос: как работать с несколькими сетками (с разными текстурами и поведением) в OpenGL ES 2.x? Использование нескольких программ? Как?
Не могли бы вы улучшить свой ответ? Я очень рад, что вы поняли: D – MatterGoal