设为首页
优惠IDC
收藏本站
六狼博客
六狼论坛
开启辅助访问
切换到窄版
用户名
Email
自动登录
找回密码
密码
登录
立即注册
只需一步,快速开始
只需一步,快速开始
快捷导航
门户
首页
BBS
云计算
大数据
手机
移动开发android,ios,windows phone,windows mobile
编程
编程技术java,php,python,delphi,ruby,c,c++
前端
WEB前端htmlcss,javascript,jquery,html5
数据库
数据库开发Access,mysql,oracle,sql server,MongoDB
系统
操作系统windows,linux,unix,os,RedHat,tomcat
架构
项目管理
软件设计,架构设计,面向对象,设计模式,项目管理
企业
服务
运维实战
神马
搜索
搜索
热搜:
php
java
python
ruby
hadoop
sphinx
solr
ios
android
windows
centos
本版
帖子
用户
六狼论坛
»
首页
›
项目管理
›
计算机图形学
›
D3D10/11中的遮挡查询的使用
返回列表
查看:
337
|
回复:
0
D3D10/11中的遮挡查询的使用
[复制链接]
迈克老狼2012
迈克老狼2012
当前离线
积分
474
窥视卡
雷达卡
升级
91.33%
当前用户组为
举人
当前积分为
474
, 升到下一级还需要 26 点。
154
主题
154
主题
154
主题
举人
举人, 积分 474, 距离下一级还需 26 积分
举人, 积分 474, 距离下一级还需 26 积分
积分
474
发消息
楼主
|
发表于 2012-12-30 11:52:17
|
显示全部楼层
|
阅读模式
D3D10/11中的遮挡查询的使用
<div class="postbody"><div id="cnblogs_post_body">
      在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
) );
}
渲染包围盒和望远镜时候,要保持他们渲染的前后顺序
// 渲染望远镜的包围盒
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
->Begin();
        g_OccluderMesh.Render( pd3dDevice, g_pRenderOccluder );
        g_pPredicate
->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
, FALSE );
    }
    g_HeavyMesh.Render( pd3dDevice, g_pRenderTextured, g_pDiffuseTex );
    if( g_bUsePredication )
    {
        pd3dDevice->SetPredication( NULL, FALSE );
    }
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
显身卡
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
浏览过的版块
求职面试
Java
Oracle
Copyright © 2008-2020
六狼论坛
(http://it.6wolf.com) 版权所有 All Rights Reserved.
Powered by
Discuz!
X3.4
京ICP备14020293号-2
本网站内容均收集于互联网,如有问题请联系
QQ:389897944
予以删除
快速回复
返回顶部
返回列表