42 lines
1.6 KiB
Plaintext
42 lines
1.6 KiB
Plaintext
|
|
#include "Include/PlatformDefines.hlsl"
|
|
|
|
#pragma kernel CSInstancedBufferToTextureKernel
|
|
#pragma kernel CSBufferToTextureCrossFadeKernel
|
|
|
|
RWStructuredBuffer<float4x4> gpuiInstanceData;
|
|
ConsumeStructuredBuffer<uint> gpuiTransformationMatrix;
|
|
RWTexture2D<float4> gpuiTransformationMatrixTexture;
|
|
RWStructuredBuffer<uint> argsBuffer;
|
|
uniform uint argsBufferIndex;
|
|
uniform uint maxTextureSize;
|
|
|
|
RWStructuredBuffer<uint4> gpuiInstanceLODData; // lodNo - shadowLodNo - cfLodNo - cfLevel
|
|
RWTexture2D<float4> gpuiInstanceLODDataTexture;
|
|
uniform uint bufferSize;
|
|
|
|
[numthreads(GPUI_THREADS, 1, 1)]
|
|
void CSInstancedBufferToTextureKernel(uint3 id : SV_DispatchThreadID)
|
|
{
|
|
if (id.x >= argsBuffer[argsBufferIndex])
|
|
return;
|
|
uint indexX = id.x % maxTextureSize;
|
|
uint indexY = floor(id.x / float(maxTextureSize));
|
|
|
|
uint instanceId = gpuiTransformationMatrix.Consume();
|
|
|
|
float4x4 transformData = gpuiInstanceData[instanceId];
|
|
gpuiTransformationMatrixTexture[uint2(indexX, 0 + indexY * 4)] = transformData._11_12_13_14; // row0
|
|
gpuiTransformationMatrixTexture[uint2(indexX, 1 + indexY * 4)] = transformData._21_22_23_24; // row1
|
|
gpuiTransformationMatrixTexture[uint2(indexX, 2 + indexY * 4)] = transformData._31_32_33_34; // row2
|
|
gpuiTransformationMatrixTexture[uint2(indexX, 3 + indexY * 4)] = float4(transformData._41_42_43, instanceId); // row3
|
|
}
|
|
|
|
[numthreads(GPUI_THREADS, 1, 1)]
|
|
void CSBufferToTextureCrossFadeKernel(uint3 id : SV_DispatchThreadID)
|
|
{
|
|
if (id.x >= bufferSize)
|
|
return;
|
|
|
|
gpuiInstanceLODDataTexture[uint2(id.x % maxTextureSize, floor(id.x / float(maxTextureSize)))] = gpuiInstanceLODData[id.x];
|
|
} |