在OpenGL和D3D11的管线中,像素shader之后的操作就是深度模版测试,深度模版测试是以sample为单位进行的,就是一个像素上可以有多个采样点,每个采样点都有深度信息。深度模版测试对每个采样点都要进行一次,如果是msaa,最后要对每次采样的像素结果进行resolve,得到最终的结果。在下面的链接中有msaa的介绍。

http://www.cnblogs.com/mikewolf2002/archive/2012/11/22/2783235.html

深度模版测试的流程如下图:

在OpenGL中使用深度模版测试,首先要enable深度测试和模版测试,可以通过下面两个函数实现:

glEnable(GL_DEPTH_TEST);

glEnable(GL_STENCIL_TEST);

下面的函数初始化深度缓冲和模版缓冲值。

glClearStencil(0); // 初始为0

glClearDepth(1.0f); //初始为1.0

glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); //该函数会复位深度和模版值,分别为1.0和0,就是每个像素对应的深度值初始为1.0,对应的模版值为0。

在模板测试的过程中,可以先使用一个比较用掩码(comparison mask)与模板缓冲区中的值进行位与运算,再与参考值进行比较,从而实现对模板缓冲区中的值的某一位上的置位状态的判断。这样,模板缓冲区中的值不仅可以作为一个独立的整体使用,还可以作为一个比特集合使用。

在OpenGL中,可以通过调用glStencilFunc()函数来设定比较条件(comparison function)、参考值(reference value)以及比较用掩码(comparison mask)。

glStencilFunc(GL_EQUAL, // 比较条件

0x1, // 参考值

0xff); // 比较用掩码

比较条件可以设置为以下的值

GL_NEVER 从来不能通过

GL_ALWAYS 永远可以通过(默认值)

GL_LESS 小于参考值可以通过

GL_LEQUAL 小于或者等于可以通过

GL_EQUAL 等于通过

GL_GEQUAL 大于等于通过

GL_GREATER 大于通过

GL_NOTEQUAL 不等于通过

除了比较参考值与模板值之外,我们还需要使用一些操作来更新模板缓冲区中的值,这些操作被称为模板操作(stencil operation)。模板缓冲区的更新与模板测试的结果以及深度测试的结果有着密切的联系。如上面的流程图所示:模板操作可以为下述三种情况,分别指定相应的更新方法。

1. 模板测试失败。

2. 模板测试通过,但深度测试失败。

3. 模板测试通过,且深度测试通过。

当上述情况中的一个发生时,就会执行预先设定的更新操作。在OpenGL中,可以使用glStencilOp()函数来为上述三种情况分别设置更新方法。例如,

glStencilOp(GL_KEEP, // 第一种情况更新方法

GL_DECR, // 第二种情况的更新方法

GL_INCR); // 第三种情况的更新方法

可是设置的更新方法如下:

GL_KEEP    保持当前的模板值不变

GL_ZERO   将当前的模板值设为0

GL_REPLAC   将当前的模板值设置为参考值

GL_INCR    在当前的模板值上加1

GL_DECR    在当前的模板值上减1

GL_INVERT   对当前的模板值进行按位取反操作

我们可以通过写入掩码(write mask)来更新模板值指定比特位上的置位状态。OpenGL中,提供了glStencilMask()函数来设置写入掩码。例如,glStencilMask(0xff);还可以通过函数glDepthMask(GL_FALSE)来打开或关闭深度写功能,GL_TRUE为打开,GL_FALSE为禁止写。在新版本的OpenGL中,允许为多边形的正面和背面使用不同的模板测试条件和模板值改变方式,于是就有了glStencilFuncSeparate函数和glStencilOpSeparate函数。这两个函数分别与glStencilFunc和glStencilOp类似,只在最前面多了一个参数face,用于指定当前设置的是哪个面。可以选择GL_FRONT, GL_BACK, GL_FRONT_AND_BACK。

在D3D11中,通过深度模版状态来设置深度模版测试各种条件。

// 设置深度模版状态描述.
depthStencilDesc.DepthEnable = true;
depthStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;//D3D11_DEPTH_WRITE_MASK_ZERO禁止写深度缓冲
depthStencilDesc.DepthFunc = D3D11_COMPARISON_LESS;

depthStencilDesc.StencilEnable = true;
depthStencilDesc.StencilReadMask = 0xFF; //和OpenGL中函数glStencilFunc的第三个参数意思一样
depthStencilDesc.StencilWriteMask = 0xFF; //和glStencilMask意思一样

// 对于front face 像素使用的模版操作操作,三种状况下的stencil操作
depthStencilDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_INCR;
depthStencilDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;

// 对于back face像素使用的模版操作模式.
depthStencilDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_DECR;
depthStencilDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;

// 创建深度模版状态,使其生效
result = m_device->CreateDepthStencilState(&depthStencilDesc, &m_depthStencilState);
if(FAILED(result))
    {
    return false;

}

// 设置深度模版状态.
m_deviceContext->OMSetDepthStencilState(m_depthStencilState, 1);

OpenGL和D3D11中的深度模版测试相关推荐

  1. D3D11中的硬件反锯齿 SSAA/MSAA/EQAA/CSAA(3)

    五 .EQAA/CSAA EQAA(enhanced quality AA)和CSAA(coverage sample AA)其实是同样的采样技术,EQAA是AMD的实现,CSAA是NV的实现,下面我 ...

  2. 在浏览器中进行深度学习:TensorFlow.js (四)用基本模型对MNIST数据进行识别

    2019独角兽企业重金招聘Python工程师标准>>> 在了解了TensorflowJS的一些基本模型的后,大家会问,这究竟有什么用呢?我们就用深度学习中被广泛使用的MINST数据集 ...

  3. 温故而知新,6位顶级CV科学家聚首:计算机视觉中的深度学习方法vs传统方法...

    来源:AI科技评论 作者:Mr Bear 编辑:青暮 2021 年 10 月 13 日,来自麻省理工学院.加州大学伯克利分校.伊利诺伊大学香槟分校.华盛顿大学.帝国理工学院的六名顶级人工智能科学家.计 ...

  4. 语义分割中的深度学习方法全解:从FCN、SegNet到各版本DeepLab

    语义分割中的深度学习方法全解:从FCN.SegNet到各版本DeepLab 原文:https://www.sohu.com/a/155907339_610300 图像语义分割就是机器自动从图像中分割出 ...

  5. 图像识别中的深度学习【香港中文大学王晓刚】

    深度学习发展历史 深度学习是近十年来人工智能领域取得的重要突破.它在语音识别.自然语言处理.计算机视觉.图像与视频分析.多媒体等诸多领域的应用取得了巨大成功.现有的深度学习模型属于神经网络.神经网络的 ...

  6. 在浏览器中进行深度学习:TensorFlow.js (十二)异常检测算法

    2019独角兽企业重金招聘Python工程师标准>>> 异常检测是机器学习领域常见的应用场景,例如金融领域里的信用卡欺诈,企业安全领域里的非法入侵,IT运维里预测设备的维护时间点等. ...

  7. 使用TensorFlow.js在浏览器中进行深度学习入门

    目录 设置TensorFlow.js 创建训练数据 检查点 定义神经网络模型 训练AI 测试结果 终点线 内存使用注意事项 下一步是什么?狗和披萨? 下载TensorFlowJS示例-6.1 MB T ...

  8. 苹果叶片病害识别中的深度学习研究

    苹果叶片病害识别中的深度学习研究 1.研究内容 基于DenseNet-121深度卷积网络,提出了回归.多标签分类和聚焦损失函数3种苹果叶片病害识别方法. 2.数据集介绍 用于识别的图像数据集来源于Ai ...

  9. 前端开箱即用的中后台管理模版,建议收藏

    开箱即用的中后台管理模版,建议收藏! 今天来推荐几款开箱即用的中后台管理模版! Vue Element Admin vue-element-admin 是一个后台前端解决方案,它基于 vue2 和 e ...

最新文章

  1. Veeam Backup Replication v7 安装配置手册
  2. 吐血整理!这可能是最全的机器学习工具手册
  3. hbase里插入big int数据用Phoenix查看的报错问题
  4. java编写科赫曲线_matlab绘制peano(皮亚诺)曲线和koch(科赫曲线,雪花曲线)分形曲线...
  5. 软考信息安全必备考点
  6. 电商大促首焦背景素材|大火C4D元素
  7. python语言案例教程 单元测试_python单元测试unittest实例详解
  8. Python 代码覆盖率统计工具 coverage.py
  9. mysql_udf_http(根据mysql表自动触发发送http请求)
  10. 扫码连wifi小程序源码
  11. Highcharts 将默认文字更改为中文
  12. LoadRunner教程(15)-LoadRunner 初识Analysis
  13. 08CMS之AJAX
  14. 进出口流程 报关单据
  15. linux 浮点异常,浮点数学函数异常处理方法
  16. 宽带远端服务器无响应什么意思,宽带远程服务器无响应
  17. 分享 | 智慧水务建设方案
  18. 砍价永远差一刀?拼多多法庭上回复:小数点后有6位···
  19. Monaco-Editor 多人协作 编辑器
  20. 社群的使用---Kodu少儿编程第八天

热门文章

  1. 面试必问的 Linux 命令帮你整理好啦 (下)
  2. ads s参数拟合_S参数仿真(ADS)
  3. 贪吃蛇javascript代码_源于Jquery开发贪吃蛇游戏——简单思路分析总结
  4. 最小二乘法、梯度下降法和两者区别
  5. 海兰一体计算机参数,海兰幽灵X7电竞一体机怎么样-海兰幽灵X7电竞一体机评测...
  6. activemq 重启后java程序_ActiveMQ持久化机制代码实例
  7. c多线程并发处理方式_Java并发基础,不怕你看不懂
  8. oracle和Linux能兼容吗,Oracle基于Linux 7下的安装
  9. mysql 锁怎么使用_MySQL锁的用法之行级锁
  10. DE26 Continuation: Repeated Real Eigenvalues