Skip to content

Commit b0bafc4

Browse files
committed
Vulkan PQ and HLG Shaders
1 parent 849e572 commit b0bafc4

File tree

4 files changed

+156
-0
lines changed

4 files changed

+156
-0
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#version 450
2+
#pragma shader_stage(compute)
3+
4+
layout (local_size_x_id = 0, local_size_y_id = 1) in;
5+
6+
layout (binding = 0) uniform sampler2D inputImage;
7+
layout (binding = 1) uniform writeonly image2D outputImage;
8+
9+
void main() {
10+
vec2 coord = vec2(gl_GlobalInvocationID.x, gl_GlobalInvocationID.y);
11+
vec4 pixel = texture(inputImage, coord);
12+
vec4 color = vec4(pixel.rgb, 0.0f);
13+
14+
float a = 0.17883277f;
15+
float b = 0.28466892f;
16+
float c = 0.55991073f;
17+
18+
color.r = (color.r <= 0.5f) ? (color.r * color.r / 3.0f) : ((exp((color.r - c) / a) + b) / 12.f);
19+
color.g = (color.g <= 0.5f) ? (color.g * color.g / 3.0f) : ((exp((color.g - c) / a) + b) / 12.f);
20+
color.b = (color.b <= 0.5f) ? (color.b * color.b / 3.0f) : ((exp((color.b - c) / a) + b) / 12.f);
21+
22+
float betaRec2020 = 0.018053968510807f;
23+
float alphaRec2020 = 1.09929682680944f;
24+
25+
if (color.r < 1) {
26+
color.r = (0 <= betaRec2020 && color.r < betaRec2020) ? (4.5f * color.r) : (alphaRec2020 * pow(float(color.r), 0.45f) - (alphaRec2020 - 1));
27+
}
28+
29+
if (color.g < 1) {
30+
color.g = (0 <= betaRec2020 && color.g < betaRec2020) ? (4.5f * color.g) : (alphaRec2020 * pow(float(color.g), 0.45f) - (alphaRec2020 - 1));
31+
}
32+
33+
if (color.b < 1) {
34+
color.b = (0 <= betaRec2020 && color.b < betaRec2020) ? (4.5f * color.b) : (alphaRec2020 * pow(float(color.b), 0.45f) - (alphaRec2020 - 1));
35+
}
36+
37+
color.a = 0;
38+
39+
pixel = vec4(color.rgb, pixel.a);
40+
41+
imageStore(outputImage, ivec2(gl_GlobalInvocationID.xy), pixel);
42+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#version 450
2+
#pragma shader_stage(compute)
3+
4+
layout (local_size_x_id = 0, local_size_y_id = 1) in;
5+
6+
layout (binding = 0) uniform sampler2D inputImage;
7+
layout (binding = 1) uniform writeonly image2D outputImage;
8+
9+
void main() {
10+
vec2 coord = vec2(gl_GlobalInvocationID.x, gl_GlobalInvocationID.y);
11+
vec4 pixel = texture(inputImage, coord);
12+
vec4 color = vec4(pixel.rgb, 0.0f);
13+
14+
float a = 0.17883277f;
15+
float b = 0.28466892f;
16+
float c = 0.55991073f;
17+
18+
color.r = (color.r <= 0.5f) ? (color.r * color.r / 3.0f) : ((exp((color.r - c) / a) + b) / 12.f);
19+
color.g = (color.g <= 0.5f) ? (color.g * color.g / 3.0f) : ((exp((color.g - c) / a) + b) / 12.f);
20+
color.b = (color.b <= 0.5f) ? (color.b * color.b / 3.0f) : ((exp((color.b - c) / a) + b) / 12.f);
21+
22+
float betaRec2020 = 0.018053968510807f;
23+
float alphaRec2020 = 1.09929682680944f;
24+
25+
if (color.r < 1) {
26+
color.r = (0 <= betaRec2020 && color.r < betaRec2020) ? (4.5f * color.r) : (alphaRec2020 * pow(float(color.r), 0.45f) - (alphaRec2020 - 1));
27+
}
28+
29+
if (color.g < 1) {
30+
color.g = (0 <= betaRec2020 && color.g < betaRec2020) ? (4.5f * color.g) : (alphaRec2020 * pow(float(color.g), 0.45f) - (alphaRec2020 - 1));
31+
}
32+
33+
if (color.b < 1) {
34+
color.b = (0 <= betaRec2020 && color.b < betaRec2020) ? (4.5f * color.b) : (alphaRec2020 * pow(float(color.b), 0.45f) - (alphaRec2020 - 1));
35+
}
36+
37+
color.a = 0;
38+
39+
pixel = vec4(color.rgb, pixel.a);
40+
41+
imageStore(outputImage, ivec2(gl_GlobalInvocationID.xy), pixel);
42+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#version 450
2+
#pragma shader_stage(compute)
3+
4+
layout (local_size_x_id = 0, local_size_y_id = 1) in;
5+
6+
layout (binding = 0) uniform sampler2D inputImage;
7+
layout (binding = 1) uniform writeonly image2D outputImage;
8+
9+
void main() {
10+
vec2 coord = vec2(gl_GlobalInvocationID.x, gl_GlobalInvocationID.y);
11+
vec4 pixel = texture(inputImage, coord);
12+
vec4 color = vec4(pixel.rgb, 0.0f);
13+
vec4 lumaVec = vec4(0.2627f, 0.6780f, 0.0593f, 0.0f);
14+
vec4 linearColor = min(2.3f * pow(color, vec4(2.8f)), color / 5.0f + 0.8f);
15+
float luma = dot(linearColor, lumaVec);
16+
17+
float m1 = (2610.0 / 4096.0) / 4.0;
18+
float m2 = (2523.0 / 4096.0) * 128.0;
19+
float c1 = 3424.0 / 4096.0;
20+
float c2 = (2413.0 / 4096.0) * 32.0;
21+
float c3 = (2392.0 / 4096.0) * 32.0;
22+
vec4 p = pow(max(color, vec4(0.0)), vec4(1.0 / m2));
23+
vec4 denom = pow(max(p - c1, 0.0) / (c2 - c3 * p), vec4(1.0 / m1));
24+
color = vec4(vec3(denom * 10000.0 / 80), 1.0);
25+
color *= luma / dot(color, lumaVec);
26+
27+
float betaRec2020 = 0.018053968510807f;
28+
float alphaRec2020 = 1.09929682680944f;
29+
30+
pixel = vec4(pow(vec3(pixel.rgb), vec3(1/2.6f)), pixel.a);
31+
color.a = 0;
32+
33+
pixel = vec4(color.rgb, pixel.a);
34+
35+
imageStore(outputImage, ivec2(gl_GlobalInvocationID.xy), pixel);
36+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#version 450
2+
#pragma shader_stage(compute)
3+
4+
layout (local_size_x_id = 0, local_size_y_id = 1) in;
5+
6+
layout (binding = 0) uniform sampler2D inputImage;
7+
layout (binding = 1) uniform writeonly image2D outputImage;
8+
9+
void main() {
10+
vec2 coord = vec2(gl_GlobalInvocationID.x, gl_GlobalInvocationID.y);
11+
vec4 pixel = texture(inputImage, coord);
12+
13+
vec4 color = vec4(pixel.rgb, 0.0f);
14+
15+
vec4 lumaVec = vec4(0.2627f, 0.6780f, 0.0593f, 0.0f);
16+
17+
vec4 linearColor = min(2.3f * pow(color, vec4(2.8f)), color / 5.0f + 0.8f);
18+
19+
float luma = dot(linearColor, lumaVec);
20+
21+
float m1 = (2610.0 / 4096.0) / 4.0;
22+
float m2 = (2523.0 / 4096.0) * 128.0;
23+
float c1 = 3424.0 / 4096.0;
24+
float c2 = (2413.0 / 4096.0) * 32.0;
25+
float c3 = (2392.0 / 4096.0) * 32.0;
26+
vec4 p = pow(max(color, vec4(0.0)), vec4(1.0 / m2));
27+
vec4 denom = pow(max(p - c1, 0.0) / (c2 - c3 * p), vec4(1.0 / m1));
28+
color = vec4(vec3(denom * 10000.0 / 80), 1.0);
29+
color *= luma / dot(color, lumaVec);
30+
31+
float betaRec2020 = 0.018053968510807f;
32+
float alphaRec2020 = 1.09929682680944f;
33+
34+
pixel = vec4(pow(vec3(pixel.rgb), vec3(1/2.6f)), pixel.a);
35+
imageStore(outputImage, ivec2(gl_GlobalInvocationID.xy), pixel);
36+
}

0 commit comments

Comments
 (0)