【《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

相关文章

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

通过React实现页面的无限滚动效果

《通过React实现页面的无限滚动效果》今天我们来聊聊无限滚动这个现代Web开发中不可或缺的技术,无论你是刷微博、逛知乎还是看脚本,无限滚动都已经渗透到我们日常的浏览体验中,那么,如何优雅地实现它呢?... 目录1. 早期的解决方案2. 交叉观察者:IntersectionObserver2.1 Inter

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

java中ssh2执行多条命令的四种方法

《java中ssh2执行多条命令的四种方法》本文主要介绍了java中ssh2执行多条命令的四种方法,包括分号分隔、管道分隔、EOF块、脚本调用,可确保环境配置生效,提升操作效率,具有一定的参考价值,感... 目录1 使用分号隔开2 使用管道符号隔开3 使用写EOF的方式4 使用脚本的方式大家平时有没有遇到自