(原)DirectX11 深度测试(有点另类)
(问到自己清楚就可)
@Author: 白袍小道
@说明:转载随缘,评论随缘,询问建议看书和源码会得到更准确的答案


深度测试的来源、目的、做法
一、问题询问
我们带着一些问题去浏览一番
1、深度测试发生在光栅化阶段后?
(这里先补充一下先后:模版测试 --->深度测试---->混合状态)
2、深度测试用来做什么?
3、怎么做?
二、说明询问
2.1、深度测试如果说目的最直接的是:

2.2、深度缓冲区:
深度缓冲区,也称为z-buffer,是Direct3D中用来存储绘制到屏幕上的每个像素点的深度信息的一块内存缓冲区,是一个只含有特定像素深度信息而不含图像数据的表面,深度缓存为最终绘制的图像中的每一个像素都保留了一个深度值.
(关键字:屏幕上的每个像素点,深度信息,内存缓冲区)
|
a.1 |
缓冲区直接在GPU上操作,物美价廉,相对而言是一种直接和容易扩展的方式。 |
|
a.2 |
可稍微调整解决其他问题,同时又兼顾了很多 |
|
a.3 |
DirectX处理上是采取状态机模式 |
(程序关注数据,然后算法,解脱了)(调整就是有一定可操作程度,看上图若半透明在遮挡中间就可以调整下测试,说白了也就是调整了相关结构)
2.3、 那这个正确的标准是什么,怎么判断。
Stencil Settings
|
1. StencilEnable: |
Specify true to enable the stencil test; specify false to disable it. |
|
2. StencilReadMask: |
The StencilReadMask used in the stencil test: |
(API说明)
if(StencilRef & StencilReadMask ⊴ Value & StencilReadMask)
accept pixel
else
reject pixel
这样就很清晰说明是一个比较,比较什么?
注意:
操作: 比较了当前和之前,这缓存不就出来了,再确定是否更新。
值: 深度值是由视矩阵和投影矩阵,结果就是位置在(近裁剪,远裁剪)的范围映射到(0,1)
注:函数可以看API
(,这是两个操作)
(当然也可以利用这个缓存做些其他事情这是果,如同C++ template定出来,也不知道后面发生的事情,嘻嘻)
- 4 结构和操作
说明:关注的不是步骤顺序,因为你也可以跳过。而是输入和输出,结构
清理、创建、分配、更新、
//创建
HRESULT ID3D11Device::CreateDepthStencilState
(
const D3D11_DEPTH_STENCIL_DESC *pDepthStencilDesc, // [In]深度/模板状态描述
ID3D11DepthStencilState **ppDepthStencilState // [Out]输出深度/模板状态
);
///分配
void ID3D11DeviceContext::OMSetDepthStencilState
(
|
ID3D11DepthStencilState *pDepthStencilState, |
// [In]深度/模板状态,使用nullptr的话则是默认深度/模板状态 |
|
UINT StencilRef |
// [In]提供的模板值 |
);
///如果要恢复到默认状况,可以这样调用
md3dImmediateContext->OMSetDepthStencilState(nullptr, 0);
|
4.1 |
清理深度模板视图 |
void ID3D11DeviceContext::ClearDepthStencilView
(
|
ID3D11DepthStencilView *pDepthStencilView, |
// [In]深度模板视图 |
|
UINT ClearFlags, |
// [In]使用D3D11_CLEAR_FLAG枚举类型决定需要清空的部分 |
|
FLOAT Depth, |
// [In]使用Depth值填充所有元素的深度部分 |
|
UINT8 Stencil |
// [In]使用Stencil值填充所有元素的模板部分 |
);
|
4.2 |
深度/模版描述 |
typedef struct D3D11_DEPTH_STENCIL_DESC
{
|
BOOL DepthEnable; |
// 是否开启深度测试 |
|
D3D11_DEPTH_WRITE_MASK DepthWriteMask; |
// 深度值写入掩码 |
|
D3D11_COMPARISON_FUNC DepthFunc; |
// 深度比较函数 |
|
BOOL StencilEnable; |
// 是否开启模板测试 |
|
UINT8 StencilReadMask; |
// 模板值读取掩码 |
|
UINT8 StencilWriteMask; |
// 模板值写入掩码 |
|
D3D11_DEPTH_STENCILOP_DESC FrontFace; |
// 对正面朝向的三角形进行深度/模板操作描述 |
|
D3D11_DEPTH_STENCILOP_DESC BackFace; |
// 对背面朝向的三角形进行深度/模板操作的描述 |
} D3D11_DEPTH_STENCIL_DESC;
|
4.3 |
比较函数 |
D3D11_COMPARISON_FUNC的枚举说明
|
D3D11_COMPARISON_NEVER = 1 |
该比较函数一定返回false |
|
D3D11_COMPARISON_LESS = 2 |
使用<来替换⊴ |
|
D3D11_COMPARISON_EQUAL = 3 |
使用==来替换⊴ |
|
D3D11_COMPARISON_LESS_EQUAL = 4 |
使用<=来替换⊴ |
|
D3D11_COMPARISON_GREATER = 5 |
使用>来替换⊴ |
|
D3D11_COMPARISON_NOT_EQUAL = 6 |
使用!=来替换⊴ |
|
D3D11_COMPARISON_GREATER_EQUAL = 7 |
使用>=来替换⊴ |
|
D3D11_COMPARISON_ALWAYS = 8 |
该比较函数一定返回true |
|
D3D11_DEPTH_WRITE_MASK_ZERO |
不写入深度/模板缓冲区 |
|
D3D11_DEPTH_WRITE_MASK_ALL |
允许写入深度/模板缓冲区 |
|
4.4 |
描述操作 |
typedefstruct D3D11_DEPTH_STENCILOP_DESC {
D3D11_STENCIL_OP StencilFailOp;
D3D11_STENCIL_OP StencilDepthFailOp;
D3D11_STENCIL_OP StencilPassOp;
D3D11_COMPARISON_FUNC StencilFunc;
} D3D11_DEPTH_STENCILOP_DESC;
D3D11_STENCIL_OP 枚举的定义:
|
D3D11_STENCIL_OP_KEEP |
保持目标模板值不变 |
|
D3D11_STENCIL_OP_ZERO |
保持目标模板值为0 |
|
D3D11_STENCIL_OP_REPLACE |
使用StencilRef的值替换模板模板值 |
|
D3D11_STENCIL_OP_INCR_SAT |
对目标模板值加1,超过255的话将值保持在255 |
|
D3D11_STENCIL_OP_DECR_SAT |
对目标模板值减1,低于0的话将保持在0 |
|
D3D11_STENCIL_OP_INVERT |
对目标模板值的每个位进行翻转 |
|
D3D11_STENCIL_OP_INCR |
对目标模板值加1,超过255的话值将上溢变成0 |
|
D3D11_STENCIL_OP_DECR |
对目标模板值减1,低于0的话将下溢变成255 |
- 5 算法说明

- 6 回顾下PipeLine

(原)DirectX11 深度测试(有点另类)的更多相关文章
- DirectX11 With Windows SDK--14 深度测试
前言 当使用加法/减法/乘法颜色混合,或者使用透明混合的时候,在经过深度测试时可能会引发一些问题.例如现在我们需要使用加法混合来绘制一系列对象,而这些对象彼此之间不会相互阻挡.若我们仍使用原来的深度测 ...
- LIS,LDS的另类算法(原)
自己在做有关俄罗斯套娃的题目时,发现自己写出的一个方法可以解决求最长上升子序列(LIS)和最长下降子序列(LDS)的问题. 俄罗斯套娃:这个问题在前一篇中讲的有,在此处就不多讲了~链接 求最长上升子 ...
- DirectX11 With Windows SDK--00 目录
前言 (更新于 2019/4/10) 从第一次接触DirectX 11到现在已经有将近两年的时间了.还记得前年暑假被要求学习DirectX 11,在用龙书的源码配置项目运行环境的时候都花了好几天的时间 ...
- DirectX11 With Windows SDK--01 DirectX11初始化
前言 由于个人觉得龙书里面第4章提供的Direct3D 初始化项目封装得比较好,而且DirectX SDK Samples里面的初始化程序过于精简,不适合后续使用,故选择了以Init Direct3D ...
- DirectX11 With Windows SDK--22 立方体映射:静态天空盒的读取与实现
前言 这一章我们主要学习由6个纹理所构成的立方体映射,以及用它来实现一个静态天空盒. 但是在此之前先要消除两个误区: 认为这一章的天空盒就是简单的在一个超大立方体的六个面内部贴上天空盒纹理: 认为天空 ...
- DirectX11 With Windows SDK--02 顶点/像素着色器的创建、顶点缓冲区
前言 由于在Direct3D 11中取消了固定管线,要想绘制图形必须要了解可编程渲染管线的流程,一个能绘制出图形的渲染管线最少需要有这两个可编程着色器:顶点着色器和像素着色器. 本章会直接跳过渲染管线 ...
- DirectX11笔记(二)--Direct3D初始化1之基本概念
原文:DirectX11笔记(二)--Direct3D初始化1之基本概念 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010333737/art ...
- DirectX11 With Windows SDK--38 级联阴影映射(CSM)
前言 在31章我们曾经实现过阴影映射,但是受到阴影贴图精度的限制,只能在场景中相当有限的范围内投射阴影.本章我们将以微软提供的例子和博客作为切入点,学习如何解决阴影中出现的Atrifacts: 边缘闪 ...
- 另类Unity热更新大法:代码注入式补丁热更新
对老项目进行热更新 项目用纯C#开发的? 眼看Unity引擎热火朝天,无数程序猿加入到了Unity开发的大本营. 一些老项目,在当时ulua/slua还不如今天那样的成熟,因此他们选择了全c#开发:也 ...
随机推荐
- 【洛谷4717】【模板】快速沃尔什变换(FWT模板)
点此看题面 大致题意: 有两个长度为\(2^n\)的数组\(A,B\),且\(C_i=\sum_{j⊕k==i}A_jB_k\)分别求出当\(⊕\)为\(or,and,xor\)时的\(C\)数组. ...
- C++STL之map映照容器
map映照容器 map映照容器的元素数据是由一个键值和一个映照数据组成的, 键值与映照数据之间具有一一映照关系. map映照容器的数据结构也是采用红黑树来实现的, 插入元素的键值不允许重复, 比较函数 ...
- JS面向对象、prototype、call()、apply()
一. 起因 那天用到prototype.js于是打开看看,才看几行就满头雾水,原因是对js的面向对象不是很熟悉,于是百度+google了一把,最后终于算小有收获,写此纪念一下^_^. prototyp ...
- Spring常用配置 Scope
Bean的Scope Scope描述的是Spring容器如何新建Bean的实例的.Spring的Scope有以下几种,通过@Scope注解来实现. 1.Singleton:一个Spring容器中 ...
- kernighan lin算法
这个算法主要用在网络节点的分割.他的思想是将一个网络节点图分割成两个相等的节点集合.为了连接两个社区的边权最小. step1:随机产生两个节点的集合A和B. step2:计算A和B中的每个节点的int ...
- ibator自动代码生成
首先,强烈推荐一篇文章,介绍的特详细 http://www.iteye.com/topic/821983 1. 插件安装 http://blog.csdn.net/rchm8519/article/d ...
- BIO与NIO
BIO与NIO 1.传统BIO (1)特点 面向数据流 阻塞式传输 一个客户端对应一个线程 在客户机增多的情况下,线程资源随之增多,会造成cpu资源枯竭 (2)需求 客户机向服务器输出字符串,逐一 ...
- Colours–颜色库,包含100种预定义的颜色和方法
简介 Colours–颜色库,包含各种100种预定义的颜色和方法,可以简化颜色相关的开发工作. 项目主页: Colours 最新示例: 点击下载 快速入门 安装 通过Cocoapods安装 pod ' ...
- NodeJS基础入门
1.前端最主流的JavaScript运行环境 1>Node.js是一个基于Chrome V8引擎的JavaScript运行环境. 2>Node.js使用了一个事件驱动.非阻塞式I/O的模型 ...
- linux下后台运行jar包
#当前窗口退出 项目关闭$ java -jar test.jar #当前窗口关闭 项目关闭$ nohup java -jar test.jar &#当前窗口关闭 项目不关闭$ nohup ja ...