ScriptableRenderPipeline学习(2)

ScriptableRenderPipeline学习(2)

  • 项目地址
  • 渲染Cube
  • Cube所用的Shader

项目地址

https://github.com/0odrifto0/CustomRenderPipeline

渲染Cube

之前我们搭建了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执行渲染。

Cube所用的Shader

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内建的变量。

你可能感兴趣的:(Unity)