关键修改说明
使用Universal Render Pipeline的Shader路径和HLSLPROGRAM。
添加_Color属性并与顶点颜色相乘,支持通过材质和Sprite Renderer调整颜色。
包含URP的核心头文件Core.hlsl,替换旧的UnityCG.cginc。
使用URP的坐标转换宏TransformObjectToHClip。
在片段着色器中将纹理颜色与顶点颜色混合,确保颜色修改生效。
其他注意事项:
在URP项目中,确保材质使用的Shader路径正确。
如果仍需全局光照,需在URP中启用2D光照并确保Sprite受光照影响(可能需要额外Pass或使用URP的Lightweight Renderer设置)。
修改后,Shader将正确响应颜色修改,并在URP管线中正常工作。
旧的shader
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| Shader "Hidden/Wave" { Properties { _MainTex ("Texture", 2D) = "white" { } _WaveAmount ("Wave Amount", Range(0, 25)) = 7 //������ƫ��ֵ _WaveSpeed ("Wave Speed", Range(0, 25)) = 10 //�����ٶ� _WaveStrength ("Wave Strength", Range(0, 25)) = 7.5 //�����ķ��ȴ�С _WaveX ("Wave X Axis", Range(0, 1)) = 0 //������ԭ��X _WaveY ("Wave Y Axis", Range(0, 1)) = 0.5 //������ԭ��Y
} SubShader { Tags { "Queue" = "Transparent" } Blend SrcAlpha OneMinusSrcAlpha
Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex; float4 _MainTex_ST; float _WaveAmount, _WaveSpeed, _WaveStrength, _WaveX, _WaveY;
struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; };
struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; };
v2f vert(appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; }
fixed4 frag(v2f i) : SV_Target { float2 uvWave = half2(_WaveX * _MainTex_ST.x, _WaveY * _MainTex_ST.y) - i.uv;//�õ�һ������ڵ�ǰ����λ�õIJ������� uvWave.x *= _ScreenParams.x / _ScreenParams.y;//���������һ����Ļ���߱ȵ����ӣ�Ŀ�����ڷǷ�����Ļ�ϱ��ֲ��˵ı��� float waveTime = _Time.y; //ʹ�� sqrt(dot(uvWave, uvWave)) ���Եõ������ij��ȣ���������ģ //���ǽ����˵�ǿ�Ȳ���_WaveAmount���Բ��˵ij��ȣ��Ե������˵�����ǿ�� //�����������ǴӲ��˵�ǿ���м�ȥ��һ������ʱ������� float angWave = (sqrt(dot(uvWave, uvWave)) * _WaveAmount) - ((waveTime * _WaveSpeed));//���㲨�˵ĽǶ� //��һ�д��뽫��ǰ���ص���������i.uvƫ����һ��������ƫ�����ɲ�������uvWave���Ƕ�angWave�Ͳ���ǿ��_WaveStrength���� i.uv = i.uv + uvWave * sin(angWave) * (_WaveStrength / 1000.0);//ʹ�����Һ�������������Ч�� fixed4 col = tex2D(_MainTex, i.uv);//����
return col; } ENDCG } } }
|
新的shader
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| Shader "Universal Render Pipeline/2D/Sprite/Wave" { Properties { _MainTex ("Texture", 2D) = "white" {} [HDR] _Color ("Color", Color) = (1,1,1,1) // 添加颜色属性 _WaveAmount ("Wave Amount", Range(0, 25)) = 7 _WaveSpeed ("Wave Speed", Range(0, 25)) = 10 _WaveStrength ("Wave Strength", Range(0, 25)) = 7.5 _WaveX ("Wave X Axis", Range(0, 1)) = 0 _WaveY ("Wave Y Axis", Range(0, 1)) = 0.5 } SubShader { Tags { "Queue" = "Transparent" "RenderType" = "Transparent" "RenderPipeline" = "UniversalPipeline" } Blend SrcAlpha OneMinusSrcAlpha
Pass { HLSLPROGRAM #pragma vertex vert #pragma fragment frag #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
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; float4 _MainTex_ST; float _WaveAmount, _WaveSpeed, _WaveStrength, _WaveX, _WaveY; half4 _Color; // 声明颜色属性
v2f vert(appdata v) { v2f o; o.vertex = TransformObjectToHClip(v.vertex.xyz); o.uv = TRANSFORM_TEX(v.uv, _MainTex); o.color = v.color * _Color; // 合并顶点颜色和材质颜色 return o; }
half4 frag(v2f i) : SV_Target { float2 uvWave = float2(_WaveX * _MainTex_ST.x, _WaveY * _MainTex_ST.y) - i.uv; uvWave.x *= _ScreenParams.x / _ScreenParams.y; float waveTime = _Time.y; float angWave = (length(uvWave) * _WaveAmount) - (waveTime * _WaveSpeed); i.uv += uvWave * sin(angWave) * (_WaveStrength / 1000.0); half4 col = tex2D(_MainTex, i.uv); col *= i.color; // 应用颜色混合 return col; } ENDHLSL } } }
|