Несколько сеток OpenGL ES 2.0? (просто примеры из реального мира)

Я немного запутался в этом вопросе.

Все, что я нашел в книгах, блогах, форумах и даже в спецификациях OpenGl, просто говорит об очень абстрактных методах. Ничего о примерах из реального мира.

И я схожу с ума от этого: Как размещать и управлять несколькими объектами (сетками) с OpenGL ES 2.x?

Теоретически кажется простым. У вас есть вершинный шейдер (vsh) и фрагментный шейдер (fsh), затем вы привязываете их к одной программе (glGenProgram, glUseProgram, ...). В каждом цикле рендеринга эта Программа будет выполнять свой VSH для каждой вершины, а после этого будет выполнять FSH для каждого «пикселя» этого трехмерного объекта и, наконец, отправить окончательный результат в буфер (очевидно, без разговоров о каждой вершине, растеризация и другие шаги в конвейере).

Хорошо, кажется простым ... А если у вас есть несколько объектов для рендеринга?

Давайте поговорим о реальном примере. Представьте, что у вас есть пейзаж с деревьями и персонаж. Пейзажная трава имеет одну текстуру, деревья имеют текстуру ствола и листьев (Атлас текстур) и, наконец, персонаж имеет другую текстуру (Атлас текстур) и тоже анимирован.

Представьте себе эту сцену, мой вопрос прост : Как вы это организуете?

Вы создаете отдельную программу (с одним VSH и FSH) для каждого элемента на сцене? Как Программа для травы и рельефа почвы, Программа для деревьев и Программа для персонажа?

Я пробовал, но ... когда я создаю несколько Программ и пытаюсь использовать glVertexAttribPointer (), текстуры и цвета предметов вступают в противоречие друг с другом. Поскольку расположение атрибутов, индексов первой Программы повторяется во второй Программе.

Позвольте мне объяснить, я использовал glGetAttribLocation () в одном классе, который управляет полом сцены, поэтому ядро ​​OpenGL вернулось мне индекс 0,1 и 2 для атрибутов вершин. После этого в классе деревьев я создал другую программу, другие шейдеры, и после того, как снова использовал glGetAttribLocation (), на этот раз ядро ​​OpenGL вернулось с индексами 0, 1, 2 и 3.

После в цикле рендеринга, Я начал устанавливать первую программу с помощью glUseProgram (), и я внес изменения в атрибуты ее вершин с помощью glVertexAttribPointer () и, наконец, вызов glDrawElements (). После этого снова вызовите glUseProgram () для второй программы и снова используйте glVertexAttribPointer () и, наконец, glDrawElements (). Но в этот момент вещи вступают в конфликт, потому что индексы атрибутов вершин второй Программы влияют и на вершины первой Программы.

Я много пробовал, много искал, много спрашивал. .. Я изможден. Я не могу найти, что не так.

Так что я начал думать, что все делаю неправильно!

Теперь я снова повторяю свой вопрос: как работать с несколькими сетками (с разными текстурами и поведением) в OpenGL ES 2.x? Используете несколько программ? Как?

7
задан user464230 25 October 2010 в 18:19
поделиться