diff --git a/src/libcamera/shaders/bayer_1x_packed.frag b/src/libcamera/shaders/bayer_1x_packed.frag
index 6bca07b6e..069b880ff 100644
--- a/src/libcamera/shaders/bayer_1x_packed.frag
+++ b/src/libcamera/shaders/bayer_1x_packed.frag
@@ -70,6 +70,7 @@ uniform sampler2D green_param;
 uniform sampler2D blue_param;
 uniform mat3 ccm;
 uniform vec3 blacklevel;
+uniform float gamma;
 
 void main(void)
 {
@@ -265,6 +266,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));
+
 #elif defined(APPLY_RGB_PARAMETERS)
 	/* Apply bayer params */
 	rgb.r = texture2D(red_param, vec2(rgb.r, 0.5)).r;
diff --git a/src/libcamera/shaders/bayer_unpacked.frag b/src/libcamera/shaders/bayer_unpacked.frag
index 66cece56b..86bf2c31c 100644
--- a/src/libcamera/shaders/bayer_unpacked.frag
+++ b/src/libcamera/shaders/bayer_unpacked.frag
@@ -29,6 +29,7 @@ varying vec4            yCoord;
 varying vec4            xCoord;
 uniform mat3            ccm;
 uniform vec3            blacklevel;
+uniform float           gamma;
 
 void main(void) {
     vec3 rgb;
@@ -160,6 +161,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));
+
 #elif defined(APPLY_RGB_PARAMETERS)
         /* Apply bayer params */
         rgb.r = texture2D(red_param, vec2(rgb.r, 0.5)).r;
