主贴图+噪声图+饱和度

// 定义Shader的名称,在Unity的材质面板中显示为Custom/URPTextureSamplingShader
Shader "Custom/URPTextureSamplingShader"
{
    // 定义Shader的属性,这些属性可以在Unity的材质面板中进行调整
    Properties
    {
        // 主纹理,用于显示基础颜色,默认值为白色
        _MainTex ("Base (RGB)", 2D) = "white" {}
        // 噪声纹理,用于对UV坐标进行扰动,默认值为白色
        _NoiseTex ("Noise Texture", 2D) = "white" {}
        // 叠色颜色,用于与主纹理颜色相乘,默认值为白色(不改变颜色)
        _Color ("Tint Color", Color) = (1,1,1,1)
        // 噪声强度,控制噪声纹理对UV坐标的扰动程度,范围从0到1,默认值为0.1
        _NoiseStrength ("Noise Strength", Range(0, 1)) = 0.1
        // 饱和度调整值,控制颜色的饱和度,范围从0到2,默认值为1(不改变饱和度)
        _Saturation ("Saturation", Range(0, 2)) = 1
        // 噪声图的UV缩放,用于调节噪声图的重复和拉伸
        _NoiseUVScale ("Noise UV Scale", Vector) = (1, 1, 0, 0)
    }
    // 子着色器,包含具体的渲染逻辑
    SubShader
    {
        // 标签,指定渲染类型为不透明,渲染管线为通用渲染管线(URP)
        Tags { "RenderType"="Opaque" "RenderPipeline" = "UniversalRenderPipeline"}
        // 最低细节等级,这里设置为100
        LOD 100

        // 渲染通道,包含顶点着色器和片元着色器
        Pass
        {
            // 声明使用HLSL语言编写顶点着色器和片元着色器
            HLSLPROGRAM
            // 定义顶点着色器函数名为vert
            #pragma vertex vert
            // 定义片元着色器函数名为frag
            #pragma fragment frag

            // 包含通用渲染管线的核心HLSL库,提供常用的函数和变量
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            // 定义顶点输入结构体,包含顶点位置和UV坐标
            struct appdata
            {
                // 顶点位置,使用POSITION语义
                float4 vertex : POSITION;
                // UV坐标,使用TEXCOORD0语义
                float2 uv : TEXCOORD0;
            };

            // 定义顶点输出结构体,传递给片元着色器的信息
            struct v2f
            {
                // UV坐标,使用TEXCOORD0语义
                float2 uv : TEXCOORD0;
                // 裁剪空间的顶点位置,使用SV_POSITION语义
                float4 vertex : SV_POSITION;
            };

            // 主纹理采样器
            sampler2D _MainTex;
            // 主纹理的缩放和平移参数
            float4 _MainTex_ST;
            // 噪声纹理采样器
            sampler2D _NoiseTex;
            // 叠色颜色
            float4 _Color;
            // 噪声强度
            float _NoiseStrength;
            // 饱和度调整值
            float _Saturation;
            // 噪声图的UV缩放参数
            float4 _NoiseUVScale;

            // 顶点着色器函数,将顶点从物体空间转换到裁剪空间,并传递UV坐标
            v2f vert (appdata v)
            {
                v2f o;
                // 将顶点从物体空间转换到裁剪空间
                o.vertex = TransformObjectToHClip(v.vertex.xyz);
                // 应用主纹理的缩放和平移参数到UV坐标
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }

            // 调整颜色饱和度的函数
            half3 AdjustSaturation(half3 color, float saturation)
            {
                // 计算颜色的亮度,使用ITU - R BT.709标准的权重
                half luminance = dot(color, half3(0.2126, 0.7152, 0.0722));
                // 创建一个亮度颜色,即所有通道值都等于亮度的颜色
                half3 luminanceColor = half3(luminance, luminance, luminance);
                // 在亮度颜色和原始颜色之间进行线性插值,根据饱和度值调整颜色的饱和度
                return lerp(luminanceColor, color, saturation);
            }

            // 片元着色器函数,计算最终的像素颜色
            fixed4 frag (v2f i) : SV_Target
            {
                // 应用噪声图的UV缩放
                float2 noiseUV = i.uv * _NoiseUVScale.xy;
                // 对噪声纹理进行采样,获取噪声值
                float4 noise = tex2D(_NoiseTex, noiseUV);
                // 使用噪声值对UV坐标进行扰动,噪声值范围从 - 0.5到0.5,乘以噪声强度
                float2 uv = i.uv + (noise.rg - 0.5) * _NoiseStrength;
                // 对主纹理进行采样,获取基础颜色
                fixed4 col = tex2D(_MainTex, uv);
                // 将基础颜色与叠色颜色相乘,实现叠色效果
                col.rgb *= _Color.rgb;
                // 调用AdjustSaturation函数,调整颜色的饱和度
                col.rgb = AdjustSaturation(col.rgb, _Saturation);
                // 返回最终的像素颜色
                return col;
            }
            // 结束HLSL代码块
            ENDHLSL
        }
    }
    // 回退Shader,如果当前Shader不支持,则使用Diffuse Shader
    FallBack "Diffuse"
}    

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐