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

Directx 如何检测屏幕上看不见的三角形,directx,terrain,Directx,Terrain,我有一个非常简单的地形图与瓷砖!所有的瓷砖大小相同,只是高度不同(z值)! 我可以渲染它们,但有数千个瓷砖,但不是所有的都在屏幕上,只有一部分(在视图前面)!所以我正在做一个批渲染,只收集屏幕上出现的瓷砖,然后在一个调用中渲染它们! 我尝试使用D3DXVec3Project将世界空间上的顶点投影到屏幕空间,然后检测屏幕上的三角形,但是这非常慢,调用此函数可将整个地图的时间缩短到7毫秒(大约250x250次调用) 现在我使用的是iso视图(D3DXMatrixOrthoLH),没有摄像头或眼睛,当

我有一个非常简单的地形图与瓷砖!所有的瓷砖大小相同,只是高度不同(z值)! 我可以渲染它们,但有数千个瓷砖,但不是所有的都在屏幕上,只有一部分(在视图前面)!所以我正在做一个批渲染,只收集屏幕上出现的瓷砖,然后在一个调用中渲染它们! 我尝试使用D3DXVec3Project将世界空间上的顶点投影到屏幕空间,然后检测屏幕上的三角形,但是这非常慢,调用此函数可将整个地图的时间缩短到7毫秒(大约250x250次调用)

现在我使用的是iso视图(D3DXMatrixOrthoLH),没有摄像头或眼睛,当我想在地图周围移动时,我只需要平移世界

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


img:

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

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

  • 平截体剔除-测试相机的平截体(可见体积)和对象(如网格和地形瓷砖)之间的碰撞。无碰撞意味着对象不可见。基于碰撞检测算法。当然,您需要摄影机(视图和投影矩阵)来实现这一点。你还需要一个好的数学库
  • 空间分区(例如:地形中的“四叉树”)-将对象分组到特定的数据结构,这允许避免预先不可能进行的碰撞测试。难以置信地加快了截锥剔除的速度。例如,我们不需要测试相机后面的所有瓷砖
  • 细节级别(LOD)-不同的技术,允许渲染远离摄影机的对象,减少细节,减少资源消耗。允许渲染具有巨大地形的惊人、逼真、详细的场景
现在你知道向谷歌要什么了;),但我还是会添加一些链接

对于初学者:

  • -您可能对最新的、关于地形和碰撞检测的内容感兴趣
高级:

  • -关于地形渲染的无限知识来源(文章、论文、实现链接)
  • 关于渐进网格的论文
希望有帮助()