Unity URP自学笔记一

随着显卡技术的发展,Unity转向使用HLSL支持DX11 API,逐步替代CG。本文介绍Unity Shader语言变化,如TransformObjectToHClip替代UnityObjectToClipPos,及Texture2D与SamplerState的新用法。并通过一个无光照Shader示例展示新的编写方式。
摘要由CSDN通过智能技术生成

因为CG英伟达不再维护,并且支持的功能比较少,基本和DX9的功能差不多,随前显卡的更新换代,unity在URP和HDRP中使用了HLSL,支持DX11相关的API,并有逐步抛弃CG的意途,而且还可以用ShaderGraph来创建shader,方便美术和策划创作。

HLSL的语法总体来说和CG差不多,只不过有一些小的差别,首先从格式上,基本上致,只是多了一些标签,例如
RenderPipeline = "UniversalRenderPipline"
代码放在HLSLPROGRAM ... HLSLEND 之间

还有一些方法的变化
例如:

  1. 将模型空间转到屏幕裁切空间UnityObjectToClipPos(vertex) 变成了 TransformObjectToHClip(vertex.xyz)
  2. Sampler2D _MainTex 变成了 Texture2D _MainTex
  3. 采样tex2D(_MainTex, i.texcoord) 变成了 _MainTex.Sample(_MainTex, Sampler_MainTex)Sampler_MainTex是采样器名称,需要声明SamplerState Sampler_MainTex
  4. 为了支持SRP Batch 需要把shader中的变量加到CBUFFTER_START(UnityPerMaterial) ... CBUFFER_END中,但是不能加贴图变量(如Texture2D _MainTex),因为这个缓存区的大小有限,贴图占用的空间太大。

下面是一个无光照的Shader示例

下面的代码中还有shader instance相关的代码,只是被注释掉了。

Shader "URP/Unlit"
{
	Properties
	{
		_MainTex("MainTex",2D) = "white"{}
		_BaseColor("BaseColor",Color)=(1,1,1,1)
	}

	SubShader
	{
		Tags
		{
			"RenderPipeline" = "UniversalRenderPipeline"
			"RenderType" = "Opaque"
			"IgnoreProjector" = "True"
		}
        Lod 200

		pass
        {
            Cull back
            Zwrite On

            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // #pragma prefer_hlslcc gles
            // #pragma exclude_renderers d3d11_9x
            // #pragma multi_compile_instancing

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

            CBUFFER_START(UnityPerMaterial)
            float4 _MainTex_ST;
            half4 _BaseColor;
            CBUFFER_END

            Texture2D _MainTex;//贴图,相当于 TEXTURE2D(_MainTex); 
            SamplerState sampler_MainTex; //声明采样器,相当于 SAMPLER(sampler_MainTex); ;

            struct Atributes
            {
                float4 positionOS : POSITION;
                float2 uv : TEXCOORD0;
                // UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            struct Varyings
            {
                float4 positionCS : SV_POSITION;
                float2 uv : TEXCOORD0;
                // UNITY_VERTEX_INPUT_INSTANCE_ID
                // UNITY_VERTEX_OUTPUT_STEREO
            };

            Varyings vert(Atributes input)
            {
                Varyings o = (Varyings)0;
                // UNITY_SETUP_INSTANCE_ID(input);
                // UNITY_TRANSFER_INSTANCE_ID(input, o);
                // UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);

                o.positionCS = TransformObjectToHClip(input.positionOS.xyz);
                o.uv = TRANSFORM_TEX(input.uv,_MainTex);

                return o;
            }

            half4 frag(Varyings input):SV_TARGET
            {
                // UNITY_SETUP_INSTANCE_ID(input);
                // UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);

                half2 uv = input.uv;
                return _MainTex.Sample(sampler_MainTex,uv)* _BaseColor; //SAMPLE_TEXTURE2D(_MainTex,sampler_MainTex,uv) * _BaseColor;
            }
            ENDHLSL
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值