TG9six 03a642d635 first push
first push
2025-09-06 17:17:39 +04:00

57 lines
1.3 KiB
Plaintext

#pragma kernel CSMain
#pragma kernel CSExtract
Texture2D<float4> Input;
Texture2D<float4> Output_Read;
RWTexture2D<float4> Output_Write;
AppendStructuredBuffer<uint> AppendDataBuffer : register (u0);
[numthreads(16, 16, 1)]
void CSMain(uint3 id : SV_DispatchThreadID)
{
uint r = 0;
uint g = Input[id.xy].g * 255.0;
uint b = Input[id.xy].b * 255.0;
float4 inRGBA = Input[id.xy];
if (r + g + b == 0)
{
return;
}
GroupMemoryBarrierWithGroupSync();
// We could store a 0.0 to 1.0 value in alpha to represent the number of pixels
// I got no idea how to do that in a thread safe way though
Output_Write[uint2(g, b)] = float4(inRGBA.rgb, 0);
}
[numthreads(16, 16, 1)]
void CSExtract(uint3 id : SV_DispatchThreadID)
{
#if SHADER_API_METAL
// Change doesn't become visible in Write. We have to use Read.
uint r = 0;
uint g = Output_Read[id.xy].g * 255;
uint b = Output_Read[id.xy].b * 255;
#else
// Change doesn't become visible in Read. We have to use Write.
uint r = 0;
uint g = Output_Write[id.xy].g * 255;
uint b = Output_Write[id.xy].b * 255;
#endif
GroupMemoryBarrierWithGroupSync();
if (r + g + b <= 0)
{
return;
}
AppendDataBuffer.Append((b * 256 * 256) + (g * 256) + r);
// Clear for next pass
Output_Write[uint2(id.x, id.y)] = float4(0, 0, 0, 0);
}