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

C-buffer 缓冲区
CBUFFER_START(UnityPerMaterial)
half4 _BaseColor;
CBUFFER_END
代码
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信息。
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
}
}
}