Моделирование I-секции в библиотеке 3D-графики - PullRequest
2 голосов
/ 27 октября 2008

Я использую Direct3D для отображения количества I-секций, используемых в стальной конструкции. Могут быть сотни экземпляров этих I-секций по всей моей сцене.

Я мог бы сделать это двумя способами:

I-Sections

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

Метод B кажется правильным (и я мог бы сохранить выборку задней поверхности), но в моей модели толщина пластин в I-секции не имеет значения, и я бы хотел избежать создания отдельной треугольной полосы для каждого сторона пластин.

Есть ли лучшее решение? Есть ли способ отключить выборку обратной стороны только для определенных вызовов DrawIndexedPrimitives? Я также хотел бы получить нейтральный ответ на этот вопрос, если таковой имеется.

Ответы [ 4 ]

1 голос
/ 27 октября 2008

Я бы выбрал A, так как расстояние, с которого вы бы видели B, было бы пустой тратой вычислительной мощности, чтобы нарисовать все эти вырожденные треугольники.

Также я бы просто запустил их в z-буфере и позволил бы это все уладить.

Если это будет слишком медленно, я бы начал смотреть на оптимизацию, но даже потребительские видеокарты могут рисовать миллионы полигонов в секунду.

1 голос
/ 27 октября 2008

Во-первых, отбор задних поверхностей не имеет никакого отношения к порядку, в котором объекты отображаются. Кроме этого, я бы пошел к подходу B без особой причины, кроме того, что он, вероятно, будет выглядеть лучше. Также этот объект, вероятно, не более чем рука, полная треугольников; наличие сотен в сцене не должно быть проблемой. Если это так, попробуйте изучить аппаратные экземпляры.

1 голос
/ 27 октября 2008

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

Да, для этого необходимо дублировать данные вершин для всех секций, но именно так D3D9 предназначен для использования.

1 голос
/ 27 октября 2008

В OpenGL вы можете переключать выборку задней грани для каждого нарисованного треугольника:

glEnable(GL_CULL_FACE);
glCullFace(GL_FRONT);
// or
glCullFace(GL_BACK);

Я думаю, что подобное возможно и в Direct3D

...