找回密码
 立即注册
首页 业界区 科技 【URP】Shader绘制棋盘格对比内置管线

【URP】Shader绘制棋盘格对比内置管线

敕码 前天 09:30
以绘制棋盘格为例,对比内置管线和URP中的Shader异同。
【从UnityURP开始探索游戏渲染】专栏-直达
异同简述


  • 面板属性定义Properties一样的
  • Tags主要区别在于RenderPipeline的声明
  • 这里没涉及到的渲染命令也是一样的。
  • 主要区别在Pass中使用CG还是HLSL
  • 其中引用的内置变量的库不同,内置引用UnityCG.cginc,而URP中引用URP包中的core.hlsl
  • 再有HLSL中定义变量 用静态缓冲宏定义包裹 ,CBUFFER_START(UnityPerMaterial),CBUFFER_END。内置中直接定义变量。
内置渲染管线与URP的基本概念对比

‌内置渲染管线(Built-in Render Pipeline)


  • Unity的默认渲染管线,采用固定架构设计
  • 基于传统的前向渲染和延迟渲染模式,代码高度耦合
  • 自定义选项有限,修改渲染流程需直接修改Unity源码
  • 使用CG语言编写Shader,支持Standard Shader等内置着色器
‌通用渲染管线(URP)


  • 基于可编程渲染管线(SRP)框架的模块化设计
  • 核心逻辑通过C#脚本控制,如RenderPipeline和RenderPass
  • 轻量且可扩展,专注于跨平台性能优化
  • 使用HLSL语言编写Shader,支持Shader Graph可视化编辑
Shader的具体差异对比

对比维度内置渲染管线URP‌编程语言‌主要使用CG主要使用HLSL‌SubShader标签‌无特殊要求需添加"RenderPipeline"="UniversalPipeline"‌光照处理‌内置光照模型基于物理渲染(PBS)系统‌合批流程‌传统合批支持SRP Batcher‌数据类型‌支持fixed类型仅支持half/float类型‌着色器库‌UnityCG.cgincPackages/com.unity.render-pipelines.universal/ShaderLibrary‌后处理支持‌有限支持更强大的后处理系统Shader迁移到URP的步骤

基础修改


  • 在SubShader的Tags中添加"RenderPipeline"="UniversalPipeline"
  • 将CGPROGRAM/ENDCG替换为HLSLPROGRAM/ENDHLSL
  • 替换包含文件:#include "UnityCG.cginc" → #include "ackages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
数据类型和函数调整


  • 将fixed类型改为half或float
  • 更新光照计算函数,使用URP提供的API
  • 将属性定义在CBUFFER_START(UnityPerMaterial)块中以提高兼容性
使用迁移工具


  • Unity官方提供Render Pipeline Converter工具
  • 可自动转换大部分标准Shader
  • 对于自定义Shader,需要手动调整
验证和优化


  • 检查材质在URP下的渲染效果
  • 优化性能,利用URP特性如SRP Batcher
  • 测试不同平台的表现
迁移注意事项

不兼容功能处理


  • 某些高级特效(如曲面细分)在URP中可能不支持
  • 需要寻找替代方案或使用HDRP
性能优化


  • URP更注重移动端性能,可减少不必要的计算
  • 使用URP的批处理功能提高渲染效率
棋盘格Shader实现

内置Checkerboard.shader
  1. Shader "Custom/Checkerboard"
  2. {
  3.     Properties
  4.     {
  5.         _GridSize ("Grid Size", Range(1, 100)) = 10
  6.         _Color1 ("Color 1", Color) = (1,1,1,1)
  7.         _Color2 ("Color 2", Color) = (0,0,0,1)
  8.         _HighlightColor ("Highlight Color", Color) = (1,0,0,1)
  9.         _HighlightCoord ("Highlight Coordinate", Vector) = (0,0,0,0)
  10.     }
  11.    
  12.     SubShader
  13.     {
  14.         Tags { "RenderType"="Opaque" }
  15.         
  16.         Pass
  17.         {
  18.             CGPROGRAM
  19.             #pragma vertex vert
  20.             #pragma fragment frag
  21.             #include "UnityCG.cginc"
  22.             
  23.             struct appdata
  24.             {
  25.                 float4 vertex : POSITION;
  26.                 float2 uv : TEXCOORD0;
  27.             };
  28.             
  29.             struct v2f
  30.             {
  31.                 float2 uv : TEXCOORD0;
  32.                 float4 vertex : SV_POSITION;
  33.             };
  34.             
  35.             float _GridSize;
  36.             fixed4 _Color1;
  37.             fixed4 _Color2;
  38.             fixed4 _HighlightColor;
  39.             float2 _HighlightCoord;
  40.             
  41.             v2f vert (appdata v)
  42.             {
  43.                 v2f o;
  44.                 o.vertex = UnityObjectToClipPos(v.vertex);
  45.                 o.uv = v.uv * _GridSize;
  46.                 return o;
  47.             }
  48.             
  49.             fixed4 frag (v2f i) : SV_Target
  50.             {
  51.                 float2 gridPos = floor(i.uv);
  52.                 float pattern = fmod(gridPos.x + gridPos.y, 2.0);
  53.                
  54.                 // 检查是否是高亮坐标
  55.                 if (gridPos.x == _HighlightCoord.x && gridPos.y == _HighlightCoord.y)
  56.                 {
  57.                     return _HighlightColor;
  58.                 }
  59.                
  60.                 return pattern < 1.0 ? _Color1 : _Color2;
  61.             }
  62.             ENDCG
  63.         }
  64.     }
  65. }
复制代码
URP Checkerboard.shader
  1. Shader "Universal Render Pipeline/Checkerboard"
  2. {
  3.     Properties
  4.     {
  5.         _GridSize("Grid Size", Float) = 10
  6.         _Color1("Color 1", Color) = (1,1,1,1)
  7.         _Color2("Color 2", Color) = (0,0,0,1)
  8.         _HighlightColor("Highlight Color", Color) = (1,0,0,1)
  9.         _HighlightCoord("Highlight Coordinate", Vector) = (0,0,0,0)
  10.     }
  11.     SubShader
  12.     {
  13.         Tags
  14.         {
  15.             "RenderType" = "Opaque"
  16.             "RenderPipeline" = "UniversalPipeline"
  17.         }
  18.         Pass
  19.         {
  20.             HLSLPROGRAM
  21.             #pragma vertex vert
  22.             #pragma fragment frag
  23.             #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
  24.             struct Attributes
  25.             {
  26.                 float4 positionOS   : POSITION;
  27.                 float2 uv           : TEXCOORD0;
  28.             };
  29.             struct Varyings
  30.             {
  31.                 float2 uv           : TEXCOORD0;
  32.                 float4 positionHCS  : SV_POSITION;
  33.             };
  34.             CBUFFER_START(UnityPerMaterial)
  35.                 float _GridSize;
  36.                 float4 _Color1;
  37.                 float4 _Color2;
  38.                 float4 _HighlightColor;
  39.                 float2 _HighlightCoord;
  40.             CBUFFER_END
  41.             Varyings vert(Attributes IN)
  42.             {
  43.                 Varyings OUT;
  44.                 OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
  45.                 OUT.uv = IN.uv * _GridSize;
  46.                 return OUT;
  47.             }
  48.             half4 frag(Varyings IN) : SV_Target
  49.             {
  50.                 float2 gridPos = floor(IN.uv);
  51.                 float pattern = fmod(gridPos.x + gridPos.y, 2.0);
  52.                 if (gridPos.x == _HighlightCoord.x && gridPos.y == _HighlightCoord.y)
  53.                 {
  54.                     return _HighlightColor;
  55.                 }
  56.                 return pattern < 1.0 ? _Color1 : _Color2;
  57.             }
  58.             ENDHLSL
  59.         }
  60.     }
  61. }
复制代码
【从UnityURP开始探索游戏渲染】专栏-直达

(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册