Implementing an edge detection filter with the compute shader
In the Applying an edge detection filter recipe in Chapter 6, Image Processing and Screen Space Techniques, we saw an example of how to implement edge detection using the fragment shader. The fragment shader is well-suited for many image-processing operations, because we can trigger the execution of the fragment shader for each pixel by rendering a screen-filling quad. Since image processing filters are often applied to the result of a render, we can render to a texture, then invoke the fragment shader for each screen pixel (by rendering a quad), and each fragment shader invocation is then responsible for processing a single pixel. Each invocation might need to read from several locations in the (rendered) image texture, and a texel might be read multiple times from different invocations.
This works well for many situations, but the fragment shader was not designed for image processing. With the compute shader, we can have more...