如何防止透支?

时间:2010-05-18 10:46:52

标签: algorithm graphics rendering

这是一个难以在Google中搜索的问题,因为它在财务方面具有其他含义。

当然,我在这里的意思是“绘图”,如计算机图形学..而不是金钱..

我有兴趣防止3D绘图和2D绘图的过度绘制 (我应该把它们分成两个不同的问题吗?)

我意识到这可能是一个非常广泛的问题,因为我没有指定使用哪种技术。如果它太宽泛,也许我可以阅读一些资源的一些提示就可以了。

编辑:
透支的意思是:

  • 当您绘制太多对象时,渲染单帧将非常慢
  • 当你绘制的区域超出你需要的面积时,渲染单个框架会非常慢

3 个答案:

答案 0 :(得分:5)

这是一个相当复杂的话题。

首先要考虑的是frustum culling。它将过滤掉不在摄像机视野范围内的物体,这样您就可以在渲染阶段传递它们。

第二件事是对相机中物体进行Z排序。最好从前到后渲染它们,这样近处的物体会将“近似值”写入深度缓冲区,而远处物体的像素将不会被绘制,因为它们不会通过深度测试。这将节省GPU的填充率和像素着色器工作。但请注意,如果场景中有半透明对象,则应首先按顺序绘制它们,以便进行alpha混合。

如果您使用某种空间分区,例如OctreeQuadtree,这两件事都可以实现。哪个更好取决于你的游戏。 Quadtree适用于大型开放空间,而Octree适用于多层次的室内空间。

不要忘记简单的back-face culling可以在DirectX和OpenGL中使用单行启用,以防止绘制看到相机背面的面部。

答案 1 :(得分:5)

问题实在太宽泛了:o)查看这些“指针”并更具体地询问。

典型的过度抽取抑制剂是:

  • Z缓冲
  • 基于遮挡的技术(各种缓冲技术,硬件遮挡,......)
  • 模板测试

稍微高一点的逻辑电平:

  • 剔除(通常是视锥体)
  • 场景组织技术(通常是树木或平铺)
  • 从前到后粗略绘制(这显然是支持技术:o)
编辑:添加模板测试,确实有趣的透支防止用途,特别是在2d / 3d的组合。

答案 2 :(得分:2)

根据距离和位置减少您考虑绘制的对象数量(即拒绝观看截头体外的那些对象)。

还要考虑使用某种基于对象的遮挡系统来允许大型物体遮挡小物体。然而,除非你有很多具有相当规则形状的大型物体,否则这可能不值得。在某些情况下,您可以预处理静态对象的潜在可见集。

您的API通常会拒绝不面向视点的多边形,因为您通常不想绘制背面。

说到实际渲染时间,从前到后渲染不透明对象通常很有帮助,因此深度缓冲测试最终会拒绝整个多边形。如果你打开了深度缓冲,这也适用于2D。

请记住,这是性能优化问题。大多数应用程序不会出现重大问题。在您花费资源修复问题之前,请使用PixNVIDIA PerfHUD等工具来衡量您的问题。