Unity Shader从内置渲染管线迁移到URP

这篇具有很好参考价值的文章主要介绍了Unity Shader从内置渲染管线迁移到URP。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Unity 在URP中将shader更新为了HLSL语言,使用build-in shader 无法直接在URP中使用
这里讲一下关于shader的更新方法

参考 From Built-in to URP

更新步骤

  1. Tags 添加
    "RenderPipeline" = "UniversalPipeline"

  2. CGPROGRAM ENDCG 改变为 HLSLPROGRAM ENDHLSL

  3. #include "UnityCG.cginc"
    更改为 #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

  4. fixed4 类型更改为 half4

  5. 函数替换对照

Build-in RP URP
UnityObjectToClipPos(v.vertex); TransformObjectToHClip(v.vertex.xyz);
mul(unity_ObjectToWorld,v.vertex).xyz TransformObjectToWorld(v.vertex.xyz)
mul(float4(v.normal, 0.0),unity_WorldToObject).xyz /UnityObjectToWorldNormal(v.normal) TransformObjectToWorldNormal(v.normal)

代码

上代码 一个简单的uv流动shader
内置渲染管线

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'

Shader "Custom/liuguang"
{
    Properties
    {
        _FlowTex("Texture", 2D) = "white" {}
        _FlowTilling("Flow Tilling",Vector) = (1,1,0,0)
        _FlowSpeed("Flow Speed",Vector) = (1,1,0,0)

    }
    SubShader
    {
        Tags { "Queue" = "Transparent" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
        // make fog work


            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 texcoord : TEXCOORD0;
                float3 normal : NORMAL;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 pos : SV_POSITION;
                float3 pos_world : TEXCOORD1;
                float3 normal_world : TEXCOORD2;
                float3 pivot_world : TEXCOORD3;
            };


            sampler2D _FlowTex;
            float4 _FlowTilling;
            float4 _FlowSpeed;
    

            v2f vert(appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                float3 normal_world = mul(float4(v.normal, 0.0),unity_WorldToObject).xyz;
                o.normal_world = normalize(normal_world);
                o.pos_world = mul(unity_ObjectToWorld,v.vertex).xyz;
                o.pivot_world = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz;
                o.uv = v.texcoord;
                return o;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                half2 uv_flow = (i.pos_world.xy - i.pivot_world.xy) * _FlowTilling.xy;
                uv_flow = uv_flow + _Time.y * _FlowSpeed.xy;
                float4 flow_rgba = tex2D(_FlowTex, uv_flow);
                return flow_rgba;
            }
            ENDCG
        }
    }
}

URP

Shader "Custom/flowlight"
{
    Properties
    {
        _FlowTex("Texture", 2D) = "white" {}
        _FlowTilling("Flow Tilling",Vector) = (1,1,0,0)
        _FlowSpeed("Flow Speed",Vector) = (1,1,0,0)

    }
    SubShader
    {
        Tags { "RenderType" = "Opaque"  "RenderPipeline" = "UniversalPipeline" }
        LOD 100

        Pass
        {
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 texcoord : TEXCOORD0;
                float3 normal : NORMAL;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 pos : SV_POSITION;
                float3 pos_world : TEXCOORD1;
                float3 normal_world : TEXCOORD2;
                float3 pivot_world : TEXCOORD3;
            };


            sampler2D _FlowTex;
            float4 _FlowTilling;
            float4 _FlowSpeed;


            v2f vert(appdata v)
            {
                v2f o;
                o.pos = TransformObjectToHClip(v.vertex.xyz);
                float3 normal_world = TransformObjectToWorldNormal(v.normal);
                o.normal_world = normalize(normal_world);
                o.pos_world = TransformObjectToWorld(v.vertex.xyz);
                o.pivot_world = TransformObjectToWorld(float3(0,0,0));
                o.uv = v.texcoord;
                return o;
            }

            half4  frag(v2f i) : SV_Target
            {
                half2 uv_flow = (i.pos_world.xy - i.pivot_world.xy) * _FlowTilling.xy;
                uv_flow = uv_flow + _Time.y * _FlowSpeed.xy;
                float4 flow_rgba = tex2D(_FlowTex, uv_flow);
                return flow_rgba;
            }
            ENDHLSL
        }
    }
}

多pass的情况

对于跟光照相关的shader ,迁移到urp可能会只执行第一个pass
需要通过lightmode 锁定到pass上
urp最多支持三个pass ,按如下的顺序为pass 添加tag即可
Tags{"LightMode" = "SRPDefaultUnlit"}
Tags{"LightMode" = "UniversalForward"}
Tags{"LightMode" = "LightweightForward"}文章来源地址https://www.toymoban.com/news/detail-451440.html

到了这里,关于Unity Shader从内置渲染管线迁移到URP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • unity 2019 内置渲染管线 光照与Lighting面板 参数详解

    本文仅讨论内置渲染管线,高清渲染管线和通用渲染管线不在讨论范围之内 内置渲染管线就是最普通的工程自带的渲染管线 本文使用的Unity版本为2019.4 ,。如果你的版本不同,参数和参数的功能可能不同。 由于作者并非专业技美,只是一个苦逼的码农,难免有错误,请大佬

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

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

    2024年02月12日
    浏览(28)
  • 【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日
    浏览(44)
  • Unity学习 渲染管线介绍

    SRP: (Scriptable Render Pipeline,可编程渲染管线/脚本化渲染管线),可以在Unity通过C#脚本调用API配置或执行渲染命令的方式来实现渲染流程,SRP将这些命令传递给Unity底层图形体系结构(low-level graphics architecture),然后再将指令发送给图形API(Graphics API),最终由GPU进行处理

    2024年02月04日
    浏览(29)
  • 第二十章 Unity 渲染管线

    渲染管线是计算机图形中最基础最核心的部分,它是将3D场景显示到2D平面的技术过程。在DirectX课程中,我们就介绍了渲染管线,分为固定渲染管线和可编程渲染管线(Shader)。但是在DirectX 10版本之后统一了渲染架构,就是将顶点着色器和像素着色器被合二为一,成为流处理

    2024年02月07日
    浏览(27)
  • Unity升级到URP渲染管线,

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

    2024年02月15日
    浏览(37)
  • Unity | HDRP高清渲染管线学习笔记:Volume

    目录 一、Volume框架 二、Volume Profile 三、Volume重载 1.Visual Environment(环境设置) 1.1 Sky type 1.2 Ambient Mode 2.Sky 2.1 HDRI Sky(HDRI天空) 2.2 Gradient Sky(渐变天空) 2.3 Physically Based Sky(基于物理的天空) 3.Exposure(屏幕曝光) 3.1 Mode 3.2 Metering Mode(测光模式) 3.3 Limit Min和Limit Max 3.

    2024年02月11日
    浏览(30)
  • Unity | HDRP高清渲染管线学习笔记:示例场景解析

    目录 一、HDRP入门 1.HDRP设置  1.1 HDRP配置文件中的全部设置项         1.1.1 Rendering下的Lit Shader Mode         1.1.2 Lighting 下的Volumetrics(体积光)和Screen Space Reflection(屏幕空间反射) 2.离线渲染VS实时渲染 3.Volume组件 3.1Sky and Fog Volume 天空雾效 4.光照贴图烘焙 5.HDRP材质和

    2024年02月08日
    浏览(88)
  • Unity | HDRP高清渲染管线学习笔记:基本操作

    目录 一、场景整体环境光强度 1.HDRI Sky 2.Shadows 二、屏幕后处理效果(Post Processing) 1.Exposure 2.Post-processing/Tonemapping 三、抗锯齿 四、添加光源 1.Light Explorer窗口 2.光照探针组 3.反射探针 4.烘焙光照贴图 本文主要是了解HDRP基本操作: 如何为一个已经摆放好模型的场景添加环境光等

    2024年02月16日
    浏览(35)
  • Unity | HDRP高清渲染管线学习笔记:HDRP光照系统(二)

    目录 一、光源类型和模式 1. Light组件 1.1 General(通用设置) 1.1.1 LightLayer(光照层) 1.2 Emission(发光设置) 1.3 Shadows(阴影) 二、Light Layer(光源分层) 三、光照探针  1. Light Probe Group组件 2. 使用光照探针的基本步骤 3. Mesh Renderer组件LightProbes下Blend Probes VS Use Proxy Volume 3

    2024年02月07日
    浏览(26)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包