GLSL динамически индексируемые массивы - PullRequest
2 голосов
/ 06 декабря 2010

Я уже некоторое время использую DirectX (с XNA), и недавно перешел на OpenGL. Я действительно люблю это, но одна вещь меня раздражает.

Я пытался реализовать что-то, что требует динамического индексирования в вершинном шейдере, но мне сказали, что это требует эквивалента SM 4.0. Однако я знаю, что это работает в DX даже с SM 2.0, возможно, даже с 1.0. Образец экземпляров XNA использует это для создания экземпляров только на картах SM2.0 http://create.msdn.com/en-US/education/catalog/sample/mesh_instancing.

Компилятор не мог "развернуть" его в гигантский список операторов if, поскольку это наверняка превысит лимит инструкций на SM2 для наших 250 экземпляров.

Так что же, DX делает какую-то хитрость, которую я не могу сделать с OpenGL, могу ли я манипулировать OpenGL, чтобы сделать то же самое, или это аппаратная функция, которую OpenGL не предоставляет?

Ответы [ 2 ]

0 голосов
/ 04 января 2011

Вы можете загрузить массив для ваших световых направлений с помощью чего-то вроде glUniform3fv, а затем (если я понимаю, что вы пытаетесь делать правильно) вам просто нужен ваш формат вершин, чтобы включить индекс в этот массив (так что будет много дублирование этих индексов, если индекс изменяется только один раз на сетку или что-то). Если вы еще не знаете, вы можете использовать glGetAttribLocation + glVertexAttribPointer для отправки произвольных атрибутов вершин, подобных этой, в шейдер (в отличие от использования устаревших встроенных атрибутов, таких как gl_Vertex, gl_Normal и т. Д.).

0 голосов
/ 06 декабря 2010

По вашей ссылке:

Обратите внимание, что не существует единой совершенной техники создания экземпляров.Это должно быть реализовано по-другому в Windows по сравнению с Xbox 360, а в Windows идеальная техника требует шейдера 3.0, но есть и запасной подход, который будет работать с шейдером 2.0 .В этом примере реализовано несколько различных методов создания экземпляров, поэтому он может работать как на платформах, так и на версиях шейдеров.

Не обнадеживающая часть.Поэтому на основе шейдерной модели 3 вы должны иметь возможность выполнять аналогичное создание экземпляров. Создание экземпляров шейдерной модели 2 обычно выполняется с использованием матричной палитры.Это означает, что вы можете визуализировать несколько сеток за один вызов, загрузив множество матриц преобразования за один раз.Это уменьшает количество вызовов отрисовки и повышает скорость.

В любом случае для OpenGL было много проблем с завершением этого расширения, и, следовательно, вам нужен шейдер 4. Однако вы МОЖЕТЕ придерживаться индекса палитры для каждой вершины в структуре вершин yoruи делать рендеринг матричной палитры с помощью шейдера ...

...