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.
 
 
 
 

147 lines
8.6 KiB

using Unity.Mathematics;
namespace UnityEngine.Rendering.UnifiedRayTracing
{
/// <summary>
/// Shader abstraction that is used to bind resources and execute a unified ray tracing shader (.urtshader) on the GPU.
/// </summary>
/// <remarks>
/// It can be created by calling <see cref="RayTracingContext.CreateRayTracingShader"/>, <see cref="RayTracingContext.LoadRayTracingShader"/> or <see cref="RayTracingContext.LoadRayTracingShaderFromAssetBundle"/>.
/// Depending on the backend that was selected when creating the <see cref="RayTracingContext"/>, this class either wraps
/// a RayTracing or a Compute shader.
/// </remarks>
public interface IRayTracingShader
{
/// <summary>
/// Adds a command in cmd to set an IRayTracingAccelStruct on this shader.
/// </summary>
/// <param name="cmd">CommandBuffer to register the command to. </param>
/// <param name="name">Name of the variable in shader code.</param>
/// <param name="accelStruct">The IRayTracingAccelStruct to be used.</param>
void SetAccelerationStructure(CommandBuffer cmd, string name, IRayTracingAccelStruct accelStruct);
/// <summary>
/// Adds a command in cmd to set an integer parameter on this shader.
/// </summary>
/// <param name="cmd">CommandBuffer to register the command to.</param>
/// <param name="nameID">Property name ID. Use Shader.PropertyToID to get this ID.</param>
/// <param name="val">Value to set.</param>
void SetIntParam(CommandBuffer cmd, int nameID, int val);
/// <summary>
/// Adds a command in cmd to set a float parameter.
/// </summary>
/// <param name="cmd">CommandBuffer to register the command to.</param>
/// <param name="nameID">Property name ID. Use Shader.PropertyToID to get this ID.</param>
/// <param name="val">Value to set.</param>
void SetFloatParam(CommandBuffer cmd, int nameID, float val);
/// <summary>
/// Adds a command in cmd to set a vector parameter.
/// </summary>
/// <param name="cmd">CommandBuffer to register the command to.</param>
/// <param name="nameID">Property name ID. Use Shader.PropertyToID to get this ID.</param>
/// <param name="val">Value to set.</param>
void SetVectorParam(CommandBuffer cmd, int nameID, Vector4 val);
/// <summary>
/// Adds a command in cmd to set a matrix parameter.
/// </summary>
/// <param name="cmd">CommandBuffer to register the command to.</param>
/// <param name="nameID">Property name ID. Use Shader.PropertyToID to get this ID.</param>
/// <param name="val">Value to set.</param>
void SetMatrixParam(CommandBuffer cmd, int nameID, Matrix4x4 val);
/// <summary>
/// Adds a command in cmd to set a texture parameter.
/// </summary>
/// <param name="cmd">CommandBuffer to register the command to.</param>
/// <param name="nameID">Property name ID. Use Shader.PropertyToID to get this ID.</param>
/// <param name="rt">Texture to set.</param>
void SetTextureParam(CommandBuffer cmd, int nameID, RenderTargetIdentifier rt);
/// <summary>
/// Adds a command in cmd to set a buffer parameter.
/// </summary>
/// <param name="cmd">CommandBuffer to register the command to.</param>
/// <param name="nameID">Property name ID. Use Shader.PropertyToID to get this ID.</param>
/// <param name="buffer">Buffer to set.</param>
void SetBufferParam(CommandBuffer cmd, int nameID, GraphicsBuffer buffer);
/// <summary>
/// Adds a command in cmd to set a buffer parameter.
/// </summary>
/// <param name="cmd">CommandBuffer to register the command to.</param>
/// <param name="nameID">Property name ID. Use Shader.PropertyToID to get this ID.</param>
/// <param name="buffer">Buffer to set.</param>
void SetBufferParam(CommandBuffer cmd, int nameID, ComputeBuffer buffer);
/// <summary>
/// Adds a command in cmd to dispatch this IRayTracingShader.
/// </summary>
/// <remarks>
/// Dispatches to the GPU this shader to be executed on a grid of width*height*depth threads.
/// Depending on the backend, the GPU ray traversal algorithm can require additional GPU storage that is supplied through the scratchBuffer parameter.
/// Its required size can be queried by calling <see cref="GetTraceScratchBufferRequiredSizeInBytes"/>.
/// </remarks>
/// <param name="cmd">CommandBuffer to register the command to.</param>
/// <param name="scratchBuffer">Temporary buffer used during the shader's ray tracing calls.</param>
/// <param name="width">Number of threads in the X dimension.</param>
/// <param name="height">Number of threads in the Y dimension.</param>
/// <param name="depth">Number of threads in the Z dimension.</param>
void Dispatch(CommandBuffer cmd, GraphicsBuffer scratchBuffer, uint width, uint height, uint depth);
/// <summary>
/// Adds a command in cmd to dispatch this IRayTracingShader.
/// </summary>
/// <remarks>
/// Dispatches to the GPU this shader to be executed on a grid of width*height*depth threads. The grid dimensions are read directly from the argsBuffer parameter. It needs
/// to contain 3 integers: number of threads in X dimension, number of threads in Y dimension, number of threads in Z dimension.
/// Typical use case is writing to argsBuffer from another shader and then dispatching this shader, without requiring a readback to the CPU.
/// Depending on the backend, the GPU ray traversal algorithm can require additional GPU storage that is supplied through the scratchBuffer parameter.
/// Its required size can be queried by calling <see cref="GetTraceScratchBufferRequiredSizeInBytes"/>.
/// </remarks>
/// <param name="cmd">CommandBuffer to register the command to.</param>
/// <param name="scratchBuffer">Temporary buffer used during the shader's ray tracing calls.</param>
/// <param name="argsBuffer">Buffer with work grid dimensions.</param>
void Dispatch(CommandBuffer cmd, GraphicsBuffer scratchBuffer, GraphicsBuffer argsBuffer);
/// <summary>
/// Adds a command in cmd to set a constant buffer parameter.
/// </summary>
/// <param name="cmd">CommandBuffer to register the command to.</param>
/// <param name="nameID">Property name ID. Use Shader.PropertyToID to get this ID.</param>
/// <param name="buffer">The buffer to bind as constant buffer.</param>
/// <param name="offset">The offset in bytes from the beginning of the buffer to bind. Must be a multiple of SystemInfo.constantBufferOffsetAlignment, or 0 if that value is 0.</param>
/// <param name="size">The number of bytes to bind.</param>
void SetConstantBufferParam(CommandBuffer cmd, int nameID, GraphicsBuffer buffer, int offset, int size);
/// <summary>
/// Adds a command in cmd to set a constant buffer parameter.
/// </summary>
/// <param name="cmd">CommandBuffer to register the command to.</param>
/// <param name="nameID">Property name ID. Use Shader.PropertyToID to get this ID.</param>
/// <param name="buffer">The buffer to bind as constant buffer.</param>
/// <param name="offset">The offset in bytes from the beginning of the buffer to bind. Must be a multiple of SystemInfo.constantBufferOffsetAlignment, or 0 if that value is 0.</param>
/// <param name="size">The number of bytes to bind.</param>
void SetConstantBufferParam(CommandBuffer cmd, int nameID, ComputeBuffer buffer, int offset, int size);
/// <summary>
/// Returns the minimum buffer size that is required by the scratchBuffer parameter of <see cref="Dispatch"/>.
/// This size depends on the specific values for width,height and depth that will be passed to Dispatch().
/// </summary>
/// <param name="width">Number of threads in the X dimension.</param>
/// <param name="height">Number of threads in the Y dimension.</param>
/// <param name="depth">Number of threads in the Z dimension.</param>
/// <returns>The minimum size in bytes.</returns>
ulong GetTraceScratchBufferRequiredSizeInBytes(uint width, uint height, uint depth);
/// <summary>
/// Get the thread group sizes of this shader.
/// </summary>
/// <returns>Thread group size in the X,Y and Z directions.</returns>
uint3 GetThreadGroupSizes();
}
}