Files
ZHGD_Web/Assets/Art/Art Plugins/GPUInstancer/Resources/Compute/CSInstancedBufferToTexture.compute
2025-07-13 23:16:20 +08:00

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];
}