UnityGame/Library/PackageCache/com.unity.render-pipelines.core/Runtime/GPUDriven/RenderersParameters.cs

140 lines
7.2 KiB
C#
Raw Normal View History

2024-10-27 10:53:47 +03:00
using System;
using System.Collections.Generic;
using UnityEngine.Assertions;
using Unity.Collections;
using Unity.Collections.LowLevel.Unsafe;
using Unity.Jobs;
namespace UnityEngine.Rendering
{
[Flags]
internal enum InstanceComponentGroup : uint
{
Default = 1 << 0,
Wind = 1 << 1,
LightProbe = 1 << 2,
Lightmap = 1 << 3,
DefaultWind = Default | Wind,
DefaultLightProbe = Default | LightProbe,
DefaultLightmap = Default | Lightmap,
DefaultWindLightProbe = Default | Wind | LightProbe,
DefaultWindLightmap = Default | Wind | Lightmap,
}
internal struct RenderersParameters
{
static private int s_uintSize = UnsafeUtility.SizeOf<uint>();
[Flags]
public enum Flags
{
None = 0,
UseBoundingSphereParameter = 1 << 0
}
public static class ParamNames
{
public static readonly int _BaseColor = Shader.PropertyToID("_BaseColor");
public static readonly int unity_SpecCube0_HDR = Shader.PropertyToID("unity_SpecCube0_HDR");
public static readonly int unity_SHCoefficients = Shader.PropertyToID("unity_SHCoefficients");
public static readonly int unity_LightmapST = Shader.PropertyToID("unity_LightmapST");
public static readonly int unity_ObjectToWorld = Shader.PropertyToID("unity_ObjectToWorld");
public static readonly int unity_WorldToObject = Shader.PropertyToID("unity_WorldToObject");
public static readonly int unity_MatrixPreviousM = Shader.PropertyToID("unity_MatrixPreviousM");
public static readonly int unity_MatrixPreviousMI = Shader.PropertyToID("unity_MatrixPreviousMI");
public static readonly int unity_WorldBoundingSphere = Shader.PropertyToID("unity_WorldBoundingSphere");
public static readonly int[] DOTS_ST_WindParams = new int[(int)SpeedTreeWindParamIndex.MaxWindParamsCount];
public static readonly int[] DOTS_ST_WindHistoryParams = new int[(int)SpeedTreeWindParamIndex.MaxWindParamsCount];
static ParamNames()
{
for(int i = 0; i < (int)SpeedTreeWindParamIndex.MaxWindParamsCount; ++i)
{
DOTS_ST_WindParams[i] = Shader.PropertyToID($"DOTS_ST_WindParam{i}");
DOTS_ST_WindHistoryParams[i] = Shader.PropertyToID($"DOTS_ST_WindHistoryParam{i}");
}
}
}
public static GPUInstanceDataBuffer CreateInstanceDataBuffer(Flags flags, in InstanceNumInfo instanceNumInfo)
{
using (var builder = new GPUInstanceDataBufferBuilder())
{
builder.AddComponent<Vector4>(ParamNames._BaseColor, isOverriden: false, isPerInstance: false, InstanceType.MeshRenderer);
builder.AddComponent<Vector4>(ParamNames.unity_SpecCube0_HDR, isOverriden: false, isPerInstance: false, InstanceType.MeshRenderer);
builder.AddComponent<SHCoefficients>(ParamNames.unity_SHCoefficients, isOverriden: true, isPerInstance: true, InstanceType.MeshRenderer, InstanceComponentGroup.LightProbe);
builder.AddComponent<Vector4>(ParamNames.unity_LightmapST, isOverriden: true, isPerInstance: true, InstanceType.MeshRenderer, InstanceComponentGroup.Lightmap);
builder.AddComponent<PackedMatrix>(ParamNames.unity_ObjectToWorld, isOverriden: true, isPerInstance: true, InstanceType.MeshRenderer);
builder.AddComponent<PackedMatrix>(ParamNames.unity_WorldToObject, isOverriden: true, isPerInstance: true, InstanceType.MeshRenderer);
builder.AddComponent<PackedMatrix>(ParamNames.unity_MatrixPreviousM, isOverriden: true, isPerInstance: true, InstanceType.MeshRenderer);
builder.AddComponent<PackedMatrix>(ParamNames.unity_MatrixPreviousMI, isOverriden: true, isPerInstance: true, InstanceType.MeshRenderer);
if ((flags & Flags.UseBoundingSphereParameter) != 0)
{
builder.AddComponent<Vector4>(ParamNames.unity_WorldBoundingSphere, isOverriden: true, isPerInstance: true, InstanceType.MeshRenderer);
}
//@ Most of SpeedTree parameters could be packed in fp16. Do later.
for (int i = 0; i < (int)SpeedTreeWindParamIndex.MaxWindParamsCount; ++i)
builder.AddComponent<Vector4>(ParamNames.DOTS_ST_WindParams[i], isOverriden: true, isPerInstance: true, InstanceType.SpeedTree, InstanceComponentGroup.Wind);
for (int i = 0; i < (int)SpeedTreeWindParamIndex.MaxWindParamsCount; ++i)
builder.AddComponent<Vector4>(ParamNames.DOTS_ST_WindHistoryParams[i], isOverriden: true, isPerInstance: true, InstanceType.SpeedTree, InstanceComponentGroup.Wind);
return builder.Build(instanceNumInfo);
}
}
public struct ParamInfo
{
public int index;
public int gpuAddress;
public int uintOffset;
public bool valid => index != 0;
}
public ParamInfo lightmapScale;
public ParamInfo localToWorld;
public ParamInfo worldToLocal;
public ParamInfo matrixPreviousM;
public ParamInfo matrixPreviousMI;
public ParamInfo shCoefficients;
public ParamInfo boundingSphere;
public ParamInfo[] windParams;
public ParamInfo[] windHistoryParams;
public RenderersParameters(in GPUInstanceDataBuffer instanceDataBuffer)
{
ParamInfo GetParamInfo(in GPUInstanceDataBuffer instanceDataBuffer, int paramNameIdx, bool assertOnFail = true)
{
int gpuAddress = instanceDataBuffer.GetGpuAddress(paramNameIdx, assertOnFail);
int index = instanceDataBuffer.GetPropertyIndex(paramNameIdx, assertOnFail);
return new ParamInfo()
{
index = index,
gpuAddress = gpuAddress,
uintOffset = gpuAddress / s_uintSize
};
}
lightmapScale = GetParamInfo(instanceDataBuffer, ParamNames.unity_LightmapST);
localToWorld = GetParamInfo(instanceDataBuffer, ParamNames.unity_ObjectToWorld);
worldToLocal = GetParamInfo(instanceDataBuffer, ParamNames.unity_WorldToObject);
matrixPreviousM = GetParamInfo(instanceDataBuffer, ParamNames.unity_MatrixPreviousM);
matrixPreviousMI = GetParamInfo(instanceDataBuffer, ParamNames.unity_MatrixPreviousMI);
shCoefficients = GetParamInfo(instanceDataBuffer, ParamNames.unity_SHCoefficients);
boundingSphere = GetParamInfo(instanceDataBuffer, ParamNames.unity_WorldBoundingSphere, assertOnFail: false);
windParams = new ParamInfo[(int)SpeedTreeWindParamIndex.MaxWindParamsCount];
windHistoryParams = new ParamInfo[(int)SpeedTreeWindParamIndex.MaxWindParamsCount];
for (int i = 0; i < (int)SpeedTreeWindParamIndex.MaxWindParamsCount; ++i)
{
windParams[i] = GetParamInfo(instanceDataBuffer, ParamNames.DOTS_ST_WindParams[i]);
windHistoryParams[i] = GetParamInfo(instanceDataBuffer, ParamNames.DOTS_ST_WindHistoryParams[i]);
}
}
}
}