Skip to content

Instantly share code, notes, and snippets.

@xCyborg
Created February 7, 2019 23:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xCyborg/1307c55578718665035b95a7b7eb41a5 to your computer and use it in GitHub Desktop.
Save xCyborg/1307c55578718665035b95a7b7eb41a5 to your computer and use it in GitHub Desktop.
Custom Render Pipeline "Luminate" starter template.
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Experimental.Rendering;
using Conditional = System.Diagnostics.ConditionalAttribute;
[CreateAssetMenu(menuName = "Rendering/LuminatePipeline")]
public class LuminateRP : RenderPipelineAsset
{
protected override IRenderPipeline InternalCreatePipeline()
{
return new CustomPipeline();
}
}
public class CustomPipeline : RenderPipeline
{
public override void Render(ScriptableRenderContext context, Camera[] cameras)
{
base.Render(context, cameras);
foreach (var camera in cameras)
{
Render(context, camera);
}
}
private CullResults cull;
private CommandBuffer buffer = new CommandBuffer {name = "Render Camera"};
private void Render(ScriptableRenderContext context, Camera camera) // Every Frame...
{
context.SetupCameraProperties(camera);
var flags = camera.clearFlags;
// Clear Buffer
buffer.ClearRenderTarget( (flags & CameraClearFlags.Depth) != 0, (flags & CameraClearFlags.Color) != 0, camera.backgroundColor);
context.ExecuteCommandBuffer(buffer);
buffer.Clear();
// Clear Buffer
// Frustum Culling
if(!CullResults.GetCullingParameters(camera, out var cullParameters)) return;
#if UNITY_EDITOR
if (camera.cameraType == CameraType.SceneView)ScriptableRenderContext.EmitWorldGeometryForSceneView(camera);
#endif
CullResults.Cull(ref cullParameters, context, ref cull);
// Frustum
// RenderLoop===========================-------------------------------------------------------------
var drawSettings = new DrawRendererSettings(camera, new ShaderPassName("SRPDefaultUnlit"));
var filterSettings = new FilterRenderersSettings(true);
// Render Opaque Objects
filterSettings.renderQueueRange = RenderQueueRange.opaque; // Opaque Only [0 ... 2500]
drawSettings.sorting.flags = SortFlags.CommonOpaque; // Front to Back
context.DrawRenderers(cull.visibleRenderers, ref drawSettings, filterSettings);
// Render Skybox
context.DrawSkybox(camera);
// Render Transparent Objects
filterSettings.renderQueueRange = RenderQueueRange.transparent; // Transparent [2501 ... 5000]
drawSettings.sorting.flags = SortFlags.CommonTransparent; // Back to Front
context.DrawRenderers(cull.visibleRenderers, ref drawSettings, filterSettings);
// Draw Default
DrawDefault(context, camera);
// RenderLoop==========================----------------------------------------------------------------
context.Submit();
}
private Material errorMaterial;
[Conditional("DEVELOPMENT_BUILD"), Conditional("UNITY_EDITOR")]
void DrawDefault(ScriptableRenderContext context, Camera camera)
{
if (errorMaterial == null) {
var errorShader = Shader.Find("Hidden/InternalErrorShader");
errorMaterial = new Material(errorShader) {
hideFlags = HideFlags.HideAndDontSave
};
}
var draw = new DrawRendererSettings(camera, new ShaderPassName("ForwardBase"));
draw.SetShaderPassName(1, new ShaderPassName("PrepassBase"));
draw.SetShaderPassName(2, new ShaderPassName("Always"));
draw.SetShaderPassName(3, new ShaderPassName("Vertex"));
draw.SetShaderPassName(4, new ShaderPassName("VertexLMRGBM"));
draw.SetShaderPassName(5, new ShaderPassName("VertexLM"));
draw.SetOverrideMaterial(errorMaterial, 0);
var filters = new FilterRenderersSettings(true); // Everything
context.DrawRenderers(cull.visibleRenderers, ref draw, filters);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment