当前位置: 首页 > news >正文

UnityShader(十九) AlphaBlend

上代码:

Shader "Shader入门/透明度效果/AlphaBlendShader"
{Properties{_MainTex ("Texture", 2D) = "white" {}_AlphaScale("AlphaScale",Range(0,1))=1.0}SubShader{Tags { "RenderType"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }Pass{ZWrite On ColorMask 0}Pass{Tags{"LightMode"="ForwardBase"}ZWrite Off Blend SrcAlpha OneMinusSrcAlphaCGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"struct appdata{float4 vertex : POSITION;float2 texcoord : TEXCOORD0;float3 normal : NORMAL;};struct v2f{float4 pos : SV_POSITION;float2 uv : TEXCOORD0;float3 normal_world : TEXCOORD1;float3 pos_world : TEXCOORD2;};sampler2D _MainTex;float4 _MainTex_ST;float _AlphaScale;v2f vert (appdata v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);o.normal_world = mul(v.normal,unity_WorldToObject);o.pos_world = mul(unity_ObjectToWorld,v.vertex);return o;}fixed4 frag (v2f i) : SV_Target{half3 worldNormal = normalize(i.normal_world);half3 worldLightDir = UnityWorldSpaceLightDir(i.pos_world);// sample the texturefixed4 col = tex2D(_MainTex, i.uv);fixed3 abledo = col.rgb;fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz*abledo;fixed3 diffuse = _LightColor0.rgb*abledo*max(0,dot(worldNormal,worldLightDir));fixed3 final_color = ambient+diffuse;return fixed4(final_color,col.a*_AlphaScale);}ENDCG}}
}

效果:

在代码中我们有两个Pass,首先在第二个Pass中我们实现了AlphaBlend的基础实现,关闭了深度写入和进行了混合,对于上述的混合模式,实际为:

Blend SrcFactor DstFactor(开启混合,并设置混合因子。源颜色【该片元产生的颜色】会乘以SrcFactor,而目标颜色【已经存在于颜色缓存中的颜色】会乘以DstFactor,最后两者相加)

及:DstColor_{new}=SrcAlpha*SrcColor+(1-SrcAlpha)*DstColor_{old}

而对于第一个Pass是开启了深度写入和颜色遮罩进行不输出颜色操作,这样可以解决复杂模型间存在深度的问题效果

ColorMask  RGB|A|0|任何其它的R、G、B

当设置为0时意味着该Pass不写入任何颜色通道,即不会输出任何颜色。 

http://www.lryc.cn/news/322930.html

相关文章:

  • 3D Tiles语义分割流水线
  • txt、pdf等文件转为一行一行的doccano数据集输入格式
  • java Flink(四十二)Flink的序列化以及TypeInformation介绍(源码分析)
  • 社科赛斯考研:二十二载岁月铸辉煌,穿越周期的生命力之源
  • 【视频图像取证篇】模糊图像增强技术之锐化类滤波场景应用小结
  • win10 禁止谷歌浏览器自动更新(操作贼简单)
  • LeetCode每日一题【24. 两两交换链表中的节点】
  • jeecg启动Sentinel 一直是空白页面 解决办法用 外部 Sentinel SpringCloud之Sentinel概述和安装及简单整合
  • 易基因:人类大脑的单细胞DNA甲基化和3D基因组结构|Science
  • Nginx中设置反向代理
  • 无线局域网——wlan
  • ASP.NET 服务器控件
  • [数据集][目标检测]麻雀检测数据集VOC+YOLO格式1157张1类别
  • 嵌入式学习第二十九天!(数据结构的概念、单向链表)
  • 【ZooKeeper】2、安装
  • 通过Pytest 多数据库连接实例了解Python工厂模式与单例模式的区别
  • 超拟人语音合成上线,打造有温度的交互新体验
  • word 及PPT 中修改公式字体
  • 将数据转换成xml格式的文档并下载
  • 深入理解与实践AB测试:从理论到实战案例解析
  • flask之请求钩子
  • COPY requires at least two arguments, docker COPY 报错
  • 权限提升-Web权限提升篇划分获取资产服务后台系统数据库管理相互转移
  • 【Unity每日一记】unity中的内置宏和条件编译(Unity内置脚本符号)
  • 发现有一个会Python的男友魅力值杠杠的!!!
  • SQL日期函数
  • C语言经典面试题目(二十六)
  • 创建一个electron-vite项目
  • Codeforces Round 935 (Div. 3)A~E
  • ES: spring boot中使用ElasticsearchClient