旧的shader无法在URP管线下渲染该做如何修改

文章发布时间:

最后更新时间:

页面浏览: 加载中...

关键修改说明

使用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
}
}
}