我正在使用Direct3D来显示钢结构中使用的许多I形截面。我的场景中可能有数百个I-section实例。

我可以这两种方式:

使用方法A,我的表面更少。但是,打开背面剔除后,只能从一侧看到表面。如果关闭背面剔除,则可能会以错误的顺序渲染法兰(水平板)和腹板(垂直板)。

方法B似乎是正确的(并且我可以保持背面剔除),但在我的模型中,I剖面中的印版厚度并不重要,我想避免为每个创建一个单独的三角形条带板块的一面。

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

有帮助吗?

解决方案

首先,背面剔除与渲染对象的顺序无关。除此之外,除了它可能看起来更好之外,我会选择B而不是特别的原因。此物也可能不过是一个装满三角形的手;在场景中有数百个应该不是问题。如果是,请尝试查看硬件实例。

其他提示

在OpenGL中,您可以为您绘制的每个三角形切换背面剔除:

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

我认为在Direct3D中也可能有类似的东西

如果您的I-sections不经常更改,请将所有部分加载到一个大的顶点/索引缓冲区中,并通过一次调用绘制它们。这是绘制内容最高效的方式,即使你向它推出了50万个三角形,显卡也能快速完成。

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

我会选择A,因为你看到B的距离会浪费处理能力来绘制所有那些退化的三角形。

此外,我只需在z缓冲区中触发它们,然后将其全部排序。

如果它变得太慢,我会开始考虑优化,但即使是消费者的显卡也可以每秒绘制数百万个多边形。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top