1、SRP中特殊的Tag:RenderPipeline
指定用哪个管线渲染
URP:UniversalPipeline
HDRP:HDRenderPipeline
SRP:你自定义的标签
2、Pass中首选语言为HLSL语言
Pass
{
HLSLPROGRAM
ENDHLSL
}
URP也支持CG语言。如果给Shader添加了CGPROGRAM/ENDCGPROGRAM块,Unity会自动include内置渲染管线的代码库,此时如果你再include SRP shader代码库,可能会有一些宏或者函数和内置渲染管线代码库冲突。此外,使用CG语言编写无法支持SRP Batcher。
3、CBUFFER
如果想要Shader和SRP Batcher兼容,需要将材质的所有属性定义在一个名为UnityPerMaterial的CBUFFER块中
写在顶点着色器之前
CBUFFER_START(UnityPerMaterial)
half4_BaseColor;
CBUFFER_END
4URP中可以引用URP特殊的库
Shader "MyShader/Unlit"
{
Properties
{
_Color("Base Color",Color)=(1,1,1,1)
}
SubShader
{
Tags
{
"RenderType"="Opaque" "RenderPipeline"="UniversalPipeline"
}
Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
struct Attributes
{
//OS object space
float4 positionOS:POSITION;
};
struct Varying
{
//这个结构体必须包含SV_POSITION,HCS是Homgeneous Clipping Space齐次裁剪空间
float4 positionHCS:SV_POSITION;
};
CBUFFER_START(UnityPerMaterial)
half4 _Color;
CBUFFER_END
Varyings vert(Attributes IN)
{
Varyings OUT;
OUT.positionHCS=TransformObjectToHClip(IN.positionOS.xyz);
return OUT;
}
half4 frag(Varyings IN):SV_Target
{
return Base
}
ENDHLSL
}
}
}