操作步骤:

1.开启隐藏面消除功能

gl.enable(gl.DEPTH_TEST)

2.绘制所有不透明的物体(alpha 为1.0)

3.锁定用于进行隐藏面消除的深度缓冲区的写入操作,使之只读。

gl.depthMask(flase)

4.绘制所有半透明的物体(alpha小于1.0),注意它们应当按照深度排序,然后从后向前绘制

5.释放深度缓冲区,使之可读可写。

gl.depthMask(true)

隐藏面消除原理:

深度缓冲区存储了每个像素的z坐标值(归一化为0.0到1.0之间)。假设场景中有两个前后重叠的三角形A和B。首先,在绘制三角形Ade时候,将它的每个片元的z值写入深度缓冲区,然后在绘制三角形B的时候,将B中与A重叠的片元和深度缓冲区中对应像素的z值作比较:

如果深度缓冲区中的z值小,就说明三角形A在前面,那么B的这个片元就被舍弃了,不会写入颜色缓冲区;

如果深度缓冲区的z值大,就说明三角形B在前面,就把B的这个片元写入颜色缓冲区中,将之前A的颜色覆盖掉。

这样,当绘制完成时,颜色缓冲区中的所有像素都是最前面的片元,而且每个像素的z值都存储在深度缓冲区中。这就是隐藏面消除的原理。

注意,所有这些操作都是在片元层面上进行的,所以如果两个面相交,也可以正常显示。

透明与不透明共存原理

当我们按照上述步骤同时绘制透明和不透明物体时,在第一步和第二步结束后,所有不透明的物体都正确地绘制在了颜色缓冲区中,深度缓冲区记录了每个像素(最前面的片元)的深度。

然后在进行第3、4和5步,绘制所有半透明的物体。由于深度缓冲区的存在,不透明物体后面的物体,即使半透明的也不会显示,这是因为深度缓冲区的写操作被锁定了,所以在绘制不透明物体前面的透明物体时,也不会更新深度缓冲区。

透明与不透明物体共存相关推荐

  1. WebGL入门(三十九)-透明与不透明物体共存,绘制透明面和不透明面的立方体

    绘制透明面和不透明面的立方体 1. 绘制透明立方体 1.1 绘制透明立方体要点 1.2 绘制透明立方体demo效果 1.3 绘制透明立方体demo代码 1.4 开启隐藏面消除后 2. 透明与不透明共存 ...

  2. 实现透明效果时,开启深度测试,关闭深度写入

    同一个场景,同时存在透明和不透明物体,存在各种遮挡关系. 正常渲染流程:渲染不透明物体时,开启深度测试和深度写入;渲染透明物体时,开启深度测试,关闭深度写入.两种状态,互相切换. 深度测试与深度写入就 ...

  3. VULKAN学习笔记-inter教学四篇

    VULKAN学习笔记-inter教学四篇 --交换链相关函数:实例层 vkCreateWin32SurfaceKHR vkDestroySurfaceKHR vkGetPhysicalDeviceSu ...

  4. 猫都能学会的Unity3D Shader入门指南(一)

    动机 自己使用Unity3D也有一段时间了,但是很多时候是流于表面,更多地是把这个引擎简单地用作脚本控制,而对更深入一些的层次几乎没有了解.虽然说Unity引擎设计的初衷就是创建简单的不需要开发者操心 ...

  5. Unity Shader入门笔记

    学习资料:https://onevcat.com/2013/07/shader-tutorial-1/猫都能学会的Unity3D Shader入门指南(一)(二) 学习资料:http://98jy.n ...

  6. Cg教程_可编程实时图形权威指南(扫描清晰版)+部分unity shader 知识

      Cg教程_可编程实时图形权威指南(扫描清晰版) .pdf (34.5 MB, 下载次数: 239) Shader Model(在 3D 图形领域常被简称SM)就是"优化渲染引擎模式&qu ...

  7. URP的工作流程源码分析

    URP Analysis URP是unity推出的,用于替代传统build-in管线.该篇为阅读的笔记~ URP的入口文件为UniversalRenderPiplineAsset.cs,在该文件中,进 ...

  8. Unity 控制摄像机移动

    Unity 控制摄像机移动 控制摄像机移动 1.摄像机围绕某一固定点移动(旋转) 2.摄像机无需围绕某一固定点移动 3.摄像机先后显示问题 控制摄像机移动 控制摄像机移动目前我接触到的有两种方式,一种 ...

  9. 详细介绍如何从零开始制作51单片机控制的智能小车(二)———超声波模块、漫反射光电管、4路红外传感器的介绍和使用

       我会通过本系列文章,详细介绍如何从零开始用51单片机去实现智能小车的控制,在本系列的上一篇文章中介绍了如何让小车动起来,本文作为本系列的第二篇文章,主要介绍让小车实现自动避障所涉及的一些传感器, ...

最新文章

  1. Sublime Text3配置Node.js开发环境
  2. oracle数据库gold,Oracle数据库之Oracle GoldenGate 12.2.0.1 安装、升级和删除
  3. Python学习之While--break
  4. 谈谈程序链接及分段那些事
  5. javascript 不让成为nan_一张图彻底搞懂JavaScript的==运算
  6. Python+OpenCV:立体图像深度图(Depth Map from Stereo Images)
  7. centos安装stress安装失败_Linux压力测试工具Stress的使用指南
  8. LIS最长上升子序列详解+模板(dp和二分做法)
  9. Android Studio新建项目
  10. 工作簿中工作表内容批量提取
  11. OSPF综合实验(三)
  12. Python Scapy 愚弄入侵检测系统
  13. 乐理知识以及musicXml属性介绍
  14. [江枫]用Amoeba构架MySQL分布式数据库环境
  15. 视频播放库Vitamio的使用以及功能扩展
  16. 【转】常用的shell脚本
  17. 未来两周目标计划---C++ and Disassembly(不积跬步无以至千里,不积小流无以成江海)
  18. 历届图灵奖和马尔奖获得者
  19. Nvicat Premium连接腾讯云数据库TDSQL-C(原CynosDB)
  20. Qml 中用 Shader 实现圣诞树旋转灯

热门文章

  1. 英语口语198之每日十句口语
  2. 概率分布分位点_概率统计计量经济学_假设检验中的重要概念_分位点/p值
  3. form-create-desniger 自定义拖拽表单
  4. Java:使用POI导出Excel文件后打开文件提示因为文件格式或文件扩展名无效而无法打开
  5. 构建学生请假审批流程
  6. 测试成长方程01:费曼技巧
  7. PCIe学习笔记之pcie结构和配置空间
  8. python+flask项目实战开发
  9. 2019春招宇视科技嵌入式面试
  10. docker进入容器中的方法