Compute shader "Fill With Red" example not working

I want to get started with compute shaders but I seem to be stuck on the very first step.

Here is my example code:

private void Update()
{
    if (Input.GetKeyDown(KeyCode.G))
    {
        m_outputRenderTexture = new RenderTexture(m_width, m_height, 0);
        m_outputRenderTexture.enableRandomWrite = true;

        int kernelIndex = m_computeShader.FindKernel("CSMain");
        m_computeShader.SetTexture(kernelIndex, "OutputTexture", m_outputRenderTexture);
        m_computeShader.Dispatch(kernelIndex, 1, 1, 1);
    }
}

and the referenced compute shader:

#pragma kernel CSMain

RWTexture2D<float4> OutputTexture;

[numthreads(1,1,1)]
void CSMain (uint3 id : SV_DispatchThreadID)
{
    OutputTexture[id.xy] = float4(1, 0, 0, 1);
}

So when I press “G” I should see “m_outputRenderTexture” become red, I think? Nothing seems to be happening, though. I’ve tried getting compute shaders to fill simple buffers successfully so I at least know they’re working.

You dispatch your compute shader with 1,1,1 thread groups. So you run your shader code only for a single pixel (0,0). You have to pass your image resolution here.

Though it’s actually common to define numthreads inside the shader with a higher values to increase performance. Since textures are usually a power of two and usually larger than 8x8 most use [numthreads(8,8,1)] and then dispatch the shader like this:

m_computeShader.Dispatch(kernelIndex, xResolution / 8, yResolution / 8, 1);

For more information see this MSDN page

Keep in mind that numthreads has some hardlimits how many threads you can define in a thread group