URP 下的 Shadedr 基础写法的总结
URP简单介绍
URP是一种新的新的渲染管线,首先我们要粗略了解一下URP,他是SRP的一个高级版本,SRP是Unity面向用户开放的可编程渲染管线,URP和HDRP则是经过Unity进一步包装的SRP,分别面向手机(低性能)和主机(高性能),分别提供了对应的渲染库,有些是混用的功能,界限也没有非常明显。
使用URP的一大原因是可拓展性和高性能,还有一个让我不得不用的原因就是Unity新推出的Shadergraph和VFX graph都是基于URP的,可预见的未来URP将是Unity主打方向。如果你的工作需要你创建各种各样的美术效果,那么URP对你来说避无可避。
下面是URP渲染管线下写Shader最基础的写法,含有备注
固有色URP Shader(含注释)
// 这个shader给mesh填充一个固定的颜色
Shader "URP/ConstantColor"
{
// shader的属性,这个例子里面是空的,就代表没有对外暴露的属性
Properties
{
//_BaseColor为shader变量名,BaseColor为inspector显示名字
_BaseColor("Base Color", Color) = (1, 1, 1, 1)
}
// SubShader块包含Shader代码
SubShader
{
// Tags定义了subshader块何时以及在什么条件下执行
Tags
{
"RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline"
}
Pass
{
// HLSL代码块,Unity SRP使用HLSL语言,Pass中全部是HLSL
HLSLPROGRAM
// 定义顶点shader的名字
#pragma vertex vert
// 定义片元shader的名字
#pragma fragment frag
// 这个Core.hlsl文件包含了常用的HLSL宏定义以及函数,也包括了对其他常用HLSL文件的引用
// 例如Common.hlsl, SpaceTransforms.hlsl等
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
// 下面结构体包含了顶点着色器的输入数据
struct Attributes
{
// positionOS变量包含了物体空间的顶点位置
float4 positionOS : POSITION;
};
struct Varyings
{
// 这个结构体里必须包含SV_POSITION
float4 positionHCS : SV_POSITION;
};
CBUFFER_START(UnityPerMaterial)
half4 _BaseColor;//定义和Property中同名的变量使之关联
CBUFFER_END
// 顶点着色器
Varyings vert(Attributes IN)
{
// 定义输出的结构体
Varyings OUT;
// TransformObjectToHClip函数可以将顶点位置从物体空间转换到齐次裁剪空间
OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
return OUT;
}
// 片元着色器
half4 frag() : SV_Target
{
// 返回一个固定的颜色
half4 customColor = half4(0.5, 0, 0, 1);
//return customColor;
return _BaseColor;
}
ENDHLSL
}
}
}