https://github.com/0odrifto0/CustomRenderPipeline
之前我们搭建了SRP,并实现了用指定颜色清除屏幕,这次我们渲染一个Cube。SRP的常规流程是这样的:
1、根据摄像机信息,执行剔除操作(包括视锥剔除和遮挡剔除)
// Culling
ScriptableCullingParameters cullParams;
if (!CullResults.GetCullingParameters(camera, out cullParams))
continue;
CullResults cullResults = new CullResults();
CullResults.Cull(ref cullParams, renderContext, ref cullResults);
这一步基本是Unity底层做的,脚本层可以做一些配置。
2、将当前摄像机的属性传递到Shader里(变换矩阵等)
// Setup Camera
renderContext.SetupCameraProperties(camera);
这里调用的Context对象的SetupCameraProperties方法,它会把Unity内建的一些变量传递到Shader里。如果有额外的需求也可以自己通过Shader.SetGlobalXXX传入。
3、过滤需要渲染的对象
// Filter
var opaqueRange = new FilterRenderersSettings(true)
{
renderQueueRange = RenderQueueRange.opaque
};
通过FilterRenderersSettings,我们可以过滤出我们想要渲染的对象集合,它支持通过Unity的Layer和RenderQueue去过滤对象,在这里我们的过滤条件是所有不透明物体(也就是我们马上要渲染的Cube)
4、配置渲染参数和执行渲染
// Render setting
var drs = new DrawRendererSettings(camera, new ShaderPassName("BasePass"));
drs.sorting.flags = SortFlags.CommonOpaque;
renderContext.DrawRenderers(cullResults.visibleRenderers, ref drs, opaqueRange);
这里的DrawRendererSettings描述了物体如何被渲染。在上面的代码中,我们选取Shader中LightMode为BasePass的Pass(还记得老渲染管线中的ForwardBase,ForwardAdd吗,现在这些全部可以自定义了),物体渲染顺序按照不透明物体的从前到后排序,然后调用DrawRenderers执行渲染。
Shader "CustomSRP/BaseColor"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" "Queue" = "Geometry" }
LOD 100
Pass
{
Tags { "LightMode" = "BasePass" }
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Assets/ShaderLibrary/Core.hlsl"
struct appdata
{
float3 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
o.vertex = TransformObjectToHClip(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
half4 frag (v2f i) : SV_Target
{
return tex2D(_MainTex, i.uv);
}
ENDHLSL
}
}
}
注意:这里没有include Unity自带的UnityCG.cginc,Unity在实现SRP时重写了新的Shader库,出于学习的目的,之后自己实现一下各种渲染效果,不过这里还是拷贝了轻量级渲染管线中的Input.hlsl和UnityInput.hlsl两个文件,因为这两个文件主要是帮助定义一些Unity内建的变量。