Direct3d и hlsl вершин разного размера и многомерных геометрических объектов?

Я новичок в Direct3D, графике, HLSL, C ++, и я пытаюсь написать программу для визуализации различных геометрических многомерных форм (например, гиперкуб), программа должна получать вершины от пользователя после того, как пользователь определил количество размеров, нарисуйте, поверните и переведите форму.

  • Первая проблема заключается в том, как определить динамическую структуру вершин (можно ли использовать указатели).

  • Второе: куда проецировать фигуру из трехмерного в трехмерное пространство, следует ли мне делать это в коде (ЦП) или можно ли передать вершины объекта и матрицы проекции в шейдер (HLSL) и, если да, то как (особенно, что матрицы имеют различный размер, определенный во время выполнения).

  • Та же проблема, что и выше для матрицы вида (скажем, что объект 4-й, я хочу, чтобы программа увеличивала / уменьшала-> приближался, или перемещался в X-направлении в 4-мерном пространстве). Я хочу разобраться с пространство объекта, а не пространство его проекции «)

  • Третье: если все вышеперечисленное было невозможно в шейдере, могу ли я использовать усилитель c ++ (или его альтернативы) для ускорения выполнения таких операций в основной программе или это приведет к снижению производительности для Draw ()? функция.

Я искал в Интернете и «Stackoverflow», но я не мог найти ничего полезного.

1

Решение

Отказ от ответственности: я не эксперт в графических процессорах и шейдерах; и я использовал OpenGL / WebGL / GLSL, а не Direct3D / HLSL. Так что я отвечаю только на этот вопрос, потому что никто другой не имеет. 🙂

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

Но что касается динамических структур данных (переменное число измерений), кажется, что вы могли бы сделать это, просто изменив параметр «size», передаваемый в vertexAttribPointer() или эквивалент Вы передаете плоский массив, содержащий все ваши координаты вершины, с n координатами на вершину; и используйте параметр размера, чтобы сообщить шейдеру, что n.

Затем в вершинном шейдере вы можете проецировать данные из n измерений в 3, используя проекционную матрицу, которую вы строите в шейдере из переданных параметров.

Я думаю, что аналогично, во фрагментном (пиксельном) шейдере вы можете проецировать данные из 3 измерений в 2, используя матрицу представления, которую вы строите в шейдере из переданных параметров.

Надеюсь, это поможет вам начать, и вы сможете задавать более конкретные вопросы. Честно говоря, я не нашел в SO столь продуктивного места для получения ответов на вопросы о графике, как в некоторых других темах, таких как Python. Возможно, вам повезет лучше спросить на веб-сайте, посвященном Direct3D.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]