2008-10-27 52 views
2

我正在使用Direct3D显示钢结构中使用的多个I部分。在我的场景中,可能会有数百个这些I部分的实例。建模三维图形库中的I部分

我能做到这一点有两种方法:

I-Sections http://vulcan.eager.googlepages.com/i-section.png

使用方法A,我有较少的表面。但是,在打开背面剔除后,只能从一面看到表面。如果背面剔除被关闭,则凸缘(水平板)和腹板(垂直板)可能以错误的顺序呈现。

方法B似乎是正确的(我可以保持背面剔除功能打开),但在我的模型中,I部分的板厚并不重要,我希望避免必须创建单独的三角形条板的每一侧。

有没有更好的解决方案?有没有办法只关闭DrawIndexedPrimitives的某些调用来关闭背面剔除?如果有的话,我也想要一个平台中立的答案。

回答

1

首先,背面剔除不有什么做与呈现对象的顺序。除此之外,除了它可能会更好看以外,我没有特别的理由去采用方法B.此外,这个对象可能不过是一个充满三角形的手;在场景中有数百个应该不是问题。如果是,请尝试查看硬件实例。

1

在OpenGL中,你可以剔除每个三角形切换背面的你画:

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

我想类似的东西,也可以在Direct3D

+0

请注意,为每个三角形分别启用和禁用背面剔除将是一个巨大的性能损失,因为它是一个服务器端状态。 – 2008-10-27 09:16:31

1

如果您的I部分不会经常更改,请将所有部分加载到一个大顶点/索引缓冲区中,并通过一次调用绘制它们。这是绘制事物最高效的方法,即使你向其中推送五十万个三角形,图形卡也能快速完成工作。

是的,这需要您复制所有部分的顶点数据,但这就是D3D9打算使用的方式。

1

我会和A一起走,因为你会看到B的距离会浪费处理能力来绘制所有这些退化的三角形。

另外,我只是简单地在一个z缓冲区中解雇他们,并允许将其全部排序。

如果速度太慢,我会开始寻求优化,但即使是消费级显卡也可以每秒绘制数百万个多边形。