diff --git a/src/libcamera/shaders/bayer_1x_packed.frag b/src/libcamera/shaders/bayer_1x_packed.frag
index 7036fe278..77d9fbfa7 100644
--- a/src/libcamera/shaders/bayer_1x_packed.frag
+++ b/src/libcamera/shaders/bayer_1x_packed.frag
@@ -67,6 +67,7 @@ uniform vec2 tex_bayer_first_red;
 uniform sampler2D tex_y;
 uniform mat3 ccm;
 uniform vec3 blacklevel;
+uniform float gamma;
 
 void main(void)
 {
@@ -260,6 +261,9 @@ void main(void)
 	rgb.g = (rin * ccm[1][0]) + (gin * ccm[1][1]) + (bin * ccm[1][2]);
 	rgb.b = (rin * ccm[2][0]) + (gin * ccm[2][1]) + (bin * ccm[2][2]);
 
+	/* Apply gamma after colour correction */
+	rgb = pow(rgb, vec3(gamma));
+
 #if defined (SWAP_BLUE)
 	gl_FragColor = vec4(rgb.bgr, 1.0);
 #else
diff --git a/src/libcamera/shaders/bayer_unpacked.frag b/src/libcamera/shaders/bayer_unpacked.frag
index f0d8cd1e2..aba11a87f 100644
--- a/src/libcamera/shaders/bayer_unpacked.frag
+++ b/src/libcamera/shaders/bayer_unpacked.frag
@@ -26,6 +26,7 @@ varying vec4            yCoord;
 varying vec4            xCoord;
 uniform mat3            ccm;
 uniform vec3            blacklevel;
+uniform float           gamma;
 
 void main(void) {
     vec3 rgb;
@@ -155,6 +156,9 @@ void main(void) {
     rgb.g = (rin * ccm[1][0]) + (gin * ccm[1][1]) + (bin * ccm[1][2]);
     rgb.b = (rin * ccm[2][0]) + (gin * ccm[2][1]) + (bin * ccm[2][2]);
 
+    /* Apply gamma after colour correction */
+    rgb = pow(rgb, vec3(gamma));
+
 #if defined (SWAP_BLUE)
     gl_FragColor = vec4(rgb.bgr, 1.0);
 #else
