2010-10-25 2 views
7

Я немного смущен об этом.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? Использование нескольких программ? Как?

ответ

0

Спасибо за ответ,

Но я думаю, что вы просто повторить свои слова ... о методах Draw, об одной программе активно, обо всем.

Неважно.

Дело в том, что ваши слова дают мне представление! Вы сказали: «вам нужно сбросить все атрибуты и указатели вершин».

Ну ... не было точно сброшено, но что я не обновлял ВСЕ вершинные атрибуты в цикле рендеринга, как текстурные координаты. Я обновлял только те атрибуты, которые меняются. И когда я очистил буферы, я потерял старые значения.

Теперь я начинаю обновлять ВСЕ атрибуты, независимо от изменений или не их значения, все работает!

Престол, что я имел в своем распоряжении есть:

glCreateProgram(); 
... 
glAttachShader(); 
glAttachShader(); 
... 
glLinkProgram(); 
glUseProgram(); 
... 
glGetAttribLocation(); 
glVertexAttribPointer(); 
glEnableVertexAttribArray(); 
... 
glDrawElements(); 

Я повторил процесс второй программы, а просто позвонить glVertexAttribPointer() несколько раз.

Теперь у меня есть вызов glVertexAttribPointer() для атрибутов ALL.

Что меня смутило, так это то, что если бы я удалил первый блок кода в первую программу, вся вторая программа работала нормально. Если я удалил второй блок кода во вторую Программу, первая работала нормально.

Теперь кажется настолько очевидным. Конечно, если VSH является операцией per-vertex, она будет работать с нулевым значением, если я не обновляю ВСЕ атрибуты и униформы. Я, хотя о OpenGL больше похожа на 3D-движок, работающий с 3D-объектами, имеет сцену, где вы размещаете объекты, устанавливаете огни. Но не ... OpenGL просто знает о треугольниках, линиях и точках, не более того. Теперь я думаю иначе.

В любом случае, дело в том, что теперь я могу двигаться вперед!

Thanks

+0

Не могли бы вы улучшить свой ответ? Я очень рад, что вы поняли: D – MatterGoal

2

Чтобы нарисовать несколько ячеек, просто вызовите glDrawElements/glDrawArrays несколько раз. Если эти сетки требуют разных шейдеров, просто установите их. ONE, и активна только одна шейдерная программа.

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

Просто так.

Смежные вопросы