[Unity]透明材质

这篇具有很好参考价值的文章主要介绍了[Unity]透明材质。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

学习目标:

Unity Shader的渲染渲染顺序中的透明材质


学习内容:

1、透明度测试

2、透明度混合

3、渲染队列

4、透明模型


缘由:一般渲染的话会根据深度缓冲来确定渲染顺序的,但是由于透明材质需要关闭深度写入,因为透明材质会混合队列中其他材质的颜色,不能用普通材质的方法来渲染,1和2分别讲两种实现透明的方式

1、透明度测试

        比较极端的测试,如果片元的透明度不满足某个阈值,那么会被直接舍弃,否则会跟不透明片元一样进行深度测试、深度写入等,不考虑关闭深度写入的问题,结果只会是完全透明或者不透明

2、透明度混合

        该方法可得到真正的半透明效果,核心理念是与将自身的透明度与已经存在颜色缓冲中的颜色进行混合,该方法要点是要记住如果是以  透明->不透明  物体的顺序进行渲染,那就先渲染不透明物体,再将颜色缓冲中的颜色与透明片元进行混合,如果反过来,是不透明->透明的话那么就不会渲染透明片元,所以渲染队列十分重要。

3、渲染队列

        渲染队列可以理解为多个火车车厢,分别为多个组,会根据队列索引号来渲染,每个队列都有特定功能 

[Unity]透明材质

我们上面讲过因为不能使用深度环存因此,渲染顺序十分重要,就有了渲染队列

4、透明模型

        本项目为书籍自带的模型,实际效果如下

[Unity]透明材质

        透明的部分为贴图特定的颜色分布,上面展示的是使用透明度测试的方法制作的,显示出来的两种极端要么完全消失,要么可见。

        代码如下

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Unity Shaders Book/Chapter 8/Alpha Test" {
	Properties {
		_Color ("Color Tint", Color) = (1, 1, 1, 1)
		_MainTex ("Main Tex", 2D) = "white" {}
		_Cutoff ("Alpha Cutoff", Range(0, 1)) = 0.5
	}
	SubShader {
		Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}//渲染队列名为AlphaTest,忽略投影器影响,规划到TransparentCutout这个组
		
		Pass {
			Tags { "LightMode"="ForwardBase" }//渲染模式是用前向渲染->还有一种叫延迟渲染
			
			CGPROGRAM
			
			#pragma vertex vert//顶点着色器
			#pragma fragment frag//片元着色器
			
			#include "Lighting.cginc"//添加内置变量
			
			fixed4 _Color;
			sampler2D _MainTex;
			float4 _MainTex_ST;
			fixed _Cutoff;
			
			struct a2v {//顶点着色器输入结构
				float4 vertex : POSITION;
				float3 normal : NORMAL;
				float4 texcoord : TEXCOORD0;
			};
			
			struct v2f {//顶点着色器输出结构
				float4 pos : SV_POSITION;
				float3 worldNormal : TEXCOORD0;
				float3 worldPos : TEXCOORD1;
				float2 uv : TEXCOORD2;
			};
			
			v2f vert(a2v v) {//顶点着色器
				v2f o;//顺序分别为切线空间、世界空间、世界坐标、纹理坐标进行变换最后返回
				o.pos = UnityObjectToClipPos(v.vertex);
				
				o.worldNormal = UnityObjectToWorldNormal(v.normal);
				
				o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
				
				o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
				
				return o;
			}
			
			fixed4 frag(v2f i) : SV_Target {
				fixed3 worldNormal = normalize(i.worldNormal);
				fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
				
				fixed4 texColor = tex2D(_MainTex, i.uv);//获取贴图坐标
				
				// Alpha test
				clip (texColor.a - _Cutoff);//如果不为负数则采用该片元,意义在于texColor为目标材质,Cutoff为材质参数,如果低于则表明为为透明材质
				// Equal to 
//				if ((texColor.a - _Cutoff) < 0.0) {
//					discard;//意义跟clip一样剔除掉该片元
//				}
				//计算环境光和漫反射将其计算后输出
				fixed3 albedo = texColor.rgb * _Color.rgb;
				
				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
				
				fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));
				
				return fixed4(ambient + diffuse, 1.0);
			}
			
			ENDCG
		}
	} 
	FallBack "Transparent/Cutout/VertexLit"
}

 另一种方法透明度混合,核心理念是要与颜色缓冲中的颜色混合得出透明片元的颜色,结果如下,透明则选择了整个材质

[Unity]透明材质

代码如下

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Unity Shaders Book/Chapter 8/Alpha Blend" {
	Properties {
		_Color ("Color Tint", Color) = (1, 1, 1, 1)
		_MainTex ("Main Tex", 2D) = "white" {}
		_AlphaScale ("Alpha Scale", Range(0, 1)) = 1
	}
	SubShader {
		Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
		
		Pass {
			Tags { "LightMode"="ForwardBase" }

			ZWrite Off
			Blend SrcAlpha OneMinusSrcAlpha
			
			CGPROGRAM
			
			#pragma vertex vert
			#pragma fragment frag
			
			#include "Lighting.cginc"
			
			fixed4 _Color;
			sampler2D _MainTex;
			float4 _MainTex_ST;
			fixed _AlphaScale;
			
			struct a2v {
				float4 vertex : POSITION;
				float3 normal : NORMAL;
				float4 texcoord : TEXCOORD0;
			};
			
			struct v2f {
				float4 pos : SV_POSITION;
				float3 worldNormal : TEXCOORD0;
				float3 worldPos : TEXCOORD1;
				float2 uv : TEXCOORD2;
			};
			
			v2f vert(a2v v) {
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				
				o.worldNormal = UnityObjectToWorldNormal(v.normal);
				
				o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
				
				o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
				
				return o;
			}
			
			fixed4 frag(v2f i) : SV_Target {
				fixed3 worldNormal = normalize(i.worldNormal);
				fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
				
				fixed4 texColor = tex2D(_MainTex, i.uv);
				
				fixed3 albedo = texColor.rgb * _Color.rgb;
				
				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
				
				fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));
				
				return fixed4(ambient + diffuse, texColor.a * _AlphaScale);
			}
			
			ENDCG
		}
	} 
	FallBack "Transparent/VertexLit"
}

 


总结:

        想要实现透明有两种方法,分别为透明度测试和透明度混合、核心表达出来的是1、如果不是透明就不显示 2、先渲染后面不透明物体再将颜色缓冲区中的数据混合得出透明物体的颜色,总体两者都需要注意渲染顺序文章来源地址https://www.toymoban.com/news/detail-501223.html

到了这里,关于[Unity]透明材质的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity Shader入门精要学习——透明效果

    要么完全透明,要么完全不透明。 实现简单,实质上是一种剔除机制,通过将不满足条件(通常使用小于某个阈值来判定,一般使用clip方法)的片元舍弃的方法来达到完全透明效果。这些被舍弃的片元不会再进行任何的处理,也不会对颜色缓冲产生任何影响,其余满足条件

    2024年02月17日
    浏览(47)
  • 学习100个Unity Shader (14) ---透明效果

    由”Queue“ 标签决定,索引号越小越早被渲染: 名称 队列索引号 Background 1000 Geometry 2000 AlphaTest 2450 Transparent 3000 Overlay 4000 某一片元的透明度小于某个阈值,即被舍弃,反之,按非透明物体处理,进行正常的深度测试和深度写入【不需要关闭深度写入】。 UnityObjectToClipPos 将顶

    2024年04月29日
    浏览(43)
  • Unity Shader学习记录(11) ——透明效果的实现方式

    1 透明效果的两种方法 透明是游戏中经常要使用的一种效果。在实时渲染中要实现透明效果,通常会在渲染模型时控制它的透明通道(Alpha Channel)。当开启透明混合后,当一个物体被渲染到屏幕上时,每个片元除了颜色值和深度值之外,它还有另一个属性一一透明度。 当透明度

    2024年02月07日
    浏览(42)
  • Unity中的渲染优化技术 -- Shader入门精要学习(15)

    本章中,我们将阐述一些 Unity 中常见的优化技术。这些优化技术都是和渲染相关的,例如,使用批处理、LOD 技术等。 游戏优化不仅是程序员的工作,更需要美工人员在游戏的美术上进行一定的权衡。例如,避免使用全屏的屏幕特效,避免使用计算复杂的 Shader,减少透明混合

    2024年01月18日
    浏览(39)
  • Unity-Chan Toon Shader卡通渲染学习

    (本文记录一下从0-1复刻UTS2,持续更新中) Unity-Chan Toon Shader  2.0 (UTS2)  是一款用于图像和视频的卡通着色器,旨在满足从事卡通着色 3DCG 动画的创作者的需求。 UTS2开源项目地址: GitHub - unity3d-jp/UnityChanToonShaderVer2_Project: UnityChanToonShaderVer2 Project / v.2.0.9 Release (1)3 Bas

    2024年02月04日
    浏览(49)
  • Unity | HDRP高清渲染管线学习笔记:材质系统Lit着色器

    目录 一、Lit着色器 1. Surface Options 2. Surface Inputs(表面输入) 3. Transparency Inputs 二、HDRP渲染优先级 目录 一、Lit着色器 1. Surface Options 2. Surface Inputs(表面输入) 3. Transparency Inputs 4. Emission Inputs(自发光输入) 二、HDRP渲染优先级        我们可以把现实世界中的物体分成不

    2024年02月12日
    浏览(51)
  • [Unity]透明材质

    Unity Shader的渲染渲染顺序中的透明材质 1、透明度测试 2、透明度混合 3、渲染队列 4、透明模型 缘由:一般渲染的话会根据深度缓冲来确定渲染顺序的,但是由于透明材质 需要关闭深度写入 ,因为透明材质会混合队列中其他材质的颜色,不能用普通材质的方法来渲染,1和

    2024年02月11日
    浏览(36)
  • Unity Shader 学习笔记(4)URP渲染管线带阴影PBR-Shader模板 -- 新增可自定义阴影颜色

    材质面板截图 功能实现(URP渲染管线下): 1、进一步优化Shader结构和算法; 2、包含PBR材质; 3、投射和接收阴影,并升级 支持自定义阴影颜色 ; 4、支持点光源照射(但不支持点光源阴影)。 通用渲染截图 自定义阴影颜色截图 完整代码: 写在最后: 1、在我的上一篇文

    2024年02月12日
    浏览(48)
  • Unity材质调节-金属、塑料、透明玻璃。​​

    大家好,我是雪下的新火,本文 以默认渲染管线为例简谈一下金属、塑料、玻璃三种材质效果。 1.1.单个材质 金属度调为0.85,光泽度调为0.65。 将灯光 强度增加至3,给全局一个亮度。 1.2.金属度贴图 金属度贴图我选择在QuixelBridge下载。 导入_Metalness后缀的贴图; 添加在Met

    2024年04月14日
    浏览(39)
  • unity shader 入门 全透明与半透明效果实现

    片元函数的fixed4类型的返回值的第4位即为阿尔法值,0代表完全不显示(透明),1代表完全显示。中间的数值代表半透明。但只修改这个值是不能直接修改透明度的,因为还要对队列等进行修改。 本文介绍透明度测试与透明度混合,前者只能制作全透明效果,后者可制作半透明

    2024年02月14日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包