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.
This commit is contained in:
Manuel Stoeckl 2022-11-19 21:47:27 -05:00 committed by Simon Ser
parent 8cdc4b7a31
commit 10dd416694
5 changed files with 651 additions and 90 deletions

View file

@ -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
);
}