【《Unity Shader入门精要》 提炼总结】(十四)第十四章·开启深度写入的半透明效果ShaderLab的混合命令双面渲染的透明效果

本文主要是介绍【《Unity Shader入门精要》 提炼总结】(十四)第十四章·开启深度写入的半透明效果ShaderLab的混合命令双面渲染的透明效果,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

 

 

本文由@唐三十胖子出品,转载请注明出处。  
文章链接:https://blog.csdn.net/iceSony/article/details/84673829

 

 

 

这篇文章将总结和提炼《Unity Shader入门精要》的第八章“透明效果”的内容。

通过这篇文章,你可以知道

1)开启深度写入的半透明效果

2)ShaderLab的混合命令

3)双面渲染的透明效果

一.开启深度写入的半透明效果

为了解决自身透明效果出错的问题

解决办法:第一个Pass开启深度写入但不输出颜色,仅将深度值写入深度缓冲区;第二个Pass的实现和透明度混合一样。

完整代码如下

Shader "sony/Shader188"
{Properties{_Diffuse("漫反射系数",Color) = (1.0,1.0,1.0,1.0)_MainTex("主纹理",2D) = "white"{}_Cutoff("透明度系数",Range(0,1)) = 0.5}SubShader{Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }Pass{ZWrite OffColorMask 0}Pass{Tags{ "LightMode" = "ForwardBase" }ZWrite OffBlend SrcAlpha OneMinusSrcAlphaCGPROGRAM#include "lighting.cginc"#pragma vertex vert#pragma fragment fragfloat4 _Diffuse;sampler2D _MainTex;float4 _MainTex_ST;fixed _Cutoff;struct a2v{float4 pos : POSITION;float3 normal : NORMAL;float4 texcoord:TEXCOORD0;};struct v2f{float4 pos : SV_POSITION;float3 worldNormal : TEXCOORD0;float2 uv:TEXCOORD1;};v2f vert(a2v v){v2f o;o.pos = UnityObjectToClipPos(v.pos);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);return o;}fixed4 frag(v2f i) : SV_Target{float3 worldNormal = i.worldNormal;float3 worldLightDir = UnityWorldSpaceLightDir(worldNormal);fixed4 texColor = tex2D(_MainTex, i.uv);float3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;float3 diffuse = _LightColor0.rgb * _Diffuse.rgb * texColor*max(0, dot(worldNormal, worldLightDir));return fixed4(ambient + diffuse,texColor.a * _Cutoff);}ENDCG}}Fallback "Transparent/Cutout/VertexLit"
}

新的Pass为的是剔除自身遮挡的片元,但不写入任何颜色通道

二.ShaderLab的混合命令

源颜色:片元着色器产生的颜色

目标颜色:颜色缓冲区的颜色

此时用到的都是包含RGBA四个通道的颜色

 

事实上在Unity中我们使用到Blend命令(Blend Off除外)

都会开启混合,但是在其他的API中我们要手动开启

例如在OpenGL,我们需要用glEnable开启混合

 

混合等式与参数

逐片元操作中包含模板测试->深度测试->混合->写入颜色缓冲区

这里的混合操作仅可高度配置。用到的命令如下

常用的写法

混合因子表

常见的混合配置&实现的效果

三.双面渲染的透明效果

这样就可以了上图左的效果

当然了你也可以通过Cull Front清除朝向摄像机的面

 

 

下一章我们要介绍更复杂的光照Shader&光照衰减&光照阴影

感谢阅读,下章见:)

这篇关于【《Unity Shader入门精要》 提炼总结】(十四)第十四章·开启深度写入的半透明效果ShaderLab的混合命令双面渲染的透明效果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/519846

相关文章

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Python给Excel写入数据的四种方法小结

《Python给Excel写入数据的四种方法小结》本文主要介绍了Python给Excel写入数据的四种方法小结,包含openpyxl库、xlsxwriter库、pandas库和win32com库,具有... 目录1. 使用 openpyxl 库2. 使用 xlsxwriter 库3. 使用 pandas 库

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

开启mysql的binlog日志步骤详解

《开启mysql的binlog日志步骤详解》:本文主要介绍MySQL5.7版本中二进制日志(bin_log)的配置和使用,文中通过图文及代码介绍的非常详细,需要的朋友可以参考下... 目录1.查看是否开启bin_log2.数据库会把日志放进logs目录中3.查看log日志总结 mysql版本5.71.查看

Git提交代码详细流程及问题总结

《Git提交代码详细流程及问题总结》:本文主要介绍Git的三大分区,分别是工作区、暂存区和版本库,并详细描述了提交、推送、拉取代码和合并分支的流程,文中通过代码介绍的非常详解,需要的朋友可以参考下... 目录1.git 三大分区2.Git提交、推送、拉取代码、合并分支详细流程3.问题总结4.git push

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

详解如何在React中执行条件渲染

《详解如何在React中执行条件渲染》在现代Web开发中,React作为一种流行的JavaScript库,为开发者提供了一种高效构建用户界面的方式,条件渲染是React中的一个关键概念,本文将深入探讨... 目录引言什么是条件渲染?基础示例使用逻辑与运算符(&&)使用条件语句列表中的条件渲染总结引言在现代