C'est quoi le problème ?
#pragma kernel Initialize
#pragma kernel DrawCirclesPart
#pragma kernel VolcanoCircle
#pragma kernel RoverHeatingModule
#pragma kernel Average

struct GaussianCircle
{
    int centerX;
    int centerY;
    int istart;
    int iend;
    int range;
    float temperature;
};

struct ResetTextureBuffer
{
    int start;
    int end;
};

RWStructuredBuffer<GaussianCircle> circleBuffer;
RWStructuredBuffer<ResetTextureBuffer> resetBuffer;
RWStructuredBuffer<GaussianCircle> volcanoBuffer;
RWStructuredBuffer<GaussianCircle> roverHeatBuffer;
RWStructuredBuffer<float> averageResultBuffer;

RWTexture2D<float> Texture;
float globalTemperature;


[numthreads(512, 1, 1)]
void Initialize(uint id : SV_GroupIndex)
{
    ResetTextureBuffer c = resetBuffer[id];
    
    for (int i = c.start; i < c.end; i++)
    {
        for (int j = 0; j < 1024; j++)
        {
            Texture[int2(i, j)] = globalTemperature;
        }
    }
}

[numthreads(1024, 1, 1)]
void DrawCirclesPart(uint id : SV_DispatchThreadID)
{
    GaussianCircle c = circleBuffer[id];
    
    for (int i = c.istart; i < c.iend; i++)
    {
        for (int j = c.centerY - c.range; j < c.centerY + c.range + 1; j++)
        {
            if (i > 0 && j > 0 && i < 1023 && j < 1023)
            {
                float distance = sqrt(pow(c.centerX - i, 2) + pow(c.centerY - j, 2));
                if (distance < c.range)
                {
                    float echauffement = (c.temperature * (c.range - distance) / c.range);
                    float currentTemp = Texture.Load(int2(i, j));
                   
                    if (currentTemp + echauffement > c.temperature)
                        Texture[int2(i, j)] = max(c.temperature, currentTemp);
                    else
                        Texture[int2(i, j)] = currentTemp + echauffement;
                }
            }
        }
    }
}

[numthreads(512, 1, 1)]
void VolcanoCircle(uint id : SV_DispatchThreadID)
{
    GaussianCircle c = volcanoBuffer[id];
    
    for (int i = c.istart; i < c.iend; i++)
    {
        for (int j = 0; j < 1024; j++)
        {
            float distance = sqrt(pow(c.centerX - i, 2) + pow(c.centerY - j, 2));
            float echauffement = c.temperature * (c.range - distance) / c.range;
            float currentTemp = Texture.Load(int2(i, j));

            Texture[int2(i, j)] = currentTemp + echauffement;
        }
    }
}

[numthreads(1024, 1, 1)]
void RoverHeatingModule(uint id : SV_DispatchThreadID)
{
    GaussianCircle c = roverHeatBuffer[id];
    
    for (int i = c.istart; i < c.iend; i++)
    {
        for (int j = c.centerY - c.range; j < c.centerY + c.range + 1; j++)
        {
            if (i > 0 && j > 0 && i < 1023 && j < 1023)
            {
                float distance = sqrt(pow(c.centerX - i, 2) + pow(c.centerY - j, 2));
                if (distance < c.range)
                {
                    Texture[int2(i, j)] = Texture.Load(int2(i, j)) + c.temperature;
                }
            }
        }
    }
}

[numthreads(1024, 1, 1)]
void Average(uint3 id : SV_DispatchThreadID)
{
    uint width, height;
    Texture.GetDimensions(width, height);
    uint index = id.x;
    float sum = 0;

    if (index < width)
    {
        for (uint y = 0; y < height; y++)
        {
            float4 pixel = Texture.Load(int3(index, y, 0));
            sum += pixel.r; 
        }

        averageResultBuffer[index] = sum / height;
    }
}