60 lines
1.7 KiB
Plaintext
60 lines
1.7 KiB
Plaintext
|
|
#include "Include/PlatformDefines.hlsl"
|
|
|
|
#pragma kernel CSInstancedCameraCalculationKernel
|
|
#pragma kernel CSInstancedCameraCalculationKernelCrossFade
|
|
|
|
RWStructuredBuffer<uint4> gpuiInstanceLODData; // lodNo - shadowLodNo - cfLodNo - cfLevel
|
|
#include "Include/Culling.hlsl"
|
|
#include "Include/Camera.hlsl"
|
|
|
|
[numthreads(GPUI_THREADS, 1, 1)]
|
|
void CSInstancedCameraCalculationKernel(uint3 id : SV_DispatchThreadID)
|
|
{
|
|
if (id.x >= bufferSize)
|
|
return;
|
|
|
|
float dist = 0;
|
|
bool culled = false;
|
|
float size = 0;
|
|
|
|
uint4 lodData = uint4(9, 9, 9, 0);
|
|
float4x4 instanceMatrix = gpuiInstanceData[id.x];
|
|
|
|
CalculateDistanceAndSize(instanceMatrix, dist, size);
|
|
IsCulled(instanceMatrix, dist, culled);
|
|
CalculateLODNo(size, dist, culled, lodData.x, lodData.y);
|
|
|
|
gpuiInstanceLODData[id.x] = lodData;
|
|
}
|
|
|
|
[numthreads(GPUI_THREADS, 1, 1)]
|
|
void CSInstancedCameraCalculationKernelCrossFade(uint3 id : SV_DispatchThreadID)
|
|
{
|
|
if (id.x >= bufferSize)
|
|
return;
|
|
|
|
float dist = 0;
|
|
bool culled = false;
|
|
float size = 0;
|
|
|
|
uint4 lodData = uint4(9, 9, 9, 0);
|
|
float4x4 instanceMatrix = gpuiInstanceData[id.x];
|
|
|
|
CalculateDistanceAndSize(instanceMatrix, dist, size);
|
|
IsCulled(instanceMatrix, dist, culled);
|
|
CalculateLODNo(size, dist, culled, lodData.x, lodData.y);
|
|
|
|
if (animateCrossFade)
|
|
{
|
|
uint4 previousLodData = gpuiInstanceLODData[id.x];
|
|
lodData.w = previousLodData.w;
|
|
lodData.z = previousLodData.z;
|
|
CalculateCFLODNoAnimate(previousLodData.x, lodData.x, lodData.z, lodData.w);
|
|
}
|
|
else
|
|
CalculateCFLODNo(size, lodData.x, lodData.z, lodData.w);
|
|
|
|
gpuiInstanceLODData[id.x] = lodData;
|
|
}
|