【着色器实现Overlay重新覆盖变装效果_Shader效果第九篇】

效果如下

请添加图片描述

属性栏如下

在这里插入图片描述

属性块:

关于属性的内容可以看这篇:【Unity Shader 中Properties 相关介绍】

    Properties
    {
        _MainTex ("Main Texture", 2D) = "white" {}
		_Color("Main Color", Color) = (1,1,1,1)
		_Alpha("General Alpha",  Range(0,1)) = 1

		_OverlayTex("Overlay Texture", 2D) = "white" {}
		_OverlayColor("Overlay Color", Color) = (1, 1, 1, 1)
		_OverlayGlow("Overlay Glow", Range(0,25)) = 1
		_OverlayBlend("Overlay Blend", Range(0, 1)) = 1
    }
  • Properties块定义了可以在材质编辑器中调整的属性。

SubShader块:

    SubShader
    {
        Tags {"Queue" = "Transparent" "RenderType"="Opaque" "IgnoreProjector" = "True" }        
        Blend SrcAlpha OneMinusSrcAlpha
        ZWrite Off
        Cull Off
  • 定义了一个子着色器。
  • Tags定义了渲染队列、渲染类型和投影忽略标记。
  • Blend定义了混合模式。
  • ZWriteCull控制深度写入和剔除。

CGPROGRAM:

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
  • 定义了一个渲染通道。
  • 使用了CGPROGRAM和相关指令来指定顶点和片段着色器。

appdata:

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
				half4 color : COLOR;
            };
  • 定义了顶点着色器的输入结构。

v2f:

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
				half4 color : COLOR;
            };
  • 定义了顶点着色器的输出结构。

声明采样:

            sampler2D _MainTex;
            half4 _MainTex_ST, _MainTex_TexelSize, _Color;
			half _Alpha;
            float _RandomSeed;

			sampler2D _OverlayTex;
			half4 _OverlayTex_ST, _OverlayColor;
			half _OverlayGlow, _OverlayBlend;
属性声明详细解释如下
名称注释
sampler2D _MainTex;声明了一个名为_MainTex的2D纹理采样器。这通常用于存储和采样主纹理图像。
名称注释
half4 _MainTex_ST, _MainTex_TexelSize, _Color;声明了三个half4类型的属性:
_MainTex_ST通常用于存储纹理的平铺(tiling)和偏移(offset)参数。
_MainTex_TexelSize存储纹理的像素尺寸,这有助于进行像素级的纹理操作。
_Color一个颜色值,用于修改或混合纹理的颜色。
名称注释
half _Alpha;这行代码声明了一个名为_Alpha的半精度浮点数(half)变量。这个变量可能用于控制着色器输出的透明度。
float _RandomSeed;这行代码声明了一个名为_RandomSeed的单精度浮点数(float)变量。这个变量可能用于生成随机值,常用于创建纹理的随机效果或其他需要随机性的场景。
sampler2D _OverlayTex;这行代码声明了一个名为_OverlayTex的2D纹理采样器。sampler2D是一种特殊的类型,用于在着色器中采样2D纹理图像。
half4 _OverlayTex_ST, _OverlayColor;这行代码声明了两个变量:
_OverlayTex_ST一个包含四个半精度浮点数的向量,通常用于存储纹理的平移(Tiling)和偏移(Offset)参数。
_OverlayColor一个包含四个半精度浮点数的颜色值,可能用于定义叠加纹理的颜色。
half _OverlayGlow, _OverlayBlend;这行代码声明了两个变量:
_OverlayGlow一个半精度浮点数,可能用于控制叠加纹理的发光效果。
_OverlayBlend一个半精度浮点数,可能用于控制叠加纹理与基础纹理的混合程度。

v2f vert顶点着色器函数:

            v2f vert (appdata v)
            {
                v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
				o.color = v.color;
                return o;
            }
  • 顶点着色器函数,转换顶点坐标和纹理坐标。

片段着色器结构体:

            half4 frag (v2f i) : SV_Target
            {
				// 片段着色器代码,负责生成扭曲轮廓效果
				// ...
            }
            ENDCG
        }
    }
  • 片段着色器函数,负责渲染最终像素颜色。
  • ENDCG标记CGPROGRAM代码块的结束。

片段着色器代码

            half4 frag (v2f i) : SV_Target
            {
				half4 col = tex2D(_MainTex, i.uv) * i.color;

				half4 overlayCol = tex2D(_OverlayTex, TRANSFORM_TEX(i.uv, _OverlayTex));
				overlayCol.rgb *= _OverlayColor.rgb * _OverlayGlow;
				overlayCol.rgb *= overlayCol.a * _OverlayColor.rgb * _OverlayColor.a * _OverlayBlend;
				col.rgb += overlayCol;
				col.a *= _Alpha;
				col *= _Color;
                return col;
            }

具体的代码注释如下:

片段着色计算注释
half4 col = tex2D(_MainTex, i.uv) * i.color;这行代码从名为_MainTex的纹理中,使用纹理坐标i.uv采样颜色,并与传入的颜色i.color相乘。half4是一个包含四个半精度浮点数的颜色值。
half4 overlayCol = tex2D(_OverlayTex, TRANSFORM_TEX(i.uv, _OverlayTex));这行代码从名为_OverlayTex的叠加纹理中采样颜色。TRANSFORM_TEX是一个宏或函数,用于将纹理坐标i.uv转换为叠加纹理的坐标。这通常涉及到平移和缩放操作,由_OverlayTex_ST变量控制。
overlayCol.rgb *= _OverlayColor.rgb * _OverlayGlow;这行代码调整叠加纹理的颜色。首先,将叠加纹理的颜色分量(RGB)乘以一个全局颜色_OverlayColor.rgb,然后乘以一个发光强度_OverlayGlow。这样可以增强叠加纹理的颜色效果。
overlayCol.rgb *= overlayCol.a * _OverlayColor.rgb * _OverlayColor.a * _OverlayBlend;这行代码进一步调整叠加纹理的颜色。首先,将叠加纹理的透明度(alpha)分量overlayCol.a与全局颜色_OverlayColor.rgb_OverlayColor.a相乘,然后乘以一个混合因子_OverlayBlend。这样可以控制叠加纹理的透明度和混合效果。
col.rgb += overlayCol;这行代码将调整后的叠加纹理颜色overlayCol加到基础纹理颜色col.rgb上。这样可以实现颜色的叠加效果。
col.a *= _Alpha;这行代码调整最终颜色的透明度。将基础纹理的透明度分量col.a乘以一个全局透明度_Alpha,这样可以控制最终输出的透明度。
col *= _Color;这行代码将最终颜色col与一个全局颜色_Color相乘。这样可以进一步调整最终颜色的亮度或色调。
return col;最后,返回最终计算得到的颜色值col
返回
	Fallback "Sprites/Default"
}

完整代码

Shader "Overlay"
{
    Properties
    {
        _MainTex ("Main Texture", 2D) = "white" {}
		_Color("Main Color", Color) = (1,1,1,1)
		_Alpha("General Alpha",  Range(0,1)) = 1

		_OverlayTex("Overlay Texture", 2D) = "white" {}
		_OverlayColor("Overlay Color", Color) = (1, 1, 1, 1)
		_OverlayGlow("Overlay Glow", Range(0,25)) = 1
		_OverlayBlend("Overlay Blend", Range(0, 1)) = 1
    }

    SubShader
    {
        Tags {"Queue" = "Transparent" "RenderType"="Opaque" "IgnoreProjector" = "True" }        
        Blend SrcAlpha OneMinusSrcAlpha
        ZWrite Off
        Cull Off
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

			#pragma shader_feature OVERLAY_ON
			#pragma shader_feature OVERLAYMULT_ON

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
				half4 color : COLOR;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
				half4 color : COLOR;
            };

            sampler2D _MainTex;
            half4 _MainTex_ST, _MainTex_TexelSize, _Color;
			half _Alpha;
            float _RandomSeed;

			sampler2D _OverlayTex;
			half4 _OverlayTex_ST, _OverlayColor;
			half _OverlayGlow, _OverlayBlend;

            v2f vert (appdata v)
            {
                v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
				o.color = v.color;
                return o;
            }

            half4 frag (v2f i) : SV_Target
            {
				half4 col = tex2D(_MainTex, i.uv) * i.color;

				half4 overlayCol = tex2D(_OverlayTex, TRANSFORM_TEX(i.uv, _OverlayTex));
				overlayCol.rgb *= _OverlayColor.rgb * _OverlayGlow;
				overlayCol.rgb *= overlayCol.a * _OverlayColor.rgb * _OverlayColor.a * _OverlayBlend;
				col.rgb += overlayCol;
				col.a *= _Alpha;
				col *= _Color;
                return col;
            }
            ENDCG
        }
    }
	Fallback "Sprites/Default"
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暴走约伯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值