Создание пользовательской сетки в C # под управлением DirectX

Мне нужно создать 3D-сетку DirectX во время выполнения, используя управляемый DirectX из C #. Мне не удалось найти никакой информации о том, как это сделать.

  1. Нет, я не могу использовать программу 3D-моделирования для создания своих объектов. Они должны быть точного размера и формы, и у меня нет НИКАКОЙ информации о размере или форме до выполнения.
  2. Нет, я не могу построить модель из существующих возможностей сетки DirectX. (Простой пример: DirectX позволит вам легко смоделировать карандаш, используя конусную сетку и цилиндрическую сетку. Конечно, вам нужно носить с собой две сетки для вашего карандаша, а не только одну, и правильно расположить и сориентировать каждую. Но вы невозможно даже сделать модель карандаша, разрезанного пополам по длине, поскольку здесь нет ни полуцилиндра, ни полуконуса.)
  3. Во время выполнения у меня уже вычислены все вершины, и я знаю, какие из них нужно соединить, чтобы получить необходимые треугольники.
  4. Все, что мне нужно, это сплошной цвет. Мне не нужна карта текстуры.

С помощью этого вызова DirectX можно получить сетку сферы:
Mesh sphere = Mesh.Sphere(device, sphereRadius, sphereSlices, sphereStacks);
Эта сетка создается во время выполнения.

Что мне нужно знать, так это как сделать аналогичную функцию:
Mesh shape = MakeCustomMesh(device, vertexlist, trianglelist);
где два списка могут быть любым подходящим контейнером / форматом.

Если кто-нибудь может указать мне на пример кода управляемого DirectX (C #), даже если он просто строит сетку из трех жестко запрограммированных треугольников, это будет большим преимуществом.


person Mark T    schedule 14.08.2009    source источник
comment
Спасибо Риду за необходимый старт. Также спасибо Джеффу за редактирование моего вопроса. Не могу поверить, что я дважды написал «удалось неправильно» двумя разными способами. Было явно поздно в пятницу.   -  person Mark T    schedule 17.08.2009


Ответы (1)


Вот пример кода, показывающий, как это сделать, на MDXInfo. Это создает сетку с несколькими подмножествами - если вам это не нужно, это еще проще.

По сути, вы просто создаете сетку:

Mesh mesh = new Mesh(numIndices, numVerticess, MeshFlags.Managed, CustomVertex.PositionColored.Format /* you'll need to set this */ , device); 

Затем вы можете захватить буфер вершин меша и буфер индекса и перезаписать их, используя:

IndexBuffer indices = mesh.IndexBuffer;
VertexBuffer vertices = mesh.VertexBuffer;

Затем соответствующим образом заполните индексы и вершины.

person Reed Copsey    schedule 14.08.2009
comment
Я только что создал сетку, приведенную в вашем примере, но когда я экспортировал ее с помощью метода ToXFile, это не удалось, я думаю, что необходимо предоставить дополнительную информацию для динамически созданной сетки, чтобы ее можно было сохранить как файл x, не могли бы вы пролить немного свет на это? Спасибо. - person zionpi; 01.07.2014