浏览代码

Output diffuse lighting into a separate render target

/main
Evgenii Golubev 8 年前
当前提交
2bfdeef3
共有 7 个文件被更改,包括 62 次插入39 次删除
  1. 38
      Assets/ScriptableRenderLoop/HDRenderPipeline/HDRenderPipeline.cs
  2. 2
      Assets/ScriptableRenderLoop/HDRenderPipeline/Lighting/LightLoop.cs
  3. 13
      Assets/ScriptableRenderLoop/HDRenderPipeline/Lighting/Resources/Deferred.shader
  4. 6
      Assets/ScriptableRenderLoop/HDRenderPipeline/Lighting/TilePass/Resources/shadeopaque.compute
  5. 15
      Assets/ScriptableRenderLoop/HDRenderPipeline/Lighting/TilePass/TilePass.cs
  6. 6
      Assets/ScriptableRenderLoop/HDRenderPipeline/ShaderPass/ShaderPassForward.hlsl
  7. 21
      Assets/ScriptableRenderLoop/HDRenderPipeline/Utilities.cs

38
Assets/ScriptableRenderLoop/HDRenderPipeline/HDRenderPipeline.cs


// Various buffer
int m_CameraColorBuffer;
int m_CameraDiffuseLightingBuffer;
RenderTargetIdentifier m_CameraDiffuseLightingBufferRT;
RenderTargetIdentifier m_CameraDepthBufferRT;
RenderTargetIdentifier m_VelocityBufferRT;
RenderTargetIdentifier m_DistortionBufferRT;

UnityEngine.Rendering.GraphicsSettings.lightsUseLinearIntensity = true;
UnityEngine.Rendering.GraphicsSettings.lightsUseCCT = true;
m_CameraColorBuffer = Shader.PropertyToID("_CameraColorTexture");
m_CameraDepthBuffer = Shader.PropertyToID("_CameraDepthTexture");
m_CameraColorBuffer = Shader.PropertyToID("_CameraColorTexture");
m_CameraDiffuseLightingBuffer = Shader.PropertyToID("_CameraDiffuseLightingBuffer");
m_CameraDepthBuffer = Shader.PropertyToID("_CameraDepthTexture");
m_CameraColorBufferRT = new RenderTargetIdentifier(m_CameraColorBuffer);
m_CameraDepthBufferRT = new RenderTargetIdentifier(m_CameraDepthBuffer);
m_CameraColorBufferRT = new RenderTargetIdentifier(m_CameraColorBuffer);
m_CameraDiffuseLightingBufferRT = new RenderTargetIdentifier(m_CameraDiffuseLightingBuffer);
m_CameraDepthBufferRT = new RenderTargetIdentifier(m_CameraDepthBuffer);
m_SkyManager.Build();

int w = camera.pixelWidth;
int h = camera.pixelHeight;
cmd.GetTemporaryRT(m_CameraColorBuffer, w, h, 0, FilterMode.Point, RenderTextureFormat.ARGBHalf, RenderTextureReadWrite.Linear, 1, true); // Enable UAV
cmd.GetTemporaryRT(m_CameraDepthBuffer, w, h, 24, FilterMode.Point, RenderTextureFormat.Depth);
cmd.GetTemporaryRT(m_CameraColorBuffer, w, h, 0, FilterMode.Point, RenderTextureFormat.ARGBHalf, RenderTextureReadWrite.Linear, 1, true); // Enable UAV
cmd.GetTemporaryRT(m_CameraDiffuseLightingBuffer, w, h, 0, FilterMode.Point, RenderTextureFormat.RGB111110Float, RenderTextureReadWrite.Linear, 1, true); // Enable UAV
cmd.GetTemporaryRT(m_CameraDepthBuffer, w, h, 24, FilterMode.Point, RenderTextureFormat.Depth);
Utilities.SetRenderTarget(renderContext, m_CameraColorBufferRT, m_CameraDepthBufferRT, ClearFlag.ClearDepth);
RenderTargetIdentifier[] colorRTs = { m_CameraColorBuffer, m_CameraDiffuseLightingBufferRT };
Utilities.SetRenderTarget(renderContext, colorRTs, m_CameraDepthBufferRT, ClearFlag.ClearDepth);
// Clear HDR target
// Clear the HDR target
// Clear the diffuse lighting target
using (new Utilities.ProfilingSample("Clear diffuse lighting target", renderContext))
{
Utilities.SetRenderTarget(renderContext, m_CameraDiffuseLightingBufferRT, m_CameraDepthBufferRT, ClearFlag.ClearColor, Color.black);
}
// Clear GBuffers
using (new Utilities.ProfilingSample("Clear GBuffer", renderContext))

// Bind material data
m_LitRenderLoop.Bind();
m_lightLoop.RenderDeferredLighting(hdCamera, renderContext, m_CameraColorBuffer);
RenderTargetIdentifier[] colorRTs = { m_CameraColorBuffer, m_CameraDiffuseLightingBufferRT };
m_lightLoop.RenderDeferredLighting(hdCamera, renderContext, colorRTs);
}
void UpdateSkyEnvironment(HDCamera hdCamera, ScriptableRenderContext renderContext)

// Bind material data
m_LitRenderLoop.Bind();
Utilities.SetRenderTarget(renderContext, m_CameraColorBufferRT, m_CameraDepthBufferRT);
RenderTargetIdentifier[] colorRTs = { m_CameraColorBuffer, m_CameraDiffuseLightingBufferRT };
Utilities.SetRenderTarget(renderContext, colorRTs, m_CameraDepthBufferRT);
m_lightLoop.RenderForward(camera, renderContext, renderOpaque);

// Bind material data
m_LitRenderLoop.Bind();
Utilities.SetRenderTarget(renderContext, m_CameraColorBufferRT, m_CameraDepthBufferRT);
RenderTargetIdentifier[] colorRTs = { m_CameraColorBuffer, m_CameraDiffuseLightingBufferRT };
Utilities.SetRenderTarget(renderContext, colorRTs, m_CameraDepthBufferRT);
m_lightLoop.RenderForward(camera, renderContext, true);
RenderOpaqueRenderList(cullResults, camera, renderContext, "ForwardOnlyOpaque");

2
Assets/ScriptableRenderLoop/HDRenderPipeline/Lighting/LightLoop.cs


public virtual void PushGlobalParams(Camera camera, ScriptableRenderContext loop) {}
public virtual void RenderDeferredLighting(HDRenderPipeline.HDCamera hdCamera, ScriptableRenderContext renderContext, RenderTargetIdentifier cameraColorBufferRT) {}
public virtual void RenderDeferredLighting(HDRenderPipeline.HDCamera hdCamera, ScriptableRenderContext renderContext, RenderTargetIdentifier[] cameraColorBufferRTs) {}
public virtual void RenderForward(Camera camera, ScriptableRenderContext renderContext, bool renderOpaque) {}

13
Assets/ScriptableRenderLoop/HDRenderPipeline/Lighting/Resources/Deferred.shader


float4 positionCS : SV_POSITION;
};
struct Outputs
{
float4 combinedLighting : SV_Target0;
float3 diffuseLighting : SV_Target1;
};
Varyings Vert(Attributes input)
{
Varyings output;

return output;
}
float4 Frag(Varyings input) : SV_Target
Outputs Frag(Varyings input)
{
// input.positionCS is SV_Position
PositionInputs posInput = GetPositionInput(input.positionCS.xy, _ScreenSize.zw);

float3 specularLighting;
LightLoop(V, posInput, preLightData, bsdfData, bakeDiffuseLighting, diffuseLighting, specularLighting);
return float4(diffuseLighting + specularLighting, 1.0);
Outputs outputs;
outputs.combinedLighting = float4(diffuseLighting + specularLighting, 1.0);
outputs.diffuseLighting = float3(diffuseLighting);
return outputs;
}
ENDHLSL

6
Assets/ScriptableRenderLoop/HDRenderPipeline/Lighting/TilePass/Resources/shadeopaque.compute


TEXTURE2D(_CameraDepthTexture);
SAMPLER2D(sampler_CameraDepthTexture);
RWTexture2D<float4> uavOutput;
RWTexture2D<float4> combinedLightingUAV;
RWTexture2D<float3> diffuseLightingUAV;
[numthreads(TILE_SIZE, TILE_SIZE, 1)]
void SHADE_OPAQUE_ENTRY(uint2 dispatchThreadId : SV_DispatchThreadID, uint2 groupId : SV_GroupID)

float3 specularLighting;
LightLoop(V, posInput, preLightData, bsdfData, bakeDiffuseLighting, diffuseLighting, specularLighting);
uavOutput[pixelCoord] = float4(diffuseLighting + specularLighting, 1.0);
combinedLightingUAV[pixelCoord] = float4(diffuseLighting + specularLighting, 1.0);
diffuseLightingUAV[pixelCoord] = float3(diffuseLighting);
}

15
Assets/ScriptableRenderLoop/HDRenderPipeline/Lighting/TilePass/TilePass.cs


}
#endif
public override void RenderDeferredLighting(HDRenderPipeline.HDCamera hdCamera, ScriptableRenderContext renderContext, RenderTargetIdentifier cameraColorBufferRT)
public override void RenderDeferredLighting(HDRenderPipeline.HDCamera hdCamera, ScriptableRenderContext renderContext, RenderTargetIdentifier[] cameraColorBufferRTs)
{
var bUseClusteredForDeferred = !usingFptl;

m_SingleDeferredMaterial.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
m_SingleDeferredMaterial.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
Utilities.DrawFullscreen(renderContext, m_SingleDeferredMaterial, cameraColorBufferRT, 0);
Utilities.DrawFullscreen(cmd, m_SingleDeferredMaterial, cameraColorBufferRTs, 0);
}
else
{

cmd.SetComputeTextureParam(shadeOpaqueShader, kernel, "_IESArray", IESArrayTexture ? IESArrayTexture : m_DefaultTexture2DArray);
cmd.SetComputeTextureParam(shadeOpaqueShader, kernel, "_SkyTexture", skyTexture ? skyTexture : m_DefaultTexture2DArray);
cmd.SetComputeTextureParam(shadeOpaqueShader, kernel, "uavOutput", cameraColorBufferRT);
cmd.SetComputeTextureParam(shadeOpaqueShader, kernel, "combinedLightingUAV", cameraColorBufferRTs[0]);
cmd.SetComputeTextureParam(shadeOpaqueShader, kernel, "diffuseLightingUAV", cameraColorBufferRTs[1]);
cmd.DispatchCompute(shadeOpaqueShader, kernel, numTilesX, numTilesY, 1);
}
else

m_DeferredIndirectMaterial.EnableKeyword(bUseClusteredForDeferred ? "USE_CLUSTERED_LIGHTLIST" : "USE_FPTL_LIGHTLIST");
m_DeferredIndirectMaterial.DisableKeyword(!bUseClusteredForDeferred ? "USE_CLUSTERED_LIGHTLIST" : "USE_FPTL_LIGHTLIST");
cmd.Blit(null, cameraColorBufferRT, m_DeferredDirectMaterial, 0);
cmd.Blit(null, cameraColorBufferRT, m_DeferredIndirectMaterial, 0);
Utilities.DrawFullscreen(cmd, m_DeferredDirectMaterial, cameraColorBufferRTs, 0);
Utilities.DrawFullscreen(cmd, m_DeferredIndirectMaterial, cameraColorBufferRTs, 0);
}
else
{

m_DeferredAllMaterial.EnableKeyword(bUseClusteredForDeferred ? "USE_CLUSTERED_LIGHTLIST" : "USE_FPTL_LIGHTLIST");
m_DeferredAllMaterial.DisableKeyword(!bUseClusteredForDeferred ? "USE_CLUSTERED_LIGHTLIST" : "USE_FPTL_LIGHTLIST");
cmd.Blit(null, cameraColorBufferRT, m_DeferredAllMaterial, 0);
Utilities.DrawFullscreen(cmd, m_DeferredAllMaterial, cameraColorBufferRTs, 0);
}
}

m_DebugViewTilesMaterial.EnableKeyword(bUseClusteredForDeferred ? "USE_CLUSTERED_LIGHTLIST" : "USE_FPTL_LIGHTLIST");
m_DebugViewTilesMaterial.DisableKeyword(!bUseClusteredForDeferred ? "USE_CLUSTERED_LIGHTLIST" : "USE_FPTL_LIGHTLIST");
cmd.Blit(null, cameraColorBufferRT, m_DebugViewTilesMaterial, 0);
cmd.Blit(null, cameraColorBufferRTs[0], m_DebugViewTilesMaterial, 0);
}
}

6
Assets/ScriptableRenderLoop/HDRenderPipeline/ShaderPass/ShaderPassForward.hlsl


#endif // TESSELLATION_ON
void Frag( PackedVaryingsToPS packedInput,
out float4 outColor : SV_Target
out float4 outCombinedLighting : SV_Target0,
out float3 outDiffuseLighting : SV_Target1
#ifdef _DEPTHOFFSET_ON
, out float outputDepth : SV_Depth
#endif

float3 bakeDiffuseLighting = GetBakedDiffuseLigthing(surfaceData, builtinData, bsdfData, preLightData);
LightLoop(V, posInput, preLightData, bsdfData, bakeDiffuseLighting, diffuseLighting, specularLighting);
outColor = float4(diffuseLighting + specularLighting, builtinData.opacity);
outCombinedLighting = float4(diffuseLighting + specularLighting, builtinData.opacity);
outDiffuseLighting = float3(diffuseLighting);
#ifdef _DEPTHOFFSET_ON
outputDepth = posInput.depthRaw;

21
Assets/ScriptableRenderLoop/HDRenderPipeline/Utilities.cs


};
// Draws a full screen triangle as a faster alternative to drawing a full-screen quad.
public static void DrawFullscreen(ScriptableRenderContext context, Material material, RenderTargetIdentifier colorBuffer, int shaderPassID = 0)
public static void DrawFullscreen(CommandBuffer commandBuffer, Material material, RenderTargetIdentifier colorBuffer, int shaderPassID = 0)
var cmd = new CommandBuffer() { name = material.GetPassName(shaderPassID) };
cmd.SetRenderTarget(colorBuffer);
cmd.DrawMesh(m_ScreenSpaceTriangle, Matrix4x4.identity, material, 0, shaderPassID);
context.ExecuteCommandBuffer(cmd);
cmd.Dispose();
commandBuffer.SetRenderTarget(colorBuffer);
commandBuffer.DrawMesh(m_ScreenSpaceTriangle, Matrix4x4.identity, material, 0, shaderPassID);
public static void DrawFullscreen(ScriptableRenderContext context, Material material, RenderTargetIdentifier[] colorBuffers, int shaderPassID = 0)
public static void DrawFullscreen(CommandBuffer commandBuffer, Material material, RenderTargetIdentifier[] colorBuffers, int shaderPassID = 0)
var cmd = new CommandBuffer() { name = material.GetPassName(shaderPassID) };
cmd.GetTemporaryRT(tempDepthBufferID, 2281, 767, 24, FilterMode.Point, RenderTextureFormat.Depth);
commandBuffer.GetTemporaryRT(tempDepthBufferID, 2283, 767, 24, FilterMode.Point, RenderTextureFormat.Depth);
cmd.SetRenderTarget(colorBuffers, tempDepthBuffer);
cmd.DrawMesh(m_ScreenSpaceTriangle, Matrix4x4.identity, material, 0, shaderPassID);
context.ExecuteCommandBuffer(cmd);
cmd.Dispose();
commandBuffer.SetRenderTarget(colorBuffers, tempDepthBuffer);
commandBuffer.DrawMesh(m_ScreenSpaceTriangle, Matrix4x4.identity, material, 0, shaderPassID);
}
// Miscellanous

正在加载...
取消
保存