You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
4.5 KiB
126 lines
4.5 KiB
using Unity.Mathematics;
|
|
using UnityEngine.Assertions;
|
|
|
|
namespace UnityEngine.Rendering.UnifiedRayTracing
|
|
{
|
|
internal class HardwareRayTracingShader : IRayTracingShader
|
|
{
|
|
readonly RayTracingShader m_Shader;
|
|
readonly string m_ShaderDispatchFuncName;
|
|
|
|
internal HardwareRayTracingShader(RayTracingShader shader, string dispatchFuncName, GraphicsBuffer unused)
|
|
{
|
|
m_Shader = shader;
|
|
m_ShaderDispatchFuncName = dispatchFuncName;
|
|
}
|
|
|
|
public uint3 GetThreadGroupSizes()
|
|
{
|
|
return new uint3(1, 1, 1);
|
|
}
|
|
|
|
public void SetAccelerationStructure(CommandBuffer cmd, string name, IRayTracingAccelStruct accelStruct)
|
|
{
|
|
Utils.CheckArgIsNotNull(cmd, nameof(cmd));
|
|
Utils.CheckArgIsNotNull(accelStruct, nameof(accelStruct));
|
|
|
|
cmd.SetRayTracingShaderPass(m_Shader, "RayTracing");
|
|
|
|
var hwAccelStruct = accelStruct as HardwareRayTracingAccelStruct;
|
|
Debug.Assert(hwAccelStruct != null);
|
|
|
|
cmd.SetRayTracingAccelerationStructure(m_Shader, Shader.PropertyToID(name+"accelStruct"), hwAccelStruct.accelStruct);
|
|
}
|
|
|
|
public void SetIntParam(CommandBuffer cmd, int nameID, int val)
|
|
{
|
|
Utils.CheckArgIsNotNull(cmd, nameof(cmd));
|
|
|
|
cmd.SetRayTracingIntParam(m_Shader, nameID, val);
|
|
}
|
|
|
|
public void SetFloatParam(CommandBuffer cmd, int nameID, float val)
|
|
{
|
|
Utils.CheckArgIsNotNull(cmd, nameof(cmd));
|
|
|
|
cmd.SetRayTracingFloatParam(m_Shader, nameID, val);
|
|
}
|
|
|
|
public void SetVectorParam(CommandBuffer cmd, int nameID, Vector4 val)
|
|
{
|
|
Utils.CheckArgIsNotNull(cmd, nameof(cmd));
|
|
|
|
cmd.SetRayTracingVectorParam(m_Shader, nameID, val);
|
|
}
|
|
|
|
public void SetMatrixParam(CommandBuffer cmd, int nameID, Matrix4x4 val)
|
|
{
|
|
Utils.CheckArgIsNotNull(cmd, nameof(cmd));
|
|
|
|
cmd.SetRayTracingMatrixParam(m_Shader, nameID, val);
|
|
}
|
|
|
|
public void SetTextureParam(CommandBuffer cmd, int nameID, RenderTargetIdentifier rt)
|
|
{
|
|
Utils.CheckArgIsNotNull(cmd, nameof(cmd));
|
|
|
|
cmd.SetRayTracingTextureParam(m_Shader, nameID, rt);
|
|
}
|
|
|
|
public void SetBufferParam(CommandBuffer cmd, int nameID, GraphicsBuffer buffer)
|
|
{
|
|
Utils.CheckArgIsNotNull(cmd, nameof(cmd));
|
|
Utils.CheckArgIsNotNull(buffer, nameof(buffer));
|
|
|
|
cmd.SetRayTracingBufferParam(m_Shader, nameID, buffer);
|
|
}
|
|
|
|
public void SetBufferParam(CommandBuffer cmd, int nameID, ComputeBuffer buffer)
|
|
{
|
|
Utils.CheckArgIsNotNull(cmd, nameof(cmd));
|
|
Utils.CheckArgIsNotNull(buffer, nameof(buffer));
|
|
|
|
cmd.SetRayTracingBufferParam(m_Shader, nameID, buffer);
|
|
}
|
|
|
|
public void SetConstantBufferParam(CommandBuffer cmd, int nameID, GraphicsBuffer buffer, int offset, int size)
|
|
{
|
|
Utils.CheckArgIsNotNull(cmd, nameof(cmd));
|
|
Utils.CheckArgIsNotNull(buffer, nameof(buffer));
|
|
|
|
cmd.SetRayTracingConstantBufferParam(m_Shader, nameID, buffer, offset, size);
|
|
}
|
|
|
|
public void SetConstantBufferParam(CommandBuffer cmd, int nameID, ComputeBuffer buffer, int offset, int size)
|
|
{
|
|
Utils.CheckArgIsNotNull(cmd, nameof(cmd));
|
|
Utils.CheckArgIsNotNull(buffer, nameof(buffer));
|
|
|
|
cmd.SetRayTracingConstantBufferParam(m_Shader, nameID, buffer, offset, size);
|
|
}
|
|
|
|
public void Dispatch(CommandBuffer cmd, GraphicsBuffer scratchBuffer, uint width, uint height, uint depth)
|
|
{
|
|
Utils.CheckArgIsNotNull(cmd, nameof(cmd));
|
|
|
|
cmd.DispatchRays(m_Shader, m_ShaderDispatchFuncName, width, height, depth, null);
|
|
}
|
|
|
|
public void Dispatch(CommandBuffer cmd, GraphicsBuffer scratchBuffer, GraphicsBuffer argsBuffer)
|
|
{
|
|
Utils.CheckArgIsNotNull(cmd, nameof(cmd));
|
|
Utils.CheckArgIsNotNull(argsBuffer, nameof(argsBuffer));
|
|
GraphicsBuffer.Target requiredFlags = GraphicsBuffer.Target.IndirectArguments | GraphicsBuffer.Target.Structured;
|
|
Utils.CheckArg((argsBuffer.target & requiredFlags) == requiredFlags, "argsBuffer.target must have both Target.IndirectArguments and Target.Structured set");
|
|
|
|
cmd.DispatchRays(m_Shader, m_ShaderDispatchFuncName, argsBuffer, 0);
|
|
}
|
|
public ulong GetTraceScratchBufferRequiredSizeInBytes(uint width, uint height, uint depth)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|