urp基础shader记录(AI)
·
主贴图+噪声图+饱和度
// 定义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"
}
更多推荐
所有评论(0)