zoukankan      html  css  js  c++  java
  • 10. 深度测试

    使用诸如Direct3D这样的渲染API在屏幕上渲染图形时,就会碰到所谓的“透支”(指的是渲染全景造成的内存浪费)问题。当在屏幕上绘制交迭(重爹)的两个或多个图元时,就会出现透支。这些图元有不同的位置,但在屏幕上渲染时,它们交迭在一起。因为Direct3D不知道要绘制的图元的先后顺序,所以会出现透支问题。Direct3D不仅不知道是哪个图元遮住了哪个图元,而且还不知道是哪个图元部分遮住了其他物体。

           解决透支问题的一个办法是使用一种名为“深度缓存或z缓存”的缓存。深度缓存是一个后台缓存,它类似于OpenGL和Direct3D这样的API渲染,存储场景深度信息。当绘制图元时,将物体的深度信息和深度缓存中的内容加以比较,对构成图元的每个像素都加以比较。如果物体靠近摄象机,就更新深度缓存和颜色缓存等内容。如果物体距离观察人员的位置要比已经渲染在屏幕上的内容远,那么就抛弃那些不可见的像素。

           图形硬件并不总包含深度缓存,所以像二叉空间分割(BSP:Binary Space Partitioning)树这样的内容对于开发3D游戏就非常重要。现在并不需要使用BSP树渲染场景。因为图形硬件的运行速度十分快,因为深度缓存成为最佳选择,所以像过去那样使用BSP树只会降低速度。深度缓存运行在GPU硬件上,而不是CPU上。为了在Direct3D中启动深度缓存,可以设置如程序清单1.26所示的渲染状态。

    g_D3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);

     无疑,使用深度缓存会比什么都不使用要慢的多。但是,如果想要使用硬件正确的渲染场景。那么就要使用深度缓存。因为深度缓存的速度成本十分小,所以没必要在开发的程序中都使用深度缓存。通过简单的一行代码就可以在Direct3D中使用深度缓存。本书稍后将介绍BSP树的创建和使用,以及用它来存储场景信息。使用BSP树只是为了起到指导作用,在最终的游戏中使用的并不是它。当前,BSP树对碰撞检测非常有用,但对渲染却并非如此。如果想在渲染时使用这些BSP树,那么就要使用其他技术加快计算,直到只使用BSP树可以从中受益为止。本书稍将详细介绍这方面的内容。
  • 相关阅读:
    [转载]oracle中的exists 和not exists 用法详解
    oracle中sql语句的优化(转帖)
    BizTalk Server 2010 使用 WCF Service [ 上篇 ]
    冒泡排序
    一起复习几何(4)
    手把手教你升级到 Mysql 5.5
    BizTalk Server 2010 映射器(Mapper) [ 上篇 ]
    基于OpenGL的渲染引擎
    BizTalk Server 2010 映射器(Mapper) [ 下篇 ]
    BizTalk Server 2010 映射器(Mapper) [ 中篇 ]
  • 原文地址:https://www.cnblogs.com/kex1n/p/2145955.html
Copyright © 2011-2022 走看看