Shader基础的简单实现(基于URP渲染)

一个模型是很多个顶点组成,顶点数据中包含坐标、法线、切线、UV坐标、顶点颜色等等组成。

URP(Universal Render Pipeline)通用渲染管线,是Unity在2019.3版本之后推出的一种新的渲染管线。传统的渲染管线在渲染多光源的情况,是把每一个主要光源都使用一个Pass来计算,然后再叠加,所以在计算多光源实时光时,消耗会比较大。URP中主光源只能是平行光、限定附加光源数量,然后在一个pass内处理完所有光源和光照的计算。这样会解决了默认渲染管线对于多光源的计算。URP的另外一个特点是SRP Batcher合并批次的支持。

一般项目创建后是默认的内置渲染管线,需要手动升级成URP,详细可以看Unity官网上对URP的说明:将通用渲染管线安装到现有项目中 | Universal RP | 12.1.1 使用一个模型颜色渐变效果来对比URP和内置渲染器的shader代码。效果如下:

内置渲染器:

Shader "Unlit/002"
{
    Properties
    {
        _BaseColor("基础颜色",Color) = (1,1,1,1)
        _ChangeColor("渐变颜色",Color) = (1,0,0,1)
    }
        SubShader
    {
        Tags { "RenderType" = "Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            float4 _BaseColor;
            float4 _ChangeColor;
            struct v2f
            {
                float4 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };
            
            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };
            
            v2f vert(appdata v) 
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.vertex;
                return o;
            }
            
            fixed4 frag(v2f i) : SV_TARGET
            {
                return lerp(_BaseColor,_ChangeColor,i.uv.y + 0.5);
            }

            ENDCG
        }
    }
}

URP:

Shader "Unlit/003"
{
    Properties
    {
        _BaseColor("基础颜色",Color) =(1,1,1,1)
        _ChangeColor("渐变颜色",Color) =(1,0,1,1)
    }
    SubShader
    {
        
        Tags { 
            "RenderPipeline"="UniversalPipeline"
            "RenderType"="Opaque"
            "IgnoreProjector" = "True"
        }
        LOD 100
        Pass
        {
            HLSLPROGRAM 
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"//函数库:主要用于各种的空间变换
            #pragma vertex vert
            #pragma fragment frag

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float4 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };
            
            float4 _BaseColor;
            float4 _ChangeColor;
            float4 _MainTex_ST;
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = TransformObjectToHClip(v.vertex);
                o.uv = v.vertex;
                return o;
            }

            half4 frag (v2f i) : SV_TARGET
            {
                return lerp(_ChangeColor,_BaseColor,i.uv.y+0.5);
            }
            ENDHLSL 
        }
    }
}

对于Unity来说,cg和hlsl的语法基本上是一致的,URP中把使用的CGPROGRAM改为HLSLPROGRAM了。

相关推荐

  1. Unity Shader基础知识入门了解

    2024-02-23 02:32:02       12 阅读
  2. UnityShader(二)Shader基础

    2024-02-23 02:32:02       33 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-23 02:32:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-23 02:32:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-23 02:32:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-23 02:32:02       20 阅读

热门阅读

  1. exit()、_exit()和_Exit()终止程序运行

    2024-02-23 02:32:02       29 阅读
  2. Linux限定网络和工具环境下时间同步

    2024-02-23 02:32:02       30 阅读
  3. vue3 #组件通信#子传父#defineEmits

    2024-02-23 02:32:02       26 阅读
  4. 学习总结21

    2024-02-23 02:32:02       24 阅读
  5. 力扣代码学习日记五

    2024-02-23 02:32:02       30 阅读
  6. 【ElasticSearch】常用查询格式介绍

    2024-02-23 02:32:02       31 阅读
  7. 动态规划-背包问题-二维费用背包 & 分组背包

    2024-02-23 02:32:02       34 阅读