一、CG 替换 HLSL

  1. 未使用光照计算的shader升级后不做修改仍然可以使用,但是可能会不兼容SRP Batcher,所以仍然需要修改,使用了光照计算的shader必须要修改。

  2. SubShader的Tags中增加 “RenderPipeline”="UniversalPipeline"声明

  3. 要保证多pass物体正确绘制,需要确保有个pass打上 UniversalForward 的tag,其余pass有 SRPDefaultUnlit的tag也行,没有也行。

  4. HLSLPROGRAM 替换 CGPROGRAM
    HLSLINCLUDE 替换 INCLUDE
    ENDHLSL 替换 ENDCG

  5. fixed 替换为:half 或者 float

  6. FallBack
    FallBack “Hidden/Universal Render Pipeline/FallbackError”

  7. LightMode

    "LightMode" 要改为URP支持的模式, 比如   "LightMode" = "Forward"   替换为   "LightMode" = "UniversalForward"其他常用URP的mode类型:"LightMode" = "Universal2D""LightMode" = "Meta""LightMode" = "DepthOnly""LightMode" = "ShadowCaster"
    
  8. 使用URP ShaderLibrary引用Core.hlsl替换内置渲染管线中的UnityCG.cginc

    #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
    替换
    #include "UnityCG.cginc"
    

    其他库类似:

    #include "Lighting.HLSLinc"
    替换为:
    #include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
    #include "Packages/com.unity.render-pipelines.universal/Shaders/LitForwardPass.hlsl"阴影:
    #include "Packages/com.unity.render-pipelines.universal/Shaders/ShadowCasterPass.hlsl"
    
  9. 内置结构体、内置函数 和矩阵

    appdata_full 这种结构体不能用了,如何一一替换我就不举例了
    内置函数 和矩阵需要查阅Packages/Universal RP/ShaderLibrary/UnityInput
    内置结构体、函数需要查阅
    Packages/Universal RP/ShaderLibrary/Input
    Packages/Universal RP/ShaderLibrary/Core

  10. 使用 TransformObjectToHClip 替换 UnityObjectToClipPos
    或者改成如下写法:

    Varyings vert(Attributes IN) {Varyings OUT;VertexPositionInputs positionInputs = GetVertexPositionInputs(IN.positionOS.xyz);OUT.positionCS = positionInputs.positionCS;// Or this ://OUT.positionCS = TransformObjectToHClip(IN.positionOS.xyz);OUT.uv = TRANSFORM_TEX(IN.uv, _BaseMap);OUT.color = IN.color;return OUT;
    }
    

    GetVertexPositionInputs 计算不同坐标系中的位置,结果包含世界坐标系坐标,观察坐标系坐标,裁剪坐标系坐标,标准设备坐标系坐标,未使用到的坐标不会被包含到编译出的shader中,所以不会有额外的不必要的计算量。TRANSFORM_TEX 在内置渲染管线和URP中都可以用。GetVertexNormalInputs 可以将法线和切线从对象坐标系变换到世界坐标系。也可以用 TransformObjectToWorldNormal(IN.normalOS) 代替。

    VertexNormalInputs normalInputs = GetVertexNormalInputs(IN.normalOS, IN.tangentOS);

  11. 在URP中纹理和采样器的定义改成如下写法:

        // 将_BaseMap声明为Texture2D对象TEXTURE2D(_MainTex);// 将_BaseMap声明为Texture2D对象SAMPLER(sampler_MainTex);float4 frag (v2f i) : SV_Target{float4 col = SAMPLE_TEXTURE2D(_BaseMap,sampler_BaseMap, i.texcoord);return col;}
    
  12. 区分 multi_compile 和 shader_feature,剥离不需要的编译选项,减少shader变体。

    https://zhuanlan.zhihu.com/p/77043332

    https://www.jianshu.com/p/8750704a2f4c

  13. URP不支持表面着色器,URP ShaderLibrary 中处理光照计算的函数在 Lighting.hlsl中,该文件需要手动include。

    //这些编译指令用于接收阴影
    #pragma multi_compile _ _MAIN_LIGHT_SHADOWS
    #pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE
    #pragma multi_compile _ _SHADOWS_SOFT#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
    
  14. 当使用Lighting.hlsl支持光照和阴影,应该添加下面的编译选项,如果没有定义,ShaderLibrary会跳过一些计算。

    // Main Light Shadows
    #pragma multi_compile _ _MAIN_LIGHT_SHADOWS
    #pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE// Additional Lights & Shadows
    #pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS
    #pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS// Soft Shadows
    #pragma multi_compile _ _SHADOWS_SOFT// Other (Mixed lighting, baked lightmaps, fog)
    #pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE
    #pragma multi_compile _ DIRLIGHTMAP_COMBINED
    #pragma multi_compile _ LIGHTMAP_ON
    #pragma multi_compile_fog// Supporting shadows will also require passing a positionWS,
    // and shadowCoord into the fragment shader, again you'll have
    // to see the Lighting sections for actual examples.
    

    接受投影:

    #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
    #pragma multi_compile _ _MAIN_LIGHT_SHADOWS
    #pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADEfloat4 frag (v2f i) : SV_Target
    {float4 shadowCoords = TransformWorldToShadowCoord(i.worldPos);Light mainLight = GetMainLight(shadowCoords);//阴影实时遮挡half shadow = mainLight.shadowAttenuation;return shadow;
    }
    
    被投影:
    
       //新加一个passUsePass "Universal Render Pipeline/Lit/ShadowCaster"
    
  15. 为了处理雾,使用ComputeFogFactor 和 MixFog 函数。

    #pragma multi_compile_fogstruct Varyings {...half fogFactor : TEXCOORD5;// or whatever unused texcoord// if none are unused pack it together with a half3 or something
    }
    ...// In the vertex shader :
    half fogFactor = ComputeFogFactor(positionInputs.positionCS.z);// In the fragment, just before returning the color :
    color.rgb = MixFog(color.rgb, IN.fogFactor);

二、多Pass问题:

在URP中是使用的single-pass前向渲染,也就是单Pass。
转URP的时候我们会发现 以前多Pass的shader会异常,只会渲染第一个Pass。

如果我们确实需要多Pass怎么办?

我们可以通过设置第一个Pass的LightMode为:UniversalForward就行了。

例如:

Shader "lcl/Shader"
{      Properties       {      _Color("Color", Color) = (1,1,1,1)_MainTex("Albedo", 2D) = "white" {}      }    SubShader {LOD 100Lighting OffPass{Tags { "LightMode"="UniversalForward"}...}Pass {  Tags {"LightMode"="SRPDefaultUnlit"}...}
}

但是不推荐多Pass渲染,因为会打断 SRP Batcher,使DrawCall增加。(当然 如果没使用SRP Batcher则不影响)

具体什么是SRP Batcher可以参考这里

https://zhuanlan.zhihu.com/p/165574008
https://zhuanlan.zhihu.com/p/165388825

·如果确实需要可以通过RendererFeatures实现多Pass效果

三、兼容SRP Batcher:

首先需要勾选 SRP Batcher。

shader代码修改:

Shader中所有的内置属性例如unity_ObjectToWorldunity_SHAr等,都要在一个名为UnityPerDraw的CBUFFER中声明;
所有的Material属性都要在一个名为UnityPerMaterial的CBUFFER中声明。

CBUFFER_START(UnityPerMaterial)
//Properties
CBUFFER_ENDCBUFFER_START(UnityPerDraw)float4x4 unity_ObjectToWorld;
CBUFFER_END

例如:

Properties
{_Color1 ("Color 1", Color) = (1,1,1,1)
_Color2 ("Color 2", Color) = (1,1,1,1)
}//原本的写法
//float4 _Color1;
//float4 _Color2;//兼容SRP Batcher的写法
CBUFFER_START(UnityPerMaterial)
float4 _Color1;
float4 _Color2;
CBUFFER_ENDCBUFFER_START(UnityPerDraw)float4x4 unity_ObjectToWorld;
CBUFFER_END

如果shader报错:Shader error in ‘Unlit/SampleUnlit’: redefinition of ‘unity_ObjectToWorld’,重复定义,如果自己的shader代码里面没有,那么就是引入了其他的库文件里面包含了该变量。

最后,我们看Shader的面板,如果出现了类似的提示:

则表示 该属性 未包含在 CBUFFER_START(UnityPerMaterial) 里面。

注意:如果Shader使用了多Pass渲染,则会打断 SRP Batcher。

参考链接:

https://zhuanlan.zhihu.com/p/254810253

https://blog.csdn.net/wannaconquer/article/details/114092927

Unity 内置渲染管线转URP相关推荐

  1. 【工具篇】Unity内置渲染管线和URP以及HDRP轮廓外发光边缘光高亮显示演示

    目录 一.内置渲染管线(Built_IN) 一. 效果展示 二.使用教学 Quick Outline 二.URP渲染管线

  2. Unity内置管线升级URP之色彩空间(伽马、sRGB、Gamma Space和Linear Space)

    目录 本文内容 伽马(Gamma) sRGB 色彩空间(Color Space) 总结 转色彩空间后出现问题的缘由 1.相同场景材质和光照为什么变暗了? 2.个人定制化的PBR显示不正确了?(讨论的是 ...

  3. 制作RPG独立游戏练习(二)内置渲染管线中实现风格化PBR效果

    游戏的研发大概有3个月了,都是业余时间边学边做,还是觉得在项目里面实操学得扎实牢靠. 目标平台是手机....(优化后,目前测试的是中高端机型) 目前是在unity里面实时光的效果打包到手机里的实机画面 ...

  4. Unity内置的三套消息发送机制的应用实例

    转自http://blog.sina.com.cn/s/blog_1491e52310102wuf6.html 代码简介 : [1] 实例中包含2个类文件, SendMessage.cs 和 Rece ...

  5. Unity 内置着色器下载方法

    Unity 内置着色器下载方法 官方下载 GitHub下载 官方下载 需要科学上网 官方下载链接 https://unity3d.com/get-unity/download/archive GitH ...

  6. Unity内置资源如何打包避免冗余

    这是第249篇UWA技术知识分享的推送.今天我们继续为大家精选了若干和开发.优化相关的问题,建议阅读时间10分钟,认真读完必有收获. UWA 问答社区:answer.uwa4d.com UWA QQ群 ...

  7. Unity 内置管线Shader升级到URP详细手册

    本文转载自:https://www.jianshu.com/p/3fef69e2efb6 作为技术资料记录和备份,避免遗忘或删除 //================以下为具体内容========== ...

  8. Unity内置Built-in到可编程URP函数对应整理

    目录 1.总体结构 2.Shader Include 头文件 3.灯光模式 4.变种Variants 5.预处理宏 Predefined Shader Preprocessor Macros 5.1辅 ...

  9. Unity内置Shader解读3——Decal

    1.Shader在什么情况下使用 Decal(贴花)贴花就是类似于CF里的喷漆,或者汽车/墙上等贴一个贴纸. image.png 2.Shader的价值(用的多不多),Shader的难度 这个应该是极 ...

  10. 闲云野鹤:吃鸡(四)之场景制作—用unity内置草功能制作草

    先上最终效果图吧: 第一种方式:Add Grass Texture,只需要选择草的图片即可 选择Add Grass Texture此种方式unity默认mesh为一个矩形面.基本制作过程没什么值得多说 ...

最新文章

  1. idea如何删除java里面工程,Java开发工具IntelliJ IDEA配置项目系列教程(七):卸载模块...
  2. java中的方法在哪里_Java中的本机方法是什么,应在哪里使用?
  3. 【Python】直接赋值,深拷贝和浅拷贝
  4. 20190719算法题存档
  5. 收获不止oracle在线,重温《收获不止Oracle》
  6. 浏览器怪异模式和标准模式之间的区别 DTD
  7. 打包的时候不把配置文件加进去_苹果软件打包签名原理
  8. 【转】Excel表格的35招必学秘技
  9. 服务器上运行python
  10. 华为的计算机怎么没声音怎么办,笔记本电脑没有声音怎么办
  11. Effective_go_Notes
  12. 云和恩墨大讲堂 | 基于PCIE 闪存卡的 Oracle 数据库使用
  13. 溯源供应链引擎APS的历史(蔡颖)
  14. gitbucket push卡住
  15. 关于防止游戏行为检测的几点建议技巧
  16. steam好友服务器当前处于离线状态,steam怎么修改在线状态-steam设置离线、想交易、隐身等状态的方法 - 河东软件园...
  17. 关于烟台、威海“雪窝”成因的简要分析
  18. 2018区块链概念股龙头
  19. 工作中遭遇的问题及解决办法
  20. ps cs3 汉化包(去掉BUG版)的补充说明~回复大人Orz!

热门文章

  1. 计算机操作系统第二章测试题及答案
  2. 手机wap网页制作的认识(有关meta…
  3. 风口猪炒股指标_低吸大长腿
  4. 【忆往昔】我欠老牛两本书
  5. 软考中级——系统集成项目管理工程师 知识点思维导图
  6. 前端工作汇报PPT技巧
  7. 百度云 自然语言处理(Nlp)
  8. java爬取app_Java实现爬虫给App提供数据(Jsoup 网络爬虫)
  9. 竞赛经验——全国大学生创新创业训练计划(国创)
  10. NVMe PM951 硬盘写入速度优化