157 lines
6.9 KiB
C#
157 lines
6.9 KiB
C#
using UnityEngine;
|
|
using UnityEngine.Rendering;
|
|
using UnityEngine.Rendering.Universal;
|
|
|
|
#if !UNITY_6000_4_OR_NEWER
|
|
namespace ShinySSRR {
|
|
|
|
public partial class ShinySSRR {
|
|
|
|
public partial class SmoothnessMetallicPass {
|
|
|
|
public override void Configure (CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) {
|
|
|
|
RenderTextureDescriptor desc = cameraTextureDescriptor;
|
|
desc.colorFormat = RenderTextureFormat.RGHalf; // r = smoothness, g = metallic
|
|
desc.depthBufferBits = 24;
|
|
desc.msaaSamples = 1;
|
|
|
|
cmd.GetTemporaryRT(ShaderParams.SmoothnessMetallicRT, desc, FilterMode.Point);
|
|
cmd.SetGlobalTexture(ShaderParams.SmoothnessMetallicRT, smootnessMetallicRT);
|
|
ConfigureTarget(smootnessMetallicRT);
|
|
ConfigureClear(ClearFlag.All, Color.black);
|
|
}
|
|
|
|
public override void Execute (ScriptableRenderContext context, ref RenderingData renderingData) {
|
|
|
|
CommandBuffer cmd = CommandBufferPool.Get(m_ProfilerTag);
|
|
|
|
SortingCriteria sortingCriteria = SortingCriteria.CommonOpaque;
|
|
var drawSettings = CreateDrawingSettings(shaderTagIdList, ref renderingData, sortingCriteria);
|
|
context.DrawRenderers(renderingData.cullResults, ref drawSettings, ref filterSettings);
|
|
|
|
context.ExecuteCommandBuffer(cmd);
|
|
|
|
CommandBufferPool.Release(cmd);
|
|
}
|
|
}
|
|
|
|
partial class SSRPass {
|
|
|
|
public override void Configure (CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) {
|
|
ConfigureInput(GetRequiredInputs());
|
|
}
|
|
|
|
public override void Execute (ScriptableRenderContext context, ref RenderingData renderingData) {
|
|
|
|
Camera cam = renderingData.cameraData.camera;
|
|
|
|
// execute reflections passes
|
|
CommandBuffer cmd = CommandBufferPool.Get(SHINY_CBUFNAME);
|
|
passData.cmd = cmd;
|
|
passData.cam = renderingData.cameraData.camera;
|
|
passData.sourceDesc = renderingData.cameraData.cameraTargetDescriptor;
|
|
#if UNITY_2022_2_OR_NEWER
|
|
passData.source = renderer.cameraColorTargetHandle;
|
|
#else
|
|
passData.source = renderer.cameraColorTarget;
|
|
#endif
|
|
ExecuteInternal(passData);
|
|
context.ExecuteCommandBuffer(cmd);
|
|
CommandBufferPool.Release(cmd);
|
|
}
|
|
}
|
|
|
|
partial class SSRBackfacesPass {
|
|
|
|
public override void Configure (CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) {
|
|
RenderTextureDescriptor depthDesc = cameraTextureDescriptor;
|
|
int downsampling = settings.downsampling.value;
|
|
depthDesc.width = Mathf.CeilToInt(depthDesc.width / downsampling);
|
|
depthDesc.height = Mathf.CeilToInt(depthDesc.height / downsampling);
|
|
depthDesc.colorFormat = RenderTextureFormat.Depth;
|
|
depthDesc.depthBufferBits = 24;
|
|
depthDesc.msaaSamples = 1;
|
|
|
|
cmd.GetTemporaryRT(ShaderParams.DownscaledBackDepthRT, depthDesc, FilterMode.Point);
|
|
cmd.SetGlobalTexture(ShaderParams.DownscaledBackDepthRT, m_Depth);
|
|
ConfigureTarget(m_Depth);
|
|
ConfigureClear(ClearFlag.All, Color.black);
|
|
}
|
|
|
|
public override void Execute (ScriptableRenderContext context, ref RenderingData renderingData) {
|
|
CommandBuffer cmd = CommandBufferPool.Get(m_ProfilerTag);
|
|
context.ExecuteCommandBuffer(cmd);
|
|
cmd.Clear();
|
|
|
|
SortingCriteria sortingCriteria = SortingCriteria.CommonOpaque;
|
|
var drawSettings = CreateDrawingSettings(shaderTagIdList, ref renderingData, sortingCriteria);
|
|
drawSettings.perObjectData = PerObjectData.None;
|
|
if (depthOnlyMaterial == null) {
|
|
Shader depthOnly = Shader.Find(m_DepthOnlyShader);
|
|
depthOnlyMaterial = new Material(depthOnly);
|
|
depthOnlyMaterial.SetInt(_Cull, (int)CullMode.Front);
|
|
}
|
|
drawSettings.overrideMaterial = depthOnlyMaterial;
|
|
drawSettings.overrideMaterialPassIndex = 0;
|
|
context.DrawRenderers(renderingData.cullResults, ref drawSettings, ref filterSettings);
|
|
|
|
context.ExecuteCommandBuffer(cmd);
|
|
|
|
CommandBufferPool.Release(cmd);
|
|
}
|
|
}
|
|
|
|
public partial class DepthRenderPass {
|
|
|
|
public override void Configure (CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) {
|
|
if (transparentLayerMask != filterSettings.layerMask) {
|
|
filterSettings = new FilteringSettings(RenderQueueRange.transparent, transparentLayerMask);
|
|
}
|
|
RenderTextureDescriptor depthDesc = cameraTextureDescriptor;
|
|
depthDesc.colorFormat = RenderTextureFormat.Depth;
|
|
depthDesc.depthBufferBits = 24;
|
|
depthDesc.msaaSamples = 1;
|
|
|
|
cmd.GetTemporaryRT(ShaderParams.CustomDepthTexture, depthDesc, FilterMode.Point);
|
|
cmd.SetGlobalTexture(ShaderParams.CustomDepthTexture, m_Depth);
|
|
ConfigureTarget(m_Depth);
|
|
ConfigureClear(ClearFlag.All, Color.black);
|
|
}
|
|
|
|
public override void Execute (ScriptableRenderContext context, ref RenderingData renderingData) {
|
|
if (transparentLayerMask == 0) return;
|
|
CommandBuffer cmd = CommandBufferPool.Get(m_ProfilerTag);
|
|
context.ExecuteCommandBuffer(cmd);
|
|
cmd.Clear();
|
|
|
|
|
|
SortingCriteria sortingCriteria = SortingCriteria.CommonTransparent;
|
|
var drawSettings = CreateDrawingSettings(shaderTagIdList, ref renderingData, sortingCriteria);
|
|
drawSettings.perObjectData = PerObjectData.None;
|
|
|
|
if (useOptimizedDepthOnlyShader) {
|
|
if (depthOnlyMaterial == null) {
|
|
Shader depthOnly = Shader.Find(m_DepthOnlyShader);
|
|
depthOnlyMaterial = new Material(depthOnly);
|
|
}
|
|
drawSettings.overrideMaterial = depthOnlyMaterial;
|
|
}
|
|
context.DrawRenderers(renderingData.cullResults, ref drawSettings, ref filterSettings);
|
|
|
|
int transparentSupportCount = transparentSupport.Count;
|
|
for (int i = 0; i < transparentSupportCount; i++) {
|
|
Renderer renderer = transparentSupport[i].theRenderer;
|
|
if (renderer != null) {
|
|
cmd.DrawRenderer(renderer, depthOnlyMaterial);
|
|
}
|
|
}
|
|
|
|
context.ExecuteCommandBuffer(cmd);
|
|
CommandBufferPool.Release(cmd);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|