// Evaluates the shader flow functions for a buffer of positions and gradients, so that // Aetheria.EditorTools.FlowFieldParityVerify can compare them with FlowField (ServerShared). Reads the same global // _Flow* uniforms the nebula and stardust read, set by VolumeSampling.LowerFlow. #pragma kernel Evaluate // A compute shader declares the global keywords itself (as Stardust.compute does); the flow() it calls is keyword-gated. #pragma multi_compile __ FLOW_GLOBAL #pragma multi_compile __ FLOW_SLOPE #include "Assets/Shaders/Volumetric.cginc" StructuredBuffer positions; StructuredBuffer gradients; RWStructuredBuffer globalOut; RWStructuredBuffer slopeOut; RWStructuredBuffer gatedOut; // flow(): the keyword-gated function the nebula and stardust call RWStructuredBuffer noiseOut; // triNoise3d: the nebula noise the flow advects uint count; [numthreads(64, 1, 1)] void Evaluate(uint3 id : SV_DispatchThreadID) { if (id.x >= count) return; globalOut[id.x] = globalFlow(positions[id.x]); slopeOut[id.x] = slopeFlow(gradients[id.x]); gatedOut[id.x] = flow(positions[id.x]); noiseOut[id.x] = triNoise3d(positions[id.x] / 512); }