Files
XCEngine/unity/NanoVDB/NanoVolumeCustomPass.cs

61 lines
1.9 KiB
C#

using UnityEngine;
using UnityEngine.Rendering.HighDefinition;
using UnityEngine.Rendering;
class NanoVolumeCustomPass : CustomPass
{
const int NANO_VOLUME_PASS_ID = 0;
public NanoVolumeLoader nanoVolumeLoaderComponent;
public NanoVolumeSettings nanoVolumeSettings;
Material mat;
// To make sure the shader ends up in the build, we keep a reference to it
[SerializeField, HideInInspector]
Shader volumeShader;
protected override void Setup(ScriptableRenderContext renderContext, CommandBuffer cmd)
{
volumeShader = Shader.Find("FullScreen/NanoVolumePass");
mat = CoreUtils.CreateEngineMaterial(volumeShader);
}
protected override void Execute(CustomPassContext ctx)
{
if (!nanoVolumeLoaderComponent.IsLoaded())
{
return;
}
SetUniforms();
CoreUtils.SetRenderTarget(ctx.cmd, ctx.cameraColorBuffer, ClearFlag.Color);
CoreUtils.DrawFullScreen(ctx.cmd, mat, ctx.propertyBlock, shaderPassId: NANO_VOLUME_PASS_ID);
}
protected override void Cleanup()
{
CoreUtils.Destroy(mat);
}
void SetUniforms()
{
mat.SetBuffer("buf", nanoVolumeLoaderComponent.GetGPUBuffer());
mat.SetFloat("_ClipPlaneMin", 0.01f);
mat.SetFloat("_ClipPlaneMax", 1500.0f);
mat.SetVector("_LightDir", nanoVolumeSettings.directionalLight.transform.forward);
mat.SetVector("_Light", nanoVolumeSettings.directionalLight.color);
mat.SetVector("_Scattering", nanoVolumeSettings.scatteringColor);
mat.SetFloat("_DensityScale", nanoVolumeSettings.DensitySlider.value);
mat.SetFloat("_LightAbsorbation", nanoVolumeSettings.LightAbsorbation.value);
mat.SetInt("_RayMarchSamples", (int)nanoVolumeSettings.RaymarchSamples.value);
mat.SetInt("_LightSamples", (int)nanoVolumeSettings.LightSteps.value);
mat.SetInt("_VisualizeSteps", nanoVolumeSettings.visualizeSteps);
}
}