URP | 基础CG和HLSL区别
那个人真狗
2021年11月27日 15:28
收录于文集
共43篇

CG和HLSL区别

tags | 标签区别

  • 管线说明tags标签,URP的shader都需标明使用的渲染管线的标签,即"RenderPipeline"="UniversalRenderPipeline"。

HLSL语法

  • CG的引入变成了HLSL的引入,即CGINCLUDE ENDCG变成了HLSLINCLUDE ENDHLSL。CG的编码,从CGPROGRAM ENDCG变成了HLSL的HLSLPROGRAM ENDHLSL.

  • 这俩个区别什么

  • UnityCG,cginc已经不再适用,取而代之的是Core.hlsl,在引用时注明#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"即可。

CBUFFER_START 使用

  • CBUFFER_START和CBUFFER_END,对于变量是单个材质独有的时候建议放在这里面,以提高性能。CBUFFER(常量缓冲区)的空间较小,不适合存放纹理贴图这种大量数据的数据类型,适合存放float,half之类的不占空间的数据,关于它的官方文档在下有详细说明。https://blogs.unity3d.com/2019/02/28/srp-batcher-speed-up-your-rendering/

  • 注意:UnityPerMaterial大小写。

  • C-buffer    缓冲区

代码块
JavaScript
自动换行
复制代码
CBUFFER_START(UnityPerMaterial)
		half4 _BaseColor;
CBUFFER_END
复制成功

代码

  • 代码

代码块
JavaScript
自动换行
复制代码
Shader "Unlit/URP"
{
    Properties
    {
        _BaseColor("Base Color", Color) = (1,1,1,1)
    }

    SubShader
    {
        Tags{ "RenderType"="Opaque" "RenderPipeline"="UniversalPipeline"}    //增加标签
        Pass
        {
            HLSLPROGRAM                                                      // 使用HLSL语言
             
            #pragma vertex vert                                           
            #pragma fragment frag

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"          // 增加函数库

            CBUFFER_START(UnityPerMaterial)
                half4 _BaseColor;
            CBUFFER_END

            struct appdata
            {
                   // Object Space
                float4 positionOS : POSITION;                               // 顶点输入
            };
            struct v2f
            {
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata v)
            {
                v2f o;                                                     //定义输出
                o.vertex = TransformObjectToHClip(v.positionOS.xyz);       //读取顶点方式改变
                return o;
			}

            half4 frag(v2f i) : SV_Target
            {
                return _BaseColor;
			}


            ENDHLSL
		}
	}
}
复制成功

贴图采样

  • 新的DXD11 HLSL贴图的采样函数和采样器函数,TEXTURE2D (_MainTex)和SAMPLER(sampler_MainTex),用来定义采样贴图和采样状态代替原来DXD9的sampler2D,在不同的平台有不同的变化,在GLcore库函数里定义,具体的原理未知,如有大佬了解望给予评论和指出。

结构体

  • 代码阶段 需要注意的是把模型传入的UV信息和改一下这样区分。

顶点阶段

  • 顶点着色器阶段,使用的函数也是不一样的,TransformObjectToHClip(v.positionOS.xyz) 替换掉原来的。

贴图采样

  • 贴图的采用输出函数采用DXD11 HLSL下的 SAMPLE_TEXTURE2D(textureName, samplerName, coord2) ,具有三个变量,

  • 分别是TEXTURE2D (_MainTex)的变量

  • SAMPLER(sampler_MainTex)的变量和 uv,

注意: 贴图采样方式是3个变量,贴图的名字,数据,UV信息。

代码块
JavaScript
自动换行
复制代码
Shader "Unlit/OldShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" "RenderPipeline"="UniversalPipeline"}
        LOD 100

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

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

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

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float fogCoord : TEXCOOR1;
                float4 vertex : SV_POSITION;
            };

            CBUFFER_START(UnityPerMaterial)
                float4 _MainTex_ST;
            CBUFFER_END


            TEXTURE2D (_MainTex);
            SAMPLER(sampler_MainTex);

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = TransformObjectToHClip(v.vertex.xyz);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                o.fogCoord = ComputeFogFactor(o.vertex.z);                 //注意,这里函数内输入是顶点位置是转换完的。
                return o;
            }

            half4 frag (v2f i) : SV_Target
            {

                half4 col = SAMPLE_TEXTURE2D(_MainTex,sampler_MainTex,i.uv);  

                col.rgb = MixFog(col, i.fogCoord);                          //这里注意,雾函数是half3的类型,不能直接给half4赋值,需要改成rgb
                return col;
            }
            ENDHLSL
        }
    }
}
复制成功