реализация 2D графа сцены opengles 2.0 - PullRequest
2 голосов
/ 02 сентября 2011

Я хочу создать движок 2d opengles для использования в моих приложениях. Этот движок должен поддерживать граф сцены. Каждый узел графа может иметь свой собственный шейдер, текстуру, материал и матрицу преобразования в соответствии со своим родительским узлом. Но я новичок в opengles 2.0, и поэтому у меня есть несколько вопросов:

  1. Как работает умножение матриц в opengles 2.0? Является ли это хорошим подходом для рисования первого родителя, а затем дочерних узлов (это даст некоторую оптимизацию при умножении матриц вида модели). Где происходит умножение матриц? Должен ли я сделать это на процессоре или на GPU.
  2. Лучше ли рисовать узлы в соответствии с используемым шейдером, чем для текстуры и материала? Как мне реализовать преобразования графа сцены в этом случае (на CPU или GPU и как)?

1 Ответ

4 голосов
/ 02 сентября 2011

Как работает умножение матриц в opengles 2.0? Является ли это хорошим подходом для рисования первого родителя, а затем дочерних узлов (это даст некоторую оптимизацию при умножении матриц вида модели). Где происходит умножение матриц? Должен ли я сделать это на процессоре или на GPU.

За исключением некоторых древних машин SGI, умножение матрицы преобразования всегда происходило на процессоре. Хотя возможно умножение матриц в шейдере, это не должно использоваться для реализации иерархии преобразований. Вы должны использовать или реализовать небольшую библиотеку линейной алгебры. Если он предназначен для однородных преобразований 4x4, которые используются в трехмерной графике, он может быть реализован в менее чем 1 000 строк кода C.

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

Лучше ли рисовать узлы в соответствии с используемым шейдером, чем для текстуры и материала? Как мне реализовать преобразования графа сцены в этом случае (на CPU или GPU и как)?

Обычно каждый использует двухэтапный подход к визуализации. На первом этапе вы собираете всю информацию о том, какие объекты для рисования и входные данные рисования (шейдеры, текстуры, матрицы преобразования) и помещаете ее в список. Затем вы сортируете этот список по некоторым критериям. Каждый хочет минимизировать общую стоимость изменений состояния.

Самый дорогой вид изменения состояния - это переключение текстур, поскольку это делает кэши недействительными. Обмен текстур между единицами текстурирования имеет определенную стоимость, но все же дешевле, чем переключение шейдеров, что делает недействительным состояние предиктора пути выполнения. Однако изменение униформных данных очень дешево, поэтому не стоит слишком часто менять форму. Так что, если вы можете сделать существенные настройки через униформу, сделайте это так. Однако вы должны знать, что у условного кода в шейдерах есть производительность, поэтому вы должны сбалансировать стоимость переключения шейдеров со стоимостью условного кода шейдера.

...