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

相关文章

Redis 的 SUBSCRIBE命令详解

《Redis的SUBSCRIBE命令详解》Redis的SUBSCRIBE命令用于订阅一个或多个频道,以便接收发送到这些频道的消息,本文给大家介绍Redis的SUBSCRIBE命令,感兴趣的朋友跟随... 目录基本语法工作原理示例消息格式相关命令python 示例Redis 的 SUBSCRIBE 命令用于订

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶