深入URP之Shader篇1: URP Shader概述
admin
2024-03-09 09:46:43
0次

关于本系列

使用和学习研究Unity URP已经两年多了,最近也一直在做基于URP的项目的Shader优化工作。发现学习研究URP的Shader代码是理解URP渲染机制的一个非常好的方式,因为无论渲染管线如何架构,Unity内置的渲染机制如何设计,最终都要落在Shader代码上去将这一切渲染出来。在研读URP以及SRP Core的Shader代码的过程中,经常会有原来如此的感叹,这样会对Unity/URP的渲染机制有更清晰和更深刻的认识。另一方面,URP/SRP自带的Shader代码是我们学习写SRP自定义Shader的非常好的材料,URP Shader代码中会调用URP Shader Library和SRP Shader Library中的Shader代码,这些代码是Unity提炼出来的公共核心代码,很好的掌握它们的使用,可以让我们写自己的Shader更加轻松,并且增强Shader的可读性。本系列文章以分析URP自带的Shader代码为线索,并一路挖掘相关的Library代码,以及这背后的渲染机制。同时本系列文章也会用一定篇幅讲解如何编写自定义的Shader代码,并兼容于SRP Batcher和GPU Instancing。

URP Shader简介

我们知道,URP和HDRP都是基于SRP的,尽管现在可以使用Shader Graph编写Shader,但是手写Shader仍然是有一定的优势,特别是在性能方面,手写Shader可以更极致的优化,因此我们在项目中前期都是直接使用Shader Graph编写Shader,项目后期会改成手写Shader来提高性能。而在SRP中手写Shader,我们仍然使用的是Shader Lab,这个结构并没有太大的变化,但是SRP Shader中使用Shader Lab语言还是有几点不同。

  • 首先,我们使用 HLSL 而不是 CG语言,尽管这不是强制的,但是HLSL是官方推荐的,并且URP的Shader都是HLSL编写的,包括Shader Library中的核心公共代码。因此在编写SRP Shader时,HLSL是最佳选择。
  • SubShader的Tags,需要指定RenderPipeline,例如"RenderPipeline" = "UniversalPipeline"表示这是一个URP的Shader。
    SubShader{Tags {"RenderType" = "Opaque" "IgnoreProjector" = "True" "RenderPipeline" = "UniversalPipeline" "ShaderModel"="4.5"}}
  • Pass的Tags中的LightMode和内置流水线不同,这是由于URP的渲染管线和内置管线不同,在内置管线中,LightMode表示了这个Pass处于管线中处理光照的哪个步骤,例如ForwardBase,ForwardAdd分别是前向流水线中的主光照pass和附加逐像素光照pass。而URP中,我们经常使用的有SRPDefaultUnlit,UniversalForward,ShadowCaster,DepthOnly等pass。这些LightMode表示了管线中不同步骤(pass)使用的Shader Pass。具体可参考文档URP ShaderLab Pass tags
  • 为了兼容SRP Batcher,Shader需要采用一些特殊的写法。简单来说,就是对于Properties中的属性,需要放到特定的CBuffer中,这个CBuffer的名字为UnityPerMaterial。另外对于Unity的内置属性,要放到UnityPerDraw的CBuffer中,且符合Unity的规则,这个我们在分析URP Shader代码时会看到。
  • 再提一个,如果要支持GPU Instancing,Shader代码还要使用另外的一组宏来修改,使得可以支持Instancing。这组宏其实也是支持SRP Batcher的,这个会有一篇文章详细说明。

URP Shader框架

在结束本篇之前,我们来看一个简单的URP Shader框架,以便对于URP Shader的整体结构有一个具体的认识。

Shader "Custom/URPShaderTemplate" {Properties {_BaseMap ("Main Texture", 2D) = "white" {}_BaseColor ("Tine Colour", Color) = (1, 1, 1, 1)       }SubShader { Tags { "RenderType"="Opaque""Queue"="Geometry""RenderPipeline"="UniversalPipeline" }HLSLINCLUDEENDHLSLPass {Name "Example"Tags { "LightMode"="UniversalForward" }HLSLPROGRAMENDHLSL}}
}

这个结构中包含了Properties, SubShader, Pass三件套,我们注意到HLSL代码除了是写在Pass中之外,还可以写在SubShader中,一般这儿会include一些公共代码。这个结构很简单,没有处理SRP Batcher兼容。下篇中,我们将分析真正的URP Shader: Unlit.shader。

相关内容

热门资讯

最新通报!微乐三打一透视功能a... 最新通报!微乐三打一透视功能app,微乐三打一一直真的是有透视app1、进入到微乐三打一是否有挂之后...
发现一款!淘讯大厅开挂功能技巧... 发现一款!淘讯大厅开挂功能技巧,淘讯大厅一直存在有开挂技巧在进入淘讯大厅软件靠谱后,参与本局比赛的八...
发现一款!新神盾透视挂功能方法... 发现一款!新神盾透视挂功能方法,新神盾真是存在有透视挂方法发现一款!新神盾透视挂功能方法,新神盾真是...
玩家实测!凤凰棋牌辅助功能攻略... 玩家实测!凤凰棋牌辅助功能攻略,凤凰棋牌其实真的有辅助攻略1、上手简单,内置详细流程视频教学,新手小...
一分钟教会你!63棋牌游戏中心... 一分钟教会你!63棋牌游戏中心透视挂功能app,63棋牌游戏中心一直有透视挂app1、这是跨平台的6...
玩家必看分享!七喜大厅透视功能... 玩家必看分享!七喜大厅透视功能app,七喜大厅好像存在有透视app1、七喜大厅辅助器安装包、七喜大厅...
一起来探讨!哥哥斗地主开挂功能... 一起来探讨!哥哥斗地主开挂功能方法,哥哥斗地主确实真的是有开挂方法哥哥斗地主脚本下载中分为三种模型:...
2024教程!325互动透视功... 2024教程!325互动透视功能方法,325互动一贯有透视方法在进入325互动软件靠谱后,参与本局比...
一起来探讨!星空互娱辅助功能工... 一起来探讨!星空互娱辅助功能工具,星空互娱真是是有辅助工具1.星空互娱 选牌创建新账号,点击进入游戏...
一分钟了解!Collision... 一分钟了解!Collision Story透视功能工具,Collision Story竟然是有透视工...