(问到自己清楚就可)

@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 深度测试(有点另类)的更多相关文章

  1. DirectX11 With Windows SDK--14 深度测试

    前言 当使用加法/减法/乘法颜色混合,或者使用透明混合的时候,在经过深度测试时可能会引发一些问题.例如现在我们需要使用加法混合来绘制一系列对象,而这些对象彼此之间不会相互阻挡.若我们仍使用原来的深度测 ...

  2. LIS,LDS的另类算法(原)

    自己在做有关俄罗斯套娃的题目时,发现自己写出的一个方法可以解决求最长上升子序列(LIS)和最长下降子序列(LDS)的问题. 俄罗斯套娃:这个问题在前一篇中讲的有,在此处就不多讲了~链接  求最长上升子 ...

  3. DirectX11 With Windows SDK--00 目录

    前言 (更新于 2019/4/10) 从第一次接触DirectX 11到现在已经有将近两年的时间了.还记得前年暑假被要求学习DirectX 11,在用龙书的源码配置项目运行环境的时候都花了好几天的时间 ...

  4. DirectX11 With Windows SDK--01 DirectX11初始化

    前言 由于个人觉得龙书里面第4章提供的Direct3D 初始化项目封装得比较好,而且DirectX SDK Samples里面的初始化程序过于精简,不适合后续使用,故选择了以Init Direct3D ...

  5. DirectX11 With Windows SDK--22 立方体映射:静态天空盒的读取与实现

    前言 这一章我们主要学习由6个纹理所构成的立方体映射,以及用它来实现一个静态天空盒. 但是在此之前先要消除两个误区: 认为这一章的天空盒就是简单的在一个超大立方体的六个面内部贴上天空盒纹理: 认为天空 ...

  6. DirectX11 With Windows SDK--02 顶点/像素着色器的创建、顶点缓冲区

    前言 由于在Direct3D 11中取消了固定管线,要想绘制图形必须要了解可编程渲染管线的流程,一个能绘制出图形的渲染管线最少需要有这两个可编程着色器:顶点着色器和像素着色器. 本章会直接跳过渲染管线 ...

  7. DirectX11笔记(二)--Direct3D初始化1之基本概念

    原文:DirectX11笔记(二)--Direct3D初始化1之基本概念 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010333737/art ...

  8. DirectX11 With Windows SDK--38 级联阴影映射(CSM)

    前言 在31章我们曾经实现过阴影映射,但是受到阴影贴图精度的限制,只能在场景中相当有限的范围内投射阴影.本章我们将以微软提供的例子和博客作为切入点,学习如何解决阴影中出现的Atrifacts: 边缘闪 ...

  9. 另类Unity热更新大法:代码注入式补丁热更新

    对老项目进行热更新 项目用纯C#开发的? 眼看Unity引擎热火朝天,无数程序猿加入到了Unity开发的大本营. 一些老项目,在当时ulua/slua还不如今天那样的成熟,因此他们选择了全c#开发:也 ...

随机推荐

  1. 【HHHOJ】ZJOI2019模拟赛(十三)03.10 解题报告

    点此进入比赛 得分: \(97+0+10=107\) 排名: \(Rank\ 3\) \(Rating\):\(+47\) \(T1\):[HHHOJ187]Hashit(点此看题面) 容易想到可以用 ...

  2. iOS 有些库只能在真机上运行,不能在模拟器上运行的解决方式

    在开发中,多少肯定会用到第三方的东西,或许大家也和我一样遇到到这样的情况,有些库正好适合自己的需求,但是这个库却只支持真机上运行,在模拟器上编译却不通过, 一般情况下,.a静态包,你刚刚导入的时候,不 ...

  3. django.template.exceptions.TemplateSyntaxError: 'article_tags' is not a registered tag library.

    django.template.exceptions.TemplateSyntaxError: 'article_tags' is not a registered tag library. Must ...

  4. (转)ActionContext和ServletActionContext

    前面已经了解到ActionContext是Action执行时的上下文,里面存放着Action在执行时需要用到的对象,我们也称之为广义值栈. Struts2在每次执行Action之前都会创建新的Acti ...

  5. git(将现有项目加入osChina)

    将现有项目加入osChina 在osChina中创建项目 注意不要初始化项目.(其实初始化也没有什么问题,可以直接clone到本地,再把项目添加进去就行了,后续操作一样的) 项目现在基本为空,得到项目 ...

  6. POJ2409 Let it Bead(Polya定理)

    Let it Bead Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6443   Accepted: 4315 Descr ...

  7. Spring Cloud 入门 Eureka-Client服务提供

    前面文章介绍了如果创建“服务注册中心”,现在创建“服务提供者”,并向服务注册中心注册自己,在服务提供方中尝试着提供一个接口来获取当前所有的服务信息. 先,创建一个基本的Spring Boot应用.命名 ...

  8. Go单元测试与基准测试

    Go单元测试 Go单元测试框架,遵循规则整理如下: 1.文件命名规则: 含有单元测试代码的go文件必须以_test.go结尾,Go语言测试工具只认符合这个规则的文件 单元测试文件名_test.go前面 ...

  9. Rsync备份服务部署

    1 Rsync服务器架构规划 在搭建服务之前需要做以下规划设计,其中包括:主机规划表.主机IP地址规划表.主机架构图.主机hosts解析以及linux主机基础优化等 1.1 主机规划表 服务器说明 数 ...

  10. git push 时 fatal: Unable to create 'D:/phpStudy/WWW/green_tree/.git/index.lock': File exists.解决办法

    找到自己的项目,找到.git文件夹,进去把目标文件删除即可 或者使用rm -rf 命令(如果没有那个文件件或者文件,将隐藏文件打开就可以看到了)