#include "Include/PlatformDefines.hlsl" #pragma kernel CSInstancedBufferToTextureKernel #pragma kernel CSBufferToTextureCrossFadeKernel RWStructuredBuffer gpuiInstanceData; ConsumeStructuredBuffer gpuiTransformationMatrix; RWTexture2D gpuiTransformationMatrixTexture; RWStructuredBuffer argsBuffer; uniform uint argsBufferIndex; uniform uint maxTextureSize; RWStructuredBuffer gpuiInstanceLODData; // lodNo - shadowLodNo - cfLodNo - cfLevel RWTexture2D 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]; }