片元函数的fixed4类型的返回值的第4位即为阿尔法值,0代表完全不显示(透明),1代表完全显示。中间的数值代表半透明。但只修改这个值是不能直接修改透明度的,因为还要对队列等进行修改。

本文介绍透明度测试与透明度混合,前者只能制作全透明效果,后者可制作半透明效果。

透明度测试/全透明效果:

如果要将纹理贴图的一部分显示为不透明,另一部分显示为完全透明,可以使用这个方法。方法很简单,在片元函数中加入如下内容:

if((texColor.a - _Cutoff)<0)//条件根据需要改
{
    discard;//剪除、不显示该片元
}

这里的_Cutoff是设置的一个可以修改的系数,texColor.a为纹理贴图的阿尔法通道。当满足条件(texColor.a- _Cutoff)<0)时剪除该片元,也就是完全透明。具体条件可根据需要改。

同时建议使用标签Tags { "Queue"="AlphaTest" "IgnoreProjector"="True" },含义分别为选择渲染队列为AlphaTest(在渲染不透明物体之后、透明物体之前渲染该物体);不产生阴影;

一个透明度测试/全透明效果的完整例子:

Shader "Test"
{Properties{_MainTex("MainTex", 2D) = "white" {}//纹理贴图_Diffuse("Diffuse", Color) = (1,1,1,1)//漫反射颜色_Cutoff("Alpha Cutoff", Range(0,1)) = 0.5//设置的控制透明部分的系数}SubShader{Tags { "Queue"="AlphaTest" //在不透明物体之后、透明物体之前渲染该物体;"IgnoreProjector"="True" //不产生阴影;}LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"sampler2D _MainTex;float4 _MainTex_ST;fixed4 _Diffuse;float _Cutoff;struct v2f{float4 vertex : SV_POSITION;fixed3 worldNormal: TEXCOORD0;//世界空间法线float3 worldPos: TEXCOORD1;//世界空间顶点坐标float2 uv : TEXCOORD2;//uv坐标};v2f vert (appdata_base v)//appdata_base是自带的一个结构体,含有vertex、normal等的定义,这样就不用自己再定义一个类似的结构体了。{v2f o;o.vertex = UnityObjectToClipPos(v.vertex);fixed3 worldNormal = UnityObjectToWorldNormal( v.normal);o.worldNormal = worldNormal;o.worldPos = mul(unity_ObjectToWorld, v.vertex);o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);return o;}fixed4 frag (v2f i) : SV_Target{fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;//环境光fixed4 texColor = tex2D(_MainTex, i.uv);//读取纹理贴图颜色值if((texColor.a - _Cutoff)<0)//满足条件时不显示该片元,这里的条件为纹理贴图的α通道的值小于_Cutoff{discard;//剪除、不显示该片元}//漫反射fixed3 worldLightDir = UnityWorldSpaceLightDir(i.worldPos);fixed3 diffuse = _LightColor0.rgb * texColor.rgb * _Diffuse.rgb * (dot(worldLightDir,i.worldNormal)*0.5+0.5);fixed3 color = ambient + diffuse;return fixed4(color,1);}ENDCG}}FallBack "VertexLit"//虽然之前的标签了设置了不产生阴影,但FallBack的方案也会产生阴影
}

使用一张渐变的一半透明的纹理贴图,调整_Cutoff可以调整透明的面积。

制作草时可以使用透明度测试让贴图除草之外的部分全透明。但使用这个方法只能得到全透明的效果,而不能产生半透明的效果。

 透明度混合/半透明效果:

先讲几个概念:深度测试、深度写入、深度缓存、颜色缓存。

在渲染时都要进行深度测试,当渲染不透明物体时,将深度与深度缓存中的值比较,发现新片元更靠近摄像机时,就将新深度写入深度缓存,并更新颜色缓存。这样最后渲染出的颜色就是最接近摄像机的片元的颜色,被其遮挡的则不会渲染。

渲染半透明物体,需要在不透明物体渲染结束后。渲染半透明物体依然会进行深度测试,剔除掉被不透明物体遮挡的片元。但需要关闭深度写入,不再更新深度缓存。发现是需要渲染的颜色时,不是直接替换颜色缓冲,而是以一定方式进行混合。下面是一些常见混合类型,和ps中的图层叠加比较相似:

常见混合操作类型:

//正常(Normal)透明度混合

Blend SrcAlpha OneMinusSrcAlpha

//柔和相加

Blend OneMinusDstColor One

//正片叠底

Blend DstColor Zero

//两倍相乘

Blend DstColor SrcColor

//变暗

BlendOp min

Blend One One

//变亮

Blend OneMinusDstColor One

Blend One OneMinusSrcColor

//线性减淡

Blend One One

通常,半透明shader都有如下3个标签:
        Tags { 
            "Queue"="Transparent" //选择渲染队列为Transparent,这样会在渲染不透明物体之后再渲染该物体
            "IgnoreProjector"="True" //不受阴影投射器影响
            "RenderType"="Transparent"//将该shader归入预先设置的类Transparent,这个标标签的功能常被用于shader替换
            }

并且需要在pass中关闭深度写入和选择颜色混合方案:

ZWrite Off //关闭深度写入
            Blend SrcAlpha OneMinusSrcAlpha //颜色混合方案

一个完整的代码例子:

Shader "Test"
{Properties{_MainTex("MainTex", 2D) = "white" {}_Diffuse("Diffuse", Color) = (1,1,1,1)_AlphaScale("Alpha Scale", Range(0,1)) = 1//透明度系数,0表示完全透明}SubShader{//半透明shader通常都包含这3个标签Tags { "Queue"="Transparent" //选择渲染队列为Transparent,这样会在渲染不透明物体之后再渲染该物体"IgnoreProjector"="True" //不受阴影投射器影响"RenderType"="Transparent"//将该shader归入预先设置的类,常被用于shader替换}LOD 100ZWrite Off //关闭深度写入Blend SrcAlpha OneMinusSrcAlpha //开启普通混合Pass{Tags{"LightMode"="ForwardBase"}//光照模式CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"sampler2D _MainTex;float4 _MainTex_ST;fixed4 _Diffuse;float _AlphaScale;struct v2f{float4 vertex : SV_POSITION;fixed3 worldNormal: TEXCOORD0;float3 worldPos: TEXCOORD1;float2 uv : TEXCOORD2;};v2f vert (appdata_base v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);fixed3 worldNormal = UnityObjectToWorldNormal( v.normal);o.worldNormal = worldNormal;o.worldPos = mul(unity_ObjectToWorld, v.vertex);o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);return o;}fixed4 frag (v2f i) : SV_Target{fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;//环境光颜色fixed4 texColor = tex2D(_MainTex, i.uv);//纹理贴图颜色//漫反射fixed3 worldLightDir = UnityWorldSpaceLightDir(i.worldPos);fixed3 diffuse = _LightColor0.rgb * texColor.rgb * _Diffuse.rgb * (dot(worldLightDir,i.worldNormal)*0.5+0.5);fixed3 color = ambient + diffuse;return fixed4(color, texColor.a * _AlphaScale);//使用纹理贴图的阿尔法通道*_AlphaScale作为新阿尔法值,0为全透明}ENDCG}}FallBack "VertexLit"
}

半透明物体的背面信息也被剔除了,所以是不会显示的。如果需要显示背面信息,在pass中使用Cull Off关闭剔除。如果需要先渲染背面内容,再渲染正面内容,以便从前到后正确混合颜色,就将pass复制为2个,上方的pass用Cull Front只渲染背部,下方的pass用Cull Back只渲染前部。

unity shader 入门 全透明与半透明效果实现相关推荐

  1. unity Shader 入门精要 EX

    unity Shader 入门精要: 1.shader概念 2.shader分类(顶点Shader.像素Shader) 3.Shader编程语言 4.Unity Shader 4.1概述 4.2分类( ...

  2. 《Unity Shader 入门精要》读书笔记

    <Unity Shader 入门精要>读书笔记 --记录一下自己看书时遇到的一下困惑的地方和自己的一些想法,愿明天的我更加强大 1.要正确获得阴影和光照衰减效果,需要#pragma mul ...

  3. 《Unity Shader入门精要》笔记:高级篇(3)以及扩展

    本篇博客主要为个人学习所编写读书笔记,不用于任何商业用途,以及不允许任何人以任何形式进行转载. 本篇博客会补充一些扩展内容(例如其他博客链接). 本篇博客还会提供一些边读边做的效果截图.文章内所有数学 ...

  4. 【备份】《Unity Shader入门精要》配图

    说明:本页面是书籍<Unity Shader入门精要>的随书彩图集锦,包含了书中所有的插图,使用时可通过图片编号进行搜索.  作者:冯乐乐  邮箱:lelefeng1992@gmail.c ...

  5. 【备忘】《Unity Shader入门精要》随书彩色插图

    转载来源:http://www.manew.com/blog-194008-42590.html <Unity Shader入门精要>随书彩色插图 <Unity Shader入门精要 ...

  6. 《Unity Shader入门精要》随书彩色插图

    说明:本页面是书籍<Unity Shader入门精要>的随书彩图集锦,包含了书中所有的插图,使用时可通过图片编号进行搜索.  作者:冯乐乐  邮箱:lelefeng1992@gmail.c ...

  7. unity shader入门精要_Unity Shader 入门(一):渲染流水线

    一.参考与说明(需要写在开始东西): 1.1 Unity Shader 入门紧要学习 candycat1992/Unity_Shaders_Book​github.com 1.2 还有一些图形学的历史 ...

  8. 《Unity Shader入门精要》笔记02 第1章+第2章

    基础篇 第1章+第2章 --本系列是基于人民邮电出版社<Unity Shader入门精要>(冯乐乐著 )的自学Unity Shader笔记,如果您发现了本文的纰漏,还望不吝指正. 基础篇 ...

  9. 《Unity Shader入门精要》笔记01 前言

    <Unity Shader入门精要>笔记01 前言 --本系列是基于人民邮电出版社<Unity Shader入门精要>(冯乐乐著 )的自学Unity Shader笔记,如果您发 ...

最新文章

  1. jupyter notebook 删除指定kernel
  2. 图解linux下top命令的使用
  3. python怎样定义_python dict如何定义
  4. MouseColor | 颜色获取及转换工具
  5. 数据结构基础(1) --Swap Bubble-Sort Select-Sort
  6. 关于轻重边及树链剖分该怎么写...
  7. dhcp snooping华为_使用DHCP snooping 功能防止DHCP Server仿冒者攻击(华为交换机)
  8. python:安装pycaret2.2.3(pytorch版本为1.7.1)
  9. 适合人工智能的编程语言有哪些
  10. 混响时间测试软件安卓版,混响时间的测量方法资料.pdf
  11. 无刷驱动设计——浅谈MOS驱动电路
  12. dell笔记本指示灯闪烁_Dell笔记本电源灯黄灯一直闪烁是什么问题 争决方法
  13. JAVA提取纯文本_从常见文档中提取纯文本内容 | IT人生录
  14. matlab中complex,complex_-complex在C语言中是什么意思呀!
  15. 在Composure去除掉对体积云和雾的捕获
  16. 菜菜的刷题日记 | 66.加一 Plus One
  17. 电动汽车充电需求的深度时空预测
  18. MATLAB——基于图像相减的纸牌识别系统
  19. SQL建表语句(建立学生_课程数据库)
  20. 智能ai文章伪原创工具-智能ai文章原创处理系统

热门文章

  1. imuupdate() 解算
  2. Visio画图导出PDF矢量图并裁剪,只需有visio就行,简单好操作
  3. 【开工】知道创宇网络安全线上服务指南
  4. Mqtt精髓系列之精简之道
  5. vue-H5缩放屏幕以及IOS滚动不流畅
  6. 拆掉思维里的墙:亲身经历后才能明白?
  7. 【C++】vector的基本使用
  8. ctfshow 萌新赛 劝退警告
  9. 考研数学1-考试大纲(2022年)
  10. 移动端APP测试总结(二)