aboutsummaryrefslogtreecommitdiff
path: root/render/vulkan/shaders/output.frag
diff options
context:
space:
mode:
authorManuel Stoeckl <code@mstoeckl.com>2022-11-19 21:47:27 -0500
committerSimon Ser <contact@emersion.fr>2023-05-12 15:09:02 +0000
commit10dd41669492f7582c26bd3989536a66278df75d (patch)
treed8daa7c184d11481e5f8d4bbbe28581f62805f7a /render/vulkan/shaders/output.frag
parent8cdc4b7a31d8a3eba4e2ae7cf32bdc808e46538d (diff)
render/vulkan: allow rendering to non-8-bit buffers
This is implemented by a two-subpass rendering scheme; the first subpass draws (and blends) onto a linear R16G16B16A16_SFLOAT buffer, while the second subpass performs linear->srgb conversion, writing onto the actual output buffer.
Diffstat (limited to 'render/vulkan/shaders/output.frag')
-rw-r--r--render/vulkan/shaders/output.frag21
1 files changed, 21 insertions, 0 deletions
diff --git a/render/vulkan/shaders/output.frag b/render/vulkan/shaders/output.frag
new file mode 100644
index 00000000..28a8cdc5
--- /dev/null
+++ b/render/vulkan/shaders/output.frag
@@ -0,0 +1,21 @@
+#version 450
+
+layout (input_attachment_index = 0, binding = 0) uniform subpassInput in_color;
+
+layout(location = 0) in vec2 uv;
+layout(location = 0) out vec4 out_color;
+
+float linear_to_srgb(float x) {
+ return max(min(x * 12.92, 0.04045), 1.055 * pow(x, 1. / 2.4) - 0.055);
+}
+
+void main() {
+ vec4 val = subpassLoad(in_color).rgba;
+ out_color = vec4(
+ linear_to_srgb(val.r),
+ linear_to_srgb(val.g),
+ linear_to_srgb(val.b),
+ val.a
+ );
+}
+