unity build-in 渲染管线升级urp渲染 shader篇

这篇具有很好参考价值的文章主要介绍了unity build-in 渲染管线升级urp渲染 shader篇。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        由于工作原因需要对项目进行升级,从build-in渲染管线升级到urp渲染管线,我自己对应的unity版本是2018.版本升级到2021.3.2版本,由于最近几年unity版本升级比较快,个体版本差异有所不同,如遇与版本不一致问题敬请谅解。以下是根据官网等系列网站整理的内容

1、property 属性变量需要在CBUFFER_START/CBUFFER_END中声明

CBUFFER_START(UnityPerMaterial)
    float4 _BaseMap_ST; // Texture tiling & offset inspector values
    float4 _BaseColor;
    float _BumpScale;
    float4 _EmissionColor;
    float _Smoothness;
    float _Cutoff;
CBUFFER_END

 

2、数据类型:

        UPR已经不支持fixed类型,应该改成half类型


3、内置着色器与URP着色器对应关系

Unity 内置着色器 通用渲染管线着色器
Standard Universal Render Pipeline/Lit
Standard (Specular Setup) Universal Render Pipeline/Lit
Standard Terrain Universal Render Pipeline/Terrain/Lit
Particles/Standard Surface Universal Render Pipeline/Particles/Lit
Particles/Standard Unlit Universal Render Pipeline/Particles/Unlit
Mobile/Diffuse Universal Render Pipeline/Simple Lit
Mobile/Bumped Specular Universal Render Pipeline/Simple Lit
Mobile/Bumped Specular(1 Directional Light) Universal Render Pipeline/Simple Lit
Mobile/Unlit (Supports Lightmap) Universal Render Pipeline/Simple Lit
Mobile/VertexLit Universal Render Pipeline/Simple Lit
Legacy Shaders/Diffuse Universal Render Pipeline/Simple Lit
Legacy Shaders/Specular Universal Render Pipeline/Simple Lit
Legacy Shaders/Bumped Diffuse Universal Render Pipeline/Simple Lit
Legacy Shaders/Bumped Specular Universal Render Pipeline/Simple Lit
Legacy Shaders/Self-Illumin/Diffuse Universal Render Pipeline/Simple Lit
Legacy Shaders/Self-Illumin/Bumped Diffuse Universal Render Pipeline/Simple Lit
Legacy Shaders/Self-Illumin/Specular Universal Render Pipeline/Simple Lit
Legacy Shaders/Self-Illumin/Bumped Specular Universal Render Pipeline/Simple Lit
Legacy Shaders/Transparent/Diffuse Universal Render Pipeline/Simple Lit
Legacy Shaders/Transparent/Specular Universal Render Pipeline/Simple Lit
Legacy Shaders/Transparent/Bumped Diffuse Universal Render Pipeline/Simple Lit
Legacy Shaders/Transparent/Bumped Specular Universal Render Pipeline/Simple Lit
Legacy Shaders/Transparent/Cutout/Diffuse Universal Render Pipeline/Simple Lit
Legacy Shaders/Transparent/Cutout/Specular Universal Render Pipeline/Simple Lit
Legacy Shaders/Transparent/Cutout/Bumped Diffuse Universal Render Pipeline/Simple Lit
Legacy Shaders/Transparent/Cutout/Bumped Specular Universal Render Pipeline/Simple Lit

4、Tags

  • SubShader的Tags中添加 "RenderPipeline" = "UniversalPipeline"

 

5、 通用结构

        URP推荐的hlsl ,CGPROGRAM-ENDCG 的格式不再做兼容

Built-in URP
CGPROGRAM
HLSLPROGRAM
HLSLPROGRAM
ENDCG
ENDHLSL
ENDHLSL
CGINCLUDE
HLSLINCLUDE
HLSLINCLUDE

6、shader include 文件

内容 Built-in 文件 URP文件
Core Unity.cginc Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl
Light AutoLight.cginc Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl
Shadows AutoLight.cginc Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl

其他包含的文件:

  • Packages/com.unity.render-pipelines.core/ShaderLibrary/SpaceTransforms.hlsl
  • Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderVariablesFunctions.hlsl
  • Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl
  • Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl
  • Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl
  • Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl
  • Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareOpaqueTextue.hlsl

 

7、 Light Modes

此标签的值可以让管线确定在执行渲染管线的不同部分时使用哪个通道。

如果没有在管线中设置 LightMode 标签,URP 将使用该通道的 SRPDefaultUnlit 标签值。

LightMode 标签可以具有以下值。

属性 描述
UniversalForward 对应build-in ForwardBase前向渲染
UniversalGBuffer 该通道会渲染对象几何体,但不评估任何光源影响。在 Unity 必须在延迟渲染路径中执行的通道中使用此标签值。
UniversalForwardOnly 该通道会渲染对象几何体并评估所有光源影响,类似于 LightMode 具有 UniversalForward 值的情况。与 UniversalForward 的区别在于,URP 可以将该通道用于前向渲染路径和延迟渲染路径两者。
如果在 URP 使用延迟渲染路径时某个通道必须使用前向渲染路径来渲染对象,请使用此值。例如,如果 URP 使用延迟渲染路径来渲染某个场景,并且该场景包含的某些对象具有不适合 G 缓冲区的着色器数据(例如透明涂层法线),则应使用此标签。
如果着色器必须在前向渲染路径和延迟渲染路径两者中进行渲染,请使用 UniversalForward 和 UniversalGBuffer 标签值声明两个通道。
如果着色器必须使用前向渲染路径进行渲染,而不管 URP 渲染器使用的渲染路径如何,请仅声明一个 LightMode 标签设置为 UniversalForwardOnly 的通道。
如果使用了 SSAO 渲染器功能,请添加一个 LightMode 标签设置为 DepthNormalsOnly 的通道。有关更多信息,请参阅 DepthNormalsOnly 值。
DepthNormalsOnly 将此值与延迟渲染路径中的 UniversalForwardOnly 结合使用。此值允许 Unity 在深度和法线预通道中渲染着色器。在延迟渲染路径中,如果缺少具有 DepthNormalsOnly 标签值的通道,则 Unity 不会在网格周围生成环境光遮挡。
Universal2D 该通道会渲染对象并评估 2D 光源影响。URP 在 2D 渲染器中使用此标签值。
ShadowCaster 该通道从光源的角度将对象深度渲染到阴影贴图或深度纹理中。
DepthOnly 该通道仅从摄像机的角度将深度信息渲染到深度纹理中。
Meta Unity 仅在 Unity 编辑器中烘焙光照贴图时执行该通道。Unity 在构建播放器时会从着色器中剥离该通道。
SRPDefaultUnlit 渲染对象时,使用此 LightMode 标签值绘制额外的通道。应用示例:绘制对象轮廓。此标签值对前向渲染路径和延迟渲染路径均有效。
当通道没有 LightMode 标签时,URP 使用此标签值作为默认值。

 

光照渲染方式对应

pass{
//Tasg{"LightMode" = "ForwardBase"}
//换成
Tags{"LightMode" = "UniversalForward"}
...
}

light mode 中build-in 对应UPR 

Built-in URP
ForwardBase UniversalForward
ForwardAdd 启动关键字_AddITIONAL_LIGHTS
Deferred and related UniversalGBuffer seems to have just been added to URP
Vertex and related
ShadowCaster ShadowCaster
MotionVectors 已经不支持了

 

8、宏转换

Built-in URP
UNITY_PROJ_COORD(a) Gone. Do a.xy/a.w instead
UNITY_INITIALIZE_OUTPUT(typename) ZERO_INITIALIZE(typename)

 

9、阴影

必须先包含 include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl”.

Built-in URP
UNITY_DECLARE_SHADOWMAP(tex) TEXTURE2D_SHADOW_PARAM(textureNamesamplerName)
UNITY_SAMPLE_SHADOW(texuv) SAMPLE_TEXTURE2D_SHADOW(textureNamesamplerNamecoord3)
UNITY_SAMPLE_SHADOW_PROJ(texuv) SAMPLE_TEXTURE2D_SHADOW(textureNamesamplerNamecoord4.xyz/coord4.w)

 

10、纹理采样定义的宏 

Built-in URP
UNITY_DECLARE_TEX2D(name)

TEXTURE2D(textureName); 

SAMPLER(samplerName);

UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(textureName);
UNITY_DECLARE_TEX2DARRAY(name)

TEXTURE2D_ARRAY(textureName); 

SAMPLER(samplerName);

UNITY_SAMPLE_TEX2D(nameuv) SAMPLE_TEXTURE2D(textureNamesamplerNamecoord2)
UNITY_SAMPLE_TEX2D_SAMPLER(namesamplernameuv) SAMPLE_TEXTURE2D(textureNamesamplerNamecoord2)
UNITY_SAMPLE_TEX2DARRAY(nameuv) SAMPLE_TEXTURE2D_ARRAY(textureNamesamplerNamecoord2index)
UNITY_SAMPLE_TEX2DARRAY_LOD(nameuvlod) SAMPLE_TEXTURE2D_ARRAY_LOD(textureNamesamplerNamecoord2indexlod)

 

11、Built-in Shader 函数

include “Packages/com.unity.render-pipelines.core/ShaderLibrary/SpaceTransforms.hlsl”.


 

定点转换函数

Built-in URP
float4 UnityObjectToClipPos(float3 pos) float4 TransformObjectToHClip(float3 positionOS)
float3 UnityObjectToViewPos(float3 pos) TransformWorldToView(TransformObjectToWorld(positionOS))

 

 通用函数

 

Built-in URP
float3 WorldSpaceViewDir (float4 v) float3 GetWorldSpaceViewDir(float3 positionWS) Include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderVariablesFunctions.hlsl”
float3 ObjSpaceViewDir (float4 v)

TransformWorldToObject

(GetCameraPositionWS()) - objectSpacePosition 实现

float2 ParallaxOffset (half hhalf heighthalf3 viewDir) 从UnityCG.cginc拷贝
fixed Luminance (fixed3 c) real Luminance(real3 linearRgb) Include “Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl”
fixed3 DecodeLightmap (fixed4 color)

real3 DecodeLightmap(real4 encodedIlluminance

real4 decodeInstructions)

Include “Packages/com.unity.render-pipelines.core/ShaderLibrary/EntityLighting.hlsl”
decodeInstructions is used as half4(LIGHTMAP_HDR_MULTIPLIER, LIGHTMAP_HDR_EXPONENT, 0.0h, 0.0h) by URP
float4 EncodeFloatRGBA (float v)  从UnityCG.cginc拷贝
float DecodeFloatRGBA (float4 enc) 从UnityCG.cginc拷贝
float2 EncodeFloatRG (float v) 从UnityCG.cginc拷贝
float DecodeFloatRG (float2 enc) 从UnityCG.cginc拷贝
float2 EncodeViewNormalStereo (float3 n) 从UnityCG.cginc拷贝
float3 DecodeViewNormalStereo (float4 enc4) 从UnityCG.cginc拷贝

 

前向渲染通用函数

Built-in URP
float3 WorldSpaceLightDir (float4 v)

_MainLightPosition.xyz 

TransformObjectToWorld(objectSpacePosition)

Include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl”
float3 ObjSpaceLightDir (float4 v) TransformWorldToObject(_MainLightPosition.xyz) - objectSpacePosition Include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl”
float3 Shade4PointLights () 可以通过half3 VertexLighting(float3 positionWS, half3 normalWS) For VertexLighting(...) include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl”

 

 屏幕空间函数

Built-in URP
float4 ComputeScreenPos (float4 clipPos) float4 ComputeScreenPos(float4 positionCS) Include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderVariablesFunctions.hlsl”
float4 ComputeGrabScreenPos (float4 clipPos) Gone.

 

顶点照明 

Built-in URP
float3 ShadeVertexLights (float4 vertexfloat3 normal) Gone. You can try to use UNITY_LIGHTMODEL_AMBIENT.xyz + VertexLighting(...) VertexLighting(...) 需要包含 include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl”

可以在 “Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl”中找到其他通用实例

Built-in Shader 的变量,以 light相关为例

Lighting ↑

Built-in URP
_LightColor0 _MainLightColor Include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl”
_WorldSpaceLightPos0 _MainLightPosition Include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl”
_LightMatrix0 Gone ? Cookies are not supported yet
unity_4LightPosX0unity_4LightPosY0unity_4LightPosZ0 在UPR中  light  GetAdditionalLight(uint i, float3 positionWS)获取灯光信息 Include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl”
unity_4LightAtten0 在UPR中  light  GetAdditionalLight(uint i, float3 positionWS)获取灯光信息 Include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl”
unity_LightColor 在UPR中  light  GetAdditionalLight(uint i, float3 positionWS)获取灯光信息 Include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl”
unity_WorldToShadow float4x4 _MainLightWorldToShadow[MAX_SHADOW_CASCADES + 1] or _AdditionalLightsWorldToShadow[MAX_VISIBLE_LIGHTS] Include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl”

如果想知道添加的光照信息,应该用GetAdditionalLight(...)函数获得, GetAdditionalLightsCount()函数可以得到使用的光照数量


 

Shadows 阴影

大多数可以在 “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl”.查找

Built-in URP
UNITY_SHADOW_COORDS(x) Gone? DIY, e.g. float4 shadowCoord : TEXCOORD0;
TRANSFER_SHADOW(a) a.shadowCoord = TransformWorldToShadowCoord(worldSpacePosition) With cascades on, do this on fragment to avoid visual artifacts
SHADOWS_SCREEN 不支持了

 

更多的信息查找 “Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderVariablesFunctions.hlsl”.

Built-in URP
UNITY_FOG_COORDS(x)  float fogCoord : TEXCOORD0;
UNITY_TRANSFER_FOG(ooutpos) o.fogCoord = ComputeFogFactor(clipSpacePosition.z);
UNITY_APPLY_FOG(coordcol) color = MixFog(colori.fogCoord);

 

Depth ↑

include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl” 和 _CameraDepthTexture 在 函数中视使用 SampleSceneDepth(...) and LoadSceneDepth(...).

Built-in URP
LinearEyeDepth(sceneZ) LinearEyeDepth(sceneZ_ZBufferParams) Include “Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl”
Linear01Depth(sceneZ) Linear01Depth(sceneZ_ZBufferParams) Include “Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl”

后效

URP 不在支持 OnPreCullOnPreRenderOnPostRender and OnRenderImage.也不支持OnRenderObject and OnWillRenderObject,  它提供了RenderPipelineManager

  • beginCameraRendering(ScriptableRenderContext context, Camera camera)
  • endCameraRendering(ScriptableRenderContext context, Camera camera)
  • beginFrameRendering(ScriptableRenderContext context,Camera[] cameras)
  • endFrameRendering(ScriptableRenderContext context,Camera[] cameras)

使用实例

void OnEnable()
{
	RenderPipelineManager.beginCameraRendering += MyCameraRendering;
}

void OnDisable()
{
	RenderPipelineManager.beginCameraRendering -= MyCameraRendering;
}

void MyCameraRendering(ScriptableRenderContext context, Camera camera)
{
	...
	if(camera == myEffectCamera)
	{
	...
	}
	...
}

URP与Post-processing stack插件已经不能很兼容,建议使用unity本身的后效处理使用通过Volumn来实现,具体就不在这里赘述了

主要参考内容:

Converting your shaders | Universal RP | 12.1.7 (unity3d.com)https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@12.1/manual/upgrading-your-shaders.html 

From Built-in to URP (teodutra.com)https://teodutra.com/unity/shaders/urp/graphics/2020/05/18/From-Built-in-to-URP/

其中在转换的过程中,包含后效、阴影,光照 以及grabpass(抓屏)等相关内容后续会抽空更新,具体写个实例以便大家探讨文章来源地址https://www.toymoban.com/news/detail-415209.html

到了这里,关于unity build-in 渲染管线升级urp渲染 shader篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity升级到URP渲染管线,

    首先 需要安装URP的包 安装后 然后打开ProjectSettings 替换 上一步创建 URP的配置文件 这个时候有些材质就会变成洋红色 选择RenderPipelineConverter 等待转换完成即可,

    2024年02月15日
    浏览(53)
  • Unity内置渲染管线升级URP教程

    URP全称为Universal Render Pipeline(通用渲染管线),可以提供更加灵活的渲染方案,通过添加Render Feature实现各种渲染效果。并且可以针对移动平台进行专门的优化,同时还提供了SRPBatcher提高渲染效率。Unity的一些工具,比如ShaderGraph,也是必须在URP管线下才可以使用,可以说许多方

    2024年02月16日
    浏览(56)
  • Unity Shader 学习笔记(4)URP渲染管线带阴影PBR-Shader模板 -- 新增可自定义阴影颜色

    材质面板截图 功能实现(URP渲染管线下): 1、进一步优化Shader结构和算法; 2、包含PBR材质; 3、投射和接收阴影,并升级 支持自定义阴影颜色 ; 4、支持点光源照射(但不支持点光源阴影)。 通用渲染截图 自定义阴影颜色截图 完整代码: 写在最后: 1、在我的上一篇文

    2024年02月12日
    浏览(49)
  • 【Unity Shader Graph URP渲染管线下的自定义半透明效果_半透明案例分享】

    URP的渲染管线下 在项目设置里找到“Graphic” 找到URP Asset文件 索引到Renderer List文件——“ForwardRenderer” 在这个“ForwardRenderer”文件里找到“Add Renderer Feature” 添加一个渲染对象,类似下图:Render Object (Experimental) 如图设置,将“Event”设置成 AfterRenderingSkybox ,然后“Layer M

    2024年02月09日
    浏览(59)
  • 【Unity 踩坑系列】项目升级URP/HDRP渲染管线时如何解决材质丢失问题 (模型全部为粉红色)

    在我们创建项目时候如果我们一开始使用的是默认内置渲染管线,后期项目需要升级到URP或者HDRP渲染管线时有可能会出现预制体材质丢失的问题(原因是大部分资源的预制体在Unity官方推荐使用URP渲染管线之前,都只是使用默认内置管线的材质。所以并不适配现在的URP渲染管

    2024年02月16日
    浏览(60)
  • 渲染管线丢失 /项目升级为URP

    打开Package Manager 下载Universal RP 2.在project面板中 create = rendering = URP = Pipeline Asset 在 Project Setting 中的 Graphics和Quality选择URPAsset 如果导入新资源 更新一下RenderPipeline 即可 步骤:Edit=Render Pipeline=Generate Shader

    2024年02月16日
    浏览(37)
  • Unity URP渲染管线与内置渲染管线的性能差别

    首先,我们来了解一下Unity的内置渲染管线。内置渲染管线是Unity较早版本中使用的默认渲染管线,它使用的是传统的图形渲染技术。内置渲染管线提供了一系列的渲染功能,如阴影、反射、抗锯齿等。但是,由于其较为庞大且复杂的设计,它的性能相对较低。在高质量图形效

    2024年02月08日
    浏览(41)
  • Unity-3DRPG游戏 学习笔记(1)--使用URP渲染管线

    教程地址: Unity2020 3DRPG游戏开发教程|Core核心功能01:Create Project 创建项目导入素材|Unity中文课堂_哔哩哔哩_bilibili 创建URP通用渲染管线(2021版本) 1. 打开:Windows--Package Manager--左上角下拉选择Unity Registry--搜索Universal RP--Install 2. Project窗口--Assets--右键Create--Rendering--URP Asstes

    2024年02月11日
    浏览(46)
  • Unity shader 入门之渲染管线一、总览

     如下示意图 应用阶段(ApplicationStage):准备场景信息(视景体,摄像机参数)、粗粒度剔除、定义每个模型的渲染命令(材质,shader)——由开发者定义,不做讨论。 几何阶段(GemetryStage):顶点着色器、曲面细分着色器、几何着色器、裁剪、屏幕映射; 光栅化阶段(Rasterizer

    2024年02月11日
    浏览(48)
  • 【Unity URP渲染管线下设置灯光数量上限_灯光不显示问题案例分享】

    1.我的这个项目是在URP渲染管线下,我在场景里创建了六个点灯,转动物体的时候,发现灯显示不全,会一闪一闪的出现。 2.在RenderPipelineAsset配置文件中查看灯光数量上限,首先在EditProject Setting 3.在Project Setting里选Quality,在Rendering找到UniversalRP Asset 4.选中UniversalRP Asset文件

    2024年02月16日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包