透明与不透明物体共存
操作步骤:
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步,绘制所有半透明的物体。由于深度缓冲区的存在,不透明物体后面的物体,即使半透明的也不会显示,这是因为深度缓冲区的写操作被锁定了,所以在绘制不透明物体前面的透明物体时,也不会更新深度缓冲区。
透明与不透明物体共存相关推荐
- WebGL入门(三十九)-透明与不透明物体共存,绘制透明面和不透明面的立方体
绘制透明面和不透明面的立方体 1. 绘制透明立方体 1.1 绘制透明立方体要点 1.2 绘制透明立方体demo效果 1.3 绘制透明立方体demo代码 1.4 开启隐藏面消除后 2. 透明与不透明共存 ...
- 实现透明效果时,开启深度测试,关闭深度写入
同一个场景,同时存在透明和不透明物体,存在各种遮挡关系. 正常渲染流程:渲染不透明物体时,开启深度测试和深度写入;渲染透明物体时,开启深度测试,关闭深度写入.两种状态,互相切换. 深度测试与深度写入就 ...
- VULKAN学习笔记-inter教学四篇
VULKAN学习笔记-inter教学四篇 --交换链相关函数:实例层 vkCreateWin32SurfaceKHR vkDestroySurfaceKHR vkGetPhysicalDeviceSu ...
- 猫都能学会的Unity3D Shader入门指南(一)
动机 自己使用Unity3D也有一段时间了,但是很多时候是流于表面,更多地是把这个引擎简单地用作脚本控制,而对更深入一些的层次几乎没有了解.虽然说Unity引擎设计的初衷就是创建简单的不需要开发者操心 ...
- Unity Shader入门笔记
学习资料:https://onevcat.com/2013/07/shader-tutorial-1/猫都能学会的Unity3D Shader入门指南(一)(二) 学习资料:http://98jy.n ...
- Cg教程_可编程实时图形权威指南(扫描清晰版)+部分unity shader 知识
Cg教程_可编程实时图形权威指南(扫描清晰版) .pdf (34.5 MB, 下载次数: 239) Shader Model(在 3D 图形领域常被简称SM)就是"优化渲染引擎模式&qu ...
- URP的工作流程源码分析
URP Analysis URP是unity推出的,用于替代传统build-in管线.该篇为阅读的笔记~ URP的入口文件为UniversalRenderPiplineAsset.cs,在该文件中,进 ...
- Unity 控制摄像机移动
Unity 控制摄像机移动 控制摄像机移动 1.摄像机围绕某一固定点移动(旋转) 2.摄像机无需围绕某一固定点移动 3.摄像机先后显示问题 控制摄像机移动 控制摄像机移动目前我接触到的有两种方式,一种 ...
- 详细介绍如何从零开始制作51单片机控制的智能小车(二)———超声波模块、漫反射光电管、4路红外传感器的介绍和使用
我会通过本系列文章,详细介绍如何从零开始用51单片机去实现智能小车的控制,在本系列的上一篇文章中介绍了如何让小车动起来,本文作为本系列的第二篇文章,主要介绍让小车实现自动避障所涉及的一些传感器, ...
最新文章
- Sublime Text3配置Node.js开发环境
- oracle数据库gold,Oracle数据库之Oracle GoldenGate 12.2.0.1 安装、升级和删除
- Python学习之While--break
- 谈谈程序链接及分段那些事
- javascript 不让成为nan_一张图彻底搞懂JavaScript的==运算
- Python+OpenCV:立体图像深度图(Depth Map from Stereo Images)
- centos安装stress安装失败_Linux压力测试工具Stress的使用指南
- LIS最长上升子序列详解+模板(dp和二分做法)
- Android Studio新建项目
- 工作簿中工作表内容批量提取
- OSPF综合实验(三)
- Python Scapy 愚弄入侵检测系统
- 乐理知识以及musicXml属性介绍
- [江枫]用Amoeba构架MySQL分布式数据库环境
- 视频播放库Vitamio的使用以及功能扩展
- 【转】常用的shell脚本
- 未来两周目标计划---C++ and Disassembly(不积跬步无以至千里,不积小流无以成江海)
- 历届图灵奖和马尔奖获得者
- Nvicat Premium连接腾讯云数据库TDSQL-C(原CynosDB)
- Qml 中用 Shader 实现圣诞树旋转灯