Я новичок в Direct3D, графике, HLSL, C ++, и я пытаюсь написать программу для визуализации различных геометрических многомерных форм (например, гиперкуб), программа должна получать вершины от пользователя после того, как пользователь определил количество размеров, нарисуйте, поверните и переведите форму.
Первая проблема заключается в том, как определить динамическую структуру вершин (можно ли использовать указатели).
Второе: куда проецировать фигуру из трехмерного в трехмерное пространство, следует ли мне делать это в коде (ЦП) или можно ли передать вершины объекта и матрицы проекции в шейдер (HLSL) и, если да, то как (особенно, что матрицы имеют различный размер, определенный во время выполнения).
Та же проблема, что и выше для матрицы вида (скажем, что объект 4-й, я хочу, чтобы программа увеличивала / уменьшала-> приближался, или перемещался в X-направлении в 4-мерном пространстве). Я хочу разобраться с пространство объекта, а не пространство его проекции «)
Третье: если все вышеперечисленное было невозможно в шейдере, могу ли я использовать усилитель c ++ (или его альтернативы) для ускорения выполнения таких операций в основной программе или это приведет к снижению производительности для Draw ()? функция.
Я искал в Интернете и «Stackoverflow», но я не мог найти ничего полезного.
Отказ от ответственности: я не эксперт в графических процессорах и шейдерах; и я использовал OpenGL / WebGL / GLSL, а не Direct3D / HLSL. Так что я отвечаю только на этот вопрос, потому что никто другой не имеет. 🙂
Что касается указателей: я почти уверен, что вы не можете использовать указатели в графическом процессоре, поскольку данные, которые вы отправляете в графический процессор, будут иметь непредсказуемые адреса (местоположения) в памяти графического процессора.
Но что касается динамических структур данных (переменное число измерений), кажется, что вы могли бы сделать это, просто изменив параметр «size», передаваемый в vertexAttribPointer()
или эквивалент Вы передаете плоский массив, содержащий все ваши координаты вершины, с n координатами на вершину; и используйте параметр размера, чтобы сообщить шейдеру, что n.
Затем в вершинном шейдере вы можете проецировать данные из n измерений в 3, используя проекционную матрицу, которую вы строите в шейдере из переданных параметров.
Я думаю, что аналогично, во фрагментном (пиксельном) шейдере вы можете проецировать данные из 3 измерений в 2, используя матрицу представления, которую вы строите в шейдере из переданных параметров.
Надеюсь, это поможет вам начать, и вы сможете задавать более конкретные вопросы. Честно говоря, я не нашел в SO столь продуктивного места для получения ответов на вопросы о графике, как в некоторых других темах, таких как Python. Возможно, вам повезет лучше спросить на веб-сайте, посвященном Direct3D.
Других решений пока нет …