Unity 在URP中將shader更新為了HLSL語言,使用build-in shader 無法直接在URP中使用
這里講一下關于shader的更新方法
參考 From Built-in to URP
更新步驟
-
Tags
添加"RenderPipeline" = "UniversalPipeline"
-
CGPROGRAM
ENDCG
改變?yōu)?HLSLPROGRAM
ENDHLSL
-
#include "UnityCG.cginc"
更改為#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
-
fixed4
類型更改為half4
-
函數(shù)替換對照
Build-in RP | URP |
---|---|
UnityObjectToClipPos(v.vertex); | TransformObjectToHClip(v.vertex.xyz); |
mul(unity_ObjectToWorld,v.vertex).xyz | TransformObjectToWorld(v.vertex.xyz) |
mul(float4(v.normal, 0.0),unity_WorldToObject).xyz /UnityObjectToWorldNormal(v.normal) | TransformObjectToWorldNormal(v.normal) |
代碼
上代碼 一個簡單的uv流動shader
內置渲染管線
// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
Shader "Custom/liuguang"
{
Properties
{
_FlowTex("Texture", 2D) = "white" {}
_FlowTilling("Flow Tilling",Vector) = (1,1,0,0)
_FlowSpeed("Flow Speed",Vector) = (1,1,0,0)
}
SubShader
{
Tags { "Queue" = "Transparent" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
float3 normal : NORMAL;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 pos : SV_POSITION;
float3 pos_world : TEXCOORD1;
float3 normal_world : TEXCOORD2;
float3 pivot_world : TEXCOORD3;
};
sampler2D _FlowTex;
float4 _FlowTilling;
float4 _FlowSpeed;
v2f vert(appdata v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
float3 normal_world = mul(float4(v.normal, 0.0),unity_WorldToObject).xyz;
o.normal_world = normalize(normal_world);
o.pos_world = mul(unity_ObjectToWorld,v.vertex).xyz;
o.pivot_world = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz;
o.uv = v.texcoord;
return o;
}
fixed4 frag(v2f i) : SV_Target
{
half2 uv_flow = (i.pos_world.xy - i.pivot_world.xy) * _FlowTilling.xy;
uv_flow = uv_flow + _Time.y * _FlowSpeed.xy;
float4 flow_rgba = tex2D(_FlowTex, uv_flow);
return flow_rgba;
}
ENDCG
}
}
}
URP文章來源:http://www.zghlxwxcb.cn/news/detail-451440.html
Shader "Custom/flowlight"
{
Properties
{
_FlowTex("Texture", 2D) = "white" {}
_FlowTilling("Flow Tilling",Vector) = (1,1,0,0)
_FlowSpeed("Flow Speed",Vector) = (1,1,0,0)
}
SubShader
{
Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }
LOD 100
Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
struct appdata
{
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
float3 normal : NORMAL;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 pos : SV_POSITION;
float3 pos_world : TEXCOORD1;
float3 normal_world : TEXCOORD2;
float3 pivot_world : TEXCOORD3;
};
sampler2D _FlowTex;
float4 _FlowTilling;
float4 _FlowSpeed;
v2f vert(appdata v)
{
v2f o;
o.pos = TransformObjectToHClip(v.vertex.xyz);
float3 normal_world = TransformObjectToWorldNormal(v.normal);
o.normal_world = normalize(normal_world);
o.pos_world = TransformObjectToWorld(v.vertex.xyz);
o.pivot_world = TransformObjectToWorld(float3(0,0,0));
o.uv = v.texcoord;
return o;
}
half4 frag(v2f i) : SV_Target
{
half2 uv_flow = (i.pos_world.xy - i.pivot_world.xy) * _FlowTilling.xy;
uv_flow = uv_flow + _Time.y * _FlowSpeed.xy;
float4 flow_rgba = tex2D(_FlowTex, uv_flow);
return flow_rgba;
}
ENDHLSL
}
}
}
多pass的情況
對于跟光照相關的shader ,遷移到urp可能會只執(zhí)行第一個pass
需要通過lightmode 鎖定到pass上
urp最多支持三個pass ,按如下的順序為pass 添加tag即可Tags{"LightMode" = "SRPDefaultUnlit"}
Tags{"LightMode" = "UniversalForward"}
Tags{"LightMode" = "LightweightForward"}
文章來源地址http://www.zghlxwxcb.cn/news/detail-451440.html
到了這里,關于Unity Shader從內置渲染管線遷移到URP的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!