时间:2025-09-10 11:02
人气:
作者:admin
以绘制棋盘格为例,对比内置管线和URP中的Shader异同。
【从UnityURP开始探索游戏渲染】专栏-直达
| 对比维度 | 内置渲染管线 | URP |
|---|---|---|
| 编程语言 | 主要使用CG | 主要使用HLSL |
| SubShader标签 | 无特殊要求 | 需添加"RenderPipeline"="UniversalPipeline" |
| 光照处理 | 内置光照模型 | 基于物理渲染(PBS)系统 |
| 合批流程 | 传统合批 | 支持SRP Batcher |
| 数据类型 | 支持fixed类型 | 仅支持half/float类型 |
| 着色器库 | UnityCG.cginc | Packages/com.unity.render-pipelines.universal/ShaderLibrary |
| 后处理支持 | 有限支持 | 更强大的后处理系统 |
"RenderPipeline"="UniversalPipeline"CGPROGRAM/ENDCG替换为HLSLPROGRAM/ENDHLSL#include "UnityCG.cginc" → #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"fixed类型改为half或floatCBUFFER_START(UnityPerMaterial)块中以提高兼容性Shader "Custom/Checkerboard"
{
Properties
{
_GridSize ("Grid Size", Range(1, 100)) = 10
_Color1 ("Color 1", Color) = (1,1,1,1)
_Color2 ("Color 2", Color) = (0,0,0,1)
_HighlightColor ("Highlight Color", Color) = (1,0,0,1)
_HighlightCoord ("Highlight Coordinate", Vector) = (0,0,0,0)
}
SubShader
{
Tags { "RenderType"="Opaque" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
float _GridSize;
fixed4 _Color1;
fixed4 _Color2;
fixed4 _HighlightColor;
float2 _HighlightCoord;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv * _GridSize;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
float2 gridPos = floor(i.uv);
float pattern = fmod(gridPos.x + gridPos.y, 2.0);
// 检查是否是高亮坐标
if (gridPos.x == _HighlightCoord.x && gridPos.y == _HighlightCoord.y)
{
return _HighlightColor;
}
return pattern < 1.0 ? _Color1 : _Color2;
}
ENDCG
}
}
}
Shader "Universal Render Pipeline/Checkerboard"
{
Properties
{
_GridSize("Grid Size", Float) = 10
_Color1("Color 1", Color) = (1,1,1,1)
_Color2("Color 2", Color) = (0,0,0,1)
_HighlightColor("Highlight Color", Color) = (1,0,0,1)
_HighlightCoord("Highlight Coordinate", Vector) = (0,0,0,0)
}
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
{
float4 positionOS : POSITION;
float2 uv : TEXCOORD0;
};
struct Varyings
{
float2 uv : TEXCOORD0;
float4 positionHCS : SV_POSITION;
};
CBUFFER_START(UnityPerMaterial)
float _GridSize;
float4 _Color1;
float4 _Color2;
float4 _HighlightColor;
float2 _HighlightCoord;
CBUFFER_END
Varyings vert(Attributes IN)
{
Varyings OUT;
OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
OUT.uv = IN.uv * _GridSize;
return OUT;
}
half4 frag(Varyings IN) : SV_Target
{
float2 gridPos = floor(IN.uv);
float pattern = fmod(gridPos.x + gridPos.y, 2.0);
if (gridPos.x == _HighlightCoord.x && gridPos.y == _HighlightCoord.y)
{
return _HighlightColor;
}
return pattern < 1.0 ? _Color1 : _Color2;
}
ENDHLSL
}
}
}
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,????)