如何在屏幕上检测看不见的三角形

时间:2013-11-30 14:01:27

标签: directx terrain

我有一个非常简单的瓷砖地形图!所有瓷砖都是相同的尺寸,只是不同的高度(z值)! 我可以渲染它们,但是有成千上万的瓷砖,但并非所有瓷砖都在屏幕上,只有一部分(在视​​图之前)!所以我正在进行批量渲染,只收集屏幕上显示的图块,然后在1次调用中渲染它们! 我尝试使用D3DXVec3Project将世界空间的顶点投影到屏幕空间,然后检测屏幕上的哪个三角形,但这非常慢,将整个地图调用为7ms(约250x250次调用)。

现在我正在使用iso视图(D3DXMatrixOrthoLH),没有相机或眼睛,当我想移动地图时,我只是翻译世界!

我认为这是一个非常普遍的问题,所有引擎都必须面对优化,但我无法搜索它!是可见的检测,剔除还是剪裁......? 谢谢!我应该只是渲染屏幕上的所有图块,让DirectX自动剪辑吗? (如果我记得很清楚,上次我尝试渲染它们时,它仍然很慢)

img:http://i1335.photobucket.com/albums/w666/greenpig83/terrain2_zps24b77283.png

1 个答案:

答案 0 :(得分:0)

是的,在复杂场景中,通常我们必须剔除不可见的几何体以实现交互式帧速率。当然,这在很大程度上取决于场景本身,API的功能和目标硬件。

以下是良好地形渲染器的第一步(按复杂程度排列):

  • Frustum剔除 - 测试相机的平截头体(可见体积)与物体(如网格和地形砖)之间的碰撞。没有碰撞意味着对象是不可见的。基于碰撞检测算法。当然,你需要相机(视图和投影矩阵)。你还需要一个好的数学库。
  • 空间分区(例如:在地形的情况下为“四叉树”) - 将对象分组到特定的数据结构,这允许避免事先已知的冲突测试。令人难以置信的加速截头剔除。例如,我们不需要测试相机后面的所有瓷砖。
  • 细节级别(LOD) - 允许远离相机的渲染对象不太详细,减少资源消耗的不同技术。允许渲染令人惊叹,逼真,详细的场景和巨大的地形。

现在你知道要问谷歌了什么;),但我仍然会添加一些链接。

初学者:

高级:

  • vterrain.org - 关于地形渲染的无限知识来源(文章,论文,实施链接)
  • Mr. Hoppe's关于渐进网格的论文

希望有帮助=)