第八章 透明效果

embedded/2024/11/28 4:36:32/

在渲染模型中控制透明通道。透明度为1,完全不透明;透明度为0,完全不会显示。

两种方法:

(1)透明度测试

(2)透明度混合

深度缓冲(z-buffer)用于解决可见性问题。可以决定哪个物体的哪些部分被渲染到前面,哪些部分会被其他物体遮掩。根据深度缓存中的值来判断该片元距离摄像机的距离,当渲染一个片元时,需要把它的深度值和已经存在于深度缓冲中的值进行比较,如果它的值距离摄像机更远,那么说明这个片元不应被渲染到屏幕上;否则,这个片元应该覆盖掉此时颜色缓冲中的像素值,并把它的深度值更新到深度缓冲中(如果开启了深度写入)。可以不关心物体渲染顺序。

基本原理

(1)透明度测试

只要一个片元的透明度不满足条件,那么它对应的片元就会被舍弃。被舍弃的片元不会再进行任何处理,也不会对颜色缓冲产生任何影响;否则,就会按照普通的不透明物体来处理,即深度测试、深度写入。透明度测试不需要关闭深度写入,它会根据透明度来舍弃一些片元,效果极端,要么完全透明,要么完全不透明。

(2)透明度混合

可以得到真正的半透明效果。它会使用当前片元的透明度作为混合因子,与已经存储在颜色缓冲中的颜色值进行混合,得到新的颜色。透明度混合需要关闭深度写入,要小心物体的渲染顺序。透明度混合只关闭了深度写入,没有关闭深度测试。当使用透明度混合渲染一个片元时,还是会比较它的深度值和当前深度缓冲中的深度值。如果它的深度值距离摄像机更远,那么就不会再进行混合操作。当一个不透明物体出现在一个透明物体前面,而我们先渲染了不透明物体,它仍然可以正常地遮挡住透明物体。对于透明度混合来说,深度缓冲是只读的。

为什么渲染顺序很重要

应该在不透明物体渲染完之后再渲染半透明物体。半透明物体之间也要符合渲染顺序。

渲染引擎一般都会对物体先排序再渲染,常用方法是

(1)先渲染所有不透明物体,并开启它们的深度测试和深度写入

(2)把半透明按它们距离摄像机的远近进行排序,然后按照从后往前的顺序渲染这些半透明物体,并开启它们的深度测试,但关闭深度写入。

为了减少错误排序,我们尽可能让模型是凸面体,并考虑将复杂模型拆分成可以独立排序的多个子模型。

Unity Shader的渲染顺序

Unity提供了渲染队列来解决渲染顺序问题。可以使用SubShader的Queue标签来决定我们的模型将归于哪个渲染队列。Unity在内部使用一系列整数索引来表示每个渲染队列,且索引号越小越早被渲染。

透明度测试

透明度测试:只要一个片元的透明度不满足条件,那么它对应的片元就会被舍弃。被舍弃的片元将不会再进行任何处理,也不会对颜色缓冲产生任何影响;否则,就会按照普通的不透明方式去处理。

通常,在片元着色器中使用clip函数进行透明度测试。clip是一个Cg函数

函数:void clip(float4 x); void clip(float3 x); void clip(float2 x); void clip(float1 x); void clip(float x);

参数:裁剪时使用的标量或矢量条件

描述:如果给定参数的任何一个分量是负数,就会舍弃当前像素的颜色。它等同于下面的代码

void clip(float4 x)
{if (any(x < 0))discard;
}
Shader "Unity Shaders Book/Chapter 8/Alpha Test"{Properties {_Color		("Main Tint", Color) = (1, 1, 1, 1)_MainTex	("Main Tex", 2D) = "white"{}//_Cutoff用于决定我们调用clip进行透明度测试时使用的判断条件。范围是[0,1]_Cutoff		("Alpha Cutoff", Range(0, 1)) = 0.5}SubShader{//透明度测试使用的渲染队列是AlphaTest//把IgnoreProjector设为True,不受投影器的影响//RenderType可以让Unity把Shader归入提前定义的组TransparentCutout//指明该Shader是一个使用了透明度测试的Shader,RenderType通常被用于着色器的替换功能//使用了透明度测试的Shader都应该设置这三个标签Tags{	"Queue"="AlphaTest""IgnoreProjector"="True""RenderType"="TransparentCutout"}Pass{Tags{"LightMode"="ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "Lighting.cginc"fixed4 _Color;sampler2D _MainTex; float4 _MainTex_ST;fixed _Cutoff;struct a2v{float4 vertex : POSITION;float3 normal : NORMAL;float4 texcoord : TEXCOORD0;};struct v2f{float4 pos : SV_POSITION;float3 worldNormal : TEXCOORD0;float3 worldPos : TEXCO

http://www.ppmy.cn/embedded/5264.html

相关文章

Linux的学习之路:9、冯诺依曼与进程(1)

摘要 本章主要是说一下冯诺依曼体系结构和进程的一部分东西。 目录 摘要 一、冯诺依曼体系结构 二、操作系统的概念 三、设计OS的目的 四、管理 五、进程的基本概念 六、PCB 七、在Linux环境下查看进程 八、使用代码创建进程 九、思维导图 一、冯诺依曼体系结构 如…

4.19作业 驱动开发

一、编程要求 在内[[核中不支持浮点类型打印将si7006硬件数据读取到内核空间&#xff0c;拷贝到用户空间在i2c子系统驱动中&#xff0c;需要编写读取温湿度传感器函数在probe函数中 注册字符设备驱动(分步注册)自动创建设备节点通过ioctl函数判断应用层发送命令码&#xff0c;…

嵌入式linux中利用QT控制蜂鸣器方法

大家好,今天给大家分享一下,如何控制开发板上的蜂鸣器。 第一:开发板原理图 从原理图中可以得出,当引脚输出低电平的时候,对应的蜂鸣器发出响声。 第二:QT代码详细实现 设置一个按钮,点击即可控制BEEP状态发生反转。 #ifndef MAINWINDOW_H #define MAINWINDOW_H#in…

spring的redis注解@Cacheable @Cacheput @CacheEvict的condition、unless

概述 redis的注解使用的过程中总会遇到condition和unless这两个属性&#xff0c;而且不同的注解使用注意事项不一样。本人也是错误使用之后详细查询了一下&#xff0c;作了如下的总结。 Cacheale 这个注解的使用和意义这里不多说&#xff0c;可以查看我的其他文档。这里主要说…

golang 迷宫回溯算法(递归)

// Author sunwenbo // 2024/4/14 20:13 package mainimport "fmt"// 编程一个函数&#xff0c;完成老鼠找出路 // myMap *[8][7]int 地图&#xff0c;保证是同一个地图&#xff0c;因此是引用类型 // i,j表示对地图的哪个点进行测试 func SetWay(myMap *[8][7]int, …

车联网安全发展形势、挑战与建议

文章目录 前言一、技术演进加速车联网安全环境复杂变化(一)网络通信路径多元化(二)感知计算系统智能化(三)业务应用快速迭代拓展二、车联网安全威胁呈现新趋势(一)从攻击对象看,服务平台成为攻击重点(二)从攻击手段看,远程攻击成为主流(三)从危害后果看,车辆运行…

1.爬虫解析字符串2.提取文档内容

package day02; import org.apache.commons.io.FileUtils; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.junit.Test; import java.io.File; import java.io.IOException; public class jianxizfc {// <!--jsoup解析工具所需依赖--> // …

基于Python的招聘信息爬虫系统的设计与实现

基于Python的招聘信息爬虫系统的设计与实现 Design and Implementation of a Python-based Recruitment Information Crawler System 完整下载链接:基于Python的招聘信息爬虫系统的设计与实现 文章目录 基于Python的招聘信息爬虫系统的设计与实现摘要第一章 绪论1.1 研究背景…