原文:D3D10/11中的遮挡查询的使用

      在D3D10/11中,有D3D10_QUERY/D3D11_QUERY接口,通过QUERY接口,我们可以查询GPU的一些状态,比如GPU的时间戳信息(Timestamp)[这个常用来做performance分析],或者遮挡查询信息等等。我们通过directx sdk中的例子来看看在D3D10/11中,如何使用遮挡查询。源文件目录:SDK root\Samples\C++\Direct3D10\DrawPredicated

     首先看看场景中包含哪些物体:6个望远镜(望远镜是高模,mesh数目比较多),望远镜中间有个灯塔形状的物体,再就是立方体表示的城市模型,另外还有还有一个没有显示的物体,就是望远镜的包围盒(低模),当我们勾选了Render Occluders后,就可以看到该包围盒。

     

     

       从D3D11教程管线的介绍中我们知道,当D3D把Draw传给GPU时候,通常要经过Command Processor-Vertex shader-PA(体元装配)-RS(光栅化)-Pixel shader-color buffer,这几个阶段(不考虑GS和 Tessllation)。

      一个三角形,经过一个很长的渲染管线,最终会在屏幕上显示出来,要是像上图中的望远镜一样,它在我们的视野中,还好,如果像下图一样,我们眼前是一堵墙,后面的物体根本看不到,但是这些高模的望远镜,VS和PS还是要做,会消耗很多的GPU时间,如果我们使用遮挡查询预测的功能,对高模的望远镜,给其配备一个贴身的低模包围盒,通过查询包围盒的遮挡情况,如果包围盒在当前帧中,所有采样(在深度测试时候,是以sample为单位,看以看下关于msaa的教程)都z fail,则查询

D3D10_QUERY_OCCLUSION_PREDICATE返回false,如果有任何一个采样z pass则返回true,在返回false的情况下,意味着包围盒在当前帧中,完全不可见,那么包围盒当中的望远镜,当然也是完全不可见,这时在渲染望远镜时,我们可以启动预测功能,就是根据包围盒的的遮挡查询结果来渲染,在gpu硬件层次,在command processor中,它就会丢弃该draw,不会做vs和ps,这样就可以有效的提高FPS。比如下面二图,启用prediction的情况下,FPS是460帧,没有启用的情况下,只有261。

 

 

代码的实现也很简单:

首先要定义预测变量

ID3D10Predicate*                    g_pPredicate[NUM_MICROSCOPE_INSTANCES] = {NULL};

因为场景中有6个望远镜,所以通过一个数组来表示所有预测变量,

在程序初始化时候,会创建这些遮挡查询预测:

// 创建预测

D3D10_QUERY_DESC qdesc;
qdesc.MiscFlags = D3D10_QUERY_MISC_PREDICATEHINT;
qdesc.Query = D3D10_QUERY_OCCLUSION_PREDICATE;
for( int i = 0; i < NUM_MICROSCOPE_INSTANCES; i++ )
{
    V_RETURN( pd3dDevice->CreatePredicate( &qdesc, &g_pPredicate[i] ) );
}

渲染包围盒和望远镜时候,要保持他们渲染的前后顺序

// 渲染望远镜的包围盒

for( int i = 0; i < NUM_MICROSCOPE_INSTANCES; i++ )
{
    D3DXMATRIX mMatRot;
    D3DXMATRIX mWVP;
    D3DXMatrixRotationY( &mMatRot, i * ( D3DX_PI / 3.0f ) );
    mWVP = mMatRot * mWorldViewProj;
    g_pmWorldViewProj->SetMatrix( ( float* )&mWVP );

   // 渲染包围盒mesh,注意被一个预测变量包在中间

    //而且用g_pRenderOccluder渲染时,包围盒并不会在屏幕上显示出来,而是通过alpha blending丢掉的它的渲染结果,但是深度信息会被保存在memory中,以便下面渲染望远镜时候,使用它的z pass信息进行预测。

    if( g_bUsePredication )
    {
        g_pPredicate[i]->Begin();
        g_OccluderMesh.Render( pd3dDevice, g_pRenderOccluder );
        g_pPredicate[i]->End();
    }
}

// 渲染包围盒后再渲染望远镜,注意预测功能开启与关闭的代码。

for( int i = 0; i < NUM_MICROSCOPE_INSTANCES; i++ )
{
    D3DXMATRIX mMatRot;
    D3DXMATRIX mWVP;
    D3DXMatrixRotationY( &mMatRot, i * ( D3DX_PI / 3.0f ) );
    mWVP = mMatRot * mWorldViewProj;
    g_pmWorldViewProj->SetMatrix( ( float* )&mWVP );

    if( g_bUsePredication )
    {
        pd3dDevice->SetPredication( g_pPredicate[i], FALSE );
    }

    g_HeavyMesh.Render( pd3dDevice, g_pRenderTextured, g_pDiffuseTex );

    if( g_bUsePredication )
    {
        pd3dDevice->SetPredication( NULL, FALSE );
    }

D3D10/11中的遮挡查询的使用的更多相关文章

  1. Entity Framework入门教程(11)---EF6中的异步查询和异步保存

    EF6中的异步查询和异步保存 在.NET4.5中介绍了异步操作,异步操作在EF中也很有用,在EF6中我们可以使用DbContext的实例进行异步查询和异步保存. 1.异步查询 下边是一个通过L2E语法 ...

  2. Hibernate-ORM:11.Hibernate中的关联查询

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客将讲述Hibernate中的关联查询,及其级联(cascade)操作,以及指定哪一方维护关联关系的(i ...

  3. 详细讲述MySQL中的子查询操作 (来自脚本之家)

    继续做以下的前期准备工作: 新建一个测试数据库TestDB: ? 1 create database TestDB; 创建测试表table1和table2: ? 1 2 3 4 5 6 7 8 9 1 ...

  4. mysql中的模糊查询

    转载自:http://www.letuknowit.com/archives/90/ MySQL中实现模糊查询有2种方式:一是用LIKE/NOT LIKE,二是用REGEXP/NOT REGEXP(或 ...

  5. 在 SQL Server 数据库的 WHERE 语句中使用子查询

    这是关于子查询语句的一系列文章中的第三篇.在这篇文章中我们将讨论WHERE语句中的子查询语句.其他的文章讨论了其他语句中的子查询语句. 本次课程中的所有例子都是基于Microsoft SQL Serv ...

  6. 对于Oracle中分页排序查询语句执行效率的比较分析

    转自:http://bbs.csdn.net/topics/370033478 对于Oracle中分页排序查询语句执行效率的比较分析 作者:lzgame 在工作中我们经常遇到需要在Oracle中进行分 ...

  7. Mysql中的DQL查询语句

    ----------------1.查询所有列 --查询 学生 表所有记录(行) select *from 学生 --带条件的查询 select *from 学生 where 年龄>19 --- ...

  8. 03-oracle中的高级查询

    1.连接查询 1.1 使用连接谓词指定的连接 介绍: 在连接谓词表示形式中,连接条件由比较运算符在WHERE子句中给出,将这种表示形式称为连接谓词表示形式,连接谓词又称为连接条件. 语法: [< ...

  9. Spring Data JPA中的动态查询 时间日期

    功能:Spring Data JPA中的动态查询 实现日期查询 页面对应的dto类private String modifiedDate; //实体类 @LastModifiedDate protec ...

随机推荐

  1. python基础---内置函数 和 匿名函数 知识点自查填空题

    1.file ---默认是输出到(),如果设置为(),输出到() 2.sep---打印(),默认为() 3.end---每一次打印的结尾,默认为() 4.flush---立即把内容输出到(),不做() ...

  2. angular报错:angular.min.js:118Error: [ng:areq] http://errors.angularjs.org/1.5.8/ng/areq

    报错代码如下: <div ng-controller="HelloAngular"> <p>{{greeting.text}},angular</p& ...

  3. Hadoop Serialization hadoop序列化详解(最新版) (1)【java和hadoop序列化比较和writable接口】

    初学java的人肯定对java序列化记忆犹新.最开始很多人并不会一下子理解序列化的意义所在.这样子是因为很多人还是对java最底层的特性不是特别理解,当你经验丰富,对java理解更加深刻之后,你就会发 ...

  4. bzoj 2503 相框——思路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2503 我也知道应该只关注度数. #include<iostream> #incl ...

  5. Ubuntu中安装gdal python版本

    安装过程: python包是从C++包中编译出来的,所以需要将源码下载进行编译安装 1.GDAL中的矢量数据处理OGR依赖于Geos,在安装GDAL之前要安装Geos Geos的下载地址:http:/ ...

  6. Hackerrank--Prime Sum

    题目链接 The problem is quite simple. You're given a number N and a positive integer K. Tell if N can be ...

  7. C# 基础才是重中之重~对象的生与死

    为何要写 之所以写这篇文章,完全是因为学生们在实际开发中遇到的问题,一个对象占用的内存空间总不被释放,导致系统内存不断攀升,其最主要原因是我们对“对象的生与死”不清楚,或者从来没有认真去考虑过这件事, ...

  8. mybatis深入理解(六)-----MyBatis的二级缓存的设计原理

    MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能.本文将全面分析MyBatis的二级缓存的设计原理. 1.MyBatis的缓存机制整体设计以及 ...

  9. Python中3种内建数据结构:列表、元组和字典

    Python中3种内建数据结构:列表.元组和字典 Python中有3种内建的数据结构:列表.元组和字典.参考简明Python教程 1. 列表 list是处理一组有序项目的数据结构,即你可以在一个列表中 ...

  10. 【arc077f】AtCoder Regular Contest 077 F - SS

    题意 给你一个形如"SS"的串S,以及一个函数\(f(x)\),\(x\)是一个形如"SS"的字符串,\(f(x)\)也是一个形如"SS"的 ...