以绘制棋盘格为例,对比内置管线和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.cginc Packages/com.unity.render-pipelines.universal/ShaderLibrary
后处理支持 有限支持 更强大的后处理系统

Shader迁移到URP的步骤

基础修改

  • 在SubShader的Tags中添加"RenderPipeline"="UniversalPipeline"
  • CGPROGRAM/ENDCG替换为HLSLPROGRAM/ENDHLSL
  • 替换包含文件:#include "UnityCG.cginc" → #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

数据类型和函数调整

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

使用迁移工具

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

验证和优化

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

迁移注意事项

不兼容功能处理

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

性能优化

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

棋盘格Shader实现

内置Checkerboard.shader

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

URP Checkerboard.shader

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开始探索游戏渲染】专栏-直达

(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,)

【URP】Shader绘制棋盘格对比内置管线的更多相关文章

  1. [Unity] Shader(着色器)之固定管线

    在Unity中,固定管线Shader的性能是最好的. 什么是固定管线呢? 固定渲染管线 —— 这是标准的几何&光照(T&L)管线,功能是固定的,它控制着世界.视.投影变换及固定光照控制 ...

  2. Shader预处理宏、内置状态变量、多版本编译等

    预定义shader预处理宏: Target platform: SHADER_API_OPENGL - desktop OpenGL SHADER_API_D3D9 - Direct3D SHADER ...

  3. MFC绘制棋盘格

    (1)新建立一个MFC空白的基于视类的工程 (2)在View类中重写OnPaint消息 void CMy005View::OnPaint() { CPaintDC dc(this); // devic ...

  4. Stage3d 由浅到深理解AGAL的管线vertex shader和fragment shader || 简易教程 学习心得 AGAL 非常非常好的入门文章

    Everyday Stage3D (一) Everyday Stage3D (二) Triangle Everyday Stage3D (三) AGAL的基本概念 Everyday Stage3D ( ...

  5. Unity3D -- shader语法内置函数

    该篇是Unity Shader中HLSL的内置函数,主要是一些数学方面的计算函数.在写Shader的时候可以直接使用. abs //计算输入值的绝对值. acos //返回输入值反余弦值. all / ...

  6. Vulkan Tutorial 11 Shader modules

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 与之前的图像API不同,Vulkan中的着色器代码必须以二进制字节码的格式使用,而不 ...

  7. Unity3D Shader基础教程

    原文地址:http://bbs.9ria.com/thread-212557-1-1.html 此教程将指引你如何建立自己的Shaders,让你的游戏场景看起来更好.Unity配备了强大的阴影和材料的 ...

  8. Unity3D Shader性能排行

    整体上,性能由高到低: Unlit,仅为纹理,光线不产生效果 VertexLit Diffuse 漫反射 Normal Mapped 法线贴图 Specular 高光 Normal Mapped Sp ...

  9. 【淡墨Unity3D Shader计划】五 圣诞用品: Unity在Shader三种形式的控制&amp;混合操作编译

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/42060963 作者:毛星云(浅墨)  ...

  10. OpenGL Shader Key Points (1)

    1.  Shader起步 1.1.  可编程管线 仅考虑Vertex shader和fragment shader: 1.2.  Shader Object 在编译阶段生成,把shader源代码编译成 ...

随机推荐

  1. 4.Java SDK源码分析系列笔记-LinkedList

    目录 1. 是什么 2. 如何使用 3. 原理分析 3.1. uml 3.2. 构造方法 3.3. add方法 3.3.1. 确保容量足够容纳新的元素 3.3.2. 把元素放入数组最后一个位置 3.4 ...

  2. HarmonyOS NEXT仓颉开发语言实战案例:外卖App

    各位周末好,今天为大家来仓颉语言外卖App的实战分享. 我们可以先分析一下页面的布局结构,它是由导航栏和List容器组成的.幽蓝君目前依然没有找到仓颉语言导航栏的系统组件,还是要自定义,这个导航栏有三 ...

  3. [Ynoi2014] 置身天上之森

    题传 其实做过由乃打扑克的话思路并不难.但写代码的时候把写由乃打扑克的 bug 全部复现了属实难蚌 注意到线段树不同区间长度是 \(O(\log n)\) 的,因此我们对于每种长度建一个序列,对于 1 ...

  4. SQL Server中使用临时表进行数据备份与恢复

    在日常的数据库管理中,我们经常需要对数据进行备份和恢复操作.SQL Server提供了多种工具和命令来帮助我们完成这些任务.本文将介绍一种简单的方法,即使用临时表来备份特定记录,清空表,然后将数据恢复 ...

  5. 华为机试题 Sudoku

    简介 使用回溯算法. 其实回溯算法属于暴力算法. 进行一定的减枝算法即可. 这里要使用弱检查, 全局flag 进行退出. code #include <iostream> #include ...

  6. nii.gz 简介

    简介 这是一种医学设备生成的文件.实际上是一个三维矩阵. 用matlab的niftiread函数可以进行读取. Tips 对于大型文件的读取不知道 matlab做了什么优化比python的nibabe ...

  7. 阿里巴巴为什么禁止超过3张表join?

    前言 2017年,<阿里巴巴Java开发手册> 中一条规定掀起技术圈巨浪:"禁止超过三张表进行join操作". 时至今日,这条规范仍被众多企业奉为圭臬. 但背后原因你真 ...

  8. iPaaS平台是什么?通过IDC报告推荐iPaaS排名靠前厂商!

    一.什么是iPaaS平台? iPaaS(Integration Platform as a Service)即集成平台即服务,是一种基于云计算的集成解决方案,旨在帮助企业实现不同系统.应用程序.数据源 ...

  9. SciTech-EECS-MCU-STM32: 高精度实时测量: 电压、电流

    硬件开发>单片机>STM32: 电流电压检测模块 参考Links MCU实现高精度的PWM输出和电流采样 - 21ic论坛 Analog.com: 宽动态范围的高端电流 检测:三种解决方案 ...

  10. 【电脑技巧】CPU正常运行时间过长,怎么解决?--九五小庞

    1.问题描述不少同志都遇到过这样的问题:按[Ctrl + alt + delete]打开任务管理器,切到"性能"选项卡下,发现自己电脑的CPU正常运行时间竟然为好几十天!很多人担心 ...