- Home /
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.
Answer by Bunny83 · Jan 09, 2018 at 11:12 AM
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
Your answer
Follow this Question
Related Questions
Reading and Writing to the same texture 0 Answers
How can I get the correct color value of a Texture2D in a compute shader?, 1 Answer
perform action on shader compilation/update 0 Answers
Add transparency to sprite shader with cast shadows and receive shadows and lighting 2 Answers
Issue with scaling shader and non-zero local position 0 Answers