我目前正在开发自己的3D引擎,它在几何渲染方面的能力非常有限,我想扩展它。我感兴趣的是如何在存储几何对象和绘制它们方面做到这一点。
现在,我的抽象仅支持将几何体渲染为三角形的通用列表(在Direct3D术语中为D3DPT_TRIANGLELIST
)。还有其他几种表示对象的方法 - 例如三角形条(D3DPT_TRIANGLESTRIP
)或三角形扇形(D3DPT_TRIANGLEFAN
)。
我的问题是 - 它们是否在现代3D引擎中绘制几何图形时实际使用?
他们的使用如何受益并且他们以某种方式适合游戏创建管道?
(我的意思是,艺术家可以开发他们的模型,以便他们使用这些strips
/ fans
技术吗?)
答案 0 :(得分:5)
三角形条带非常常见,因为它们可以比三角形列表更有效地表示曲面。此外,您可以将视觉上分开的三角形条带拼接在一起,以便将整个不相交的几何体渲染为单个条带。您可以通过复制第一个条带的最后一个顶点和第二个条带的第一个顶点来完成此操作,从而创建两个退化三角形来桥接间隙但不渲染。
粉丝并不常见。它们可以方便地绘制凸多边形,但即使是那些通常也可以用条带有效地完成。
答案 1 :(得分:4)
还有其他几种方式 代表对象 - 例如 三角形条(D3DPT_TRIANGLESTRIP) 或三角扇(D3DPT_TRIANGLEFAN)。
我的问题是 - 他们实际上是 在现代绘制几何时使用 3d引擎?
TriangleStrip
经常用于地形渲染或其他类型的网格,其中包含重启条带索引(0xFFFF或0xFFFFFFFF)或退化条带。它们在每个索引存储的三角形方面提供最佳比率。如果你有优秀的顶点缓存优化网格,它们将完全统治世界。
TriangleFan
,但已从D3D10和D3D11中删除。我的建议,避免使用它们。它们之所以不再好,是因为它们在属性插值方面做得很糟糕(例如texcoord或normals),因为你可以用它们做很细长的三角形。
你可以说你也可以用条带或三角形列表来做,当然是,但实际上做粉丝的能力导致不友好(人工智能)网格。通过从D3D中删除它,内容创建工具可能会输出细分,以避免具有锐角的长度三角形。
长而细的三角形也很糟糕(性能明智),因为它在光栅化过程中会生成次优的四段片段(参见优秀的Humus post on triangulation)。
当然,如果您正在编写高性能/高质量的渲染引擎,这个建议适用,如果您正在做爱好代码,您可能不想那么多。
答案 2 :(得分:2)
好处是它们减少了必须传输到渲染引擎的数据量。要在列表中发送N
个三角形,需要指定3*N
个点;如果它们可以表示为条带或扇形,那么您只需要指定N+2
点