vulkan-playground/reconstruction.comp

40 lines
1.6 KiB
Text

#version 450
#extension GL_ARB_separate_shader_objects : enable
#define WORKGROUP_SIZE 32
layout (local_size_x = WORKGROUP_SIZE, local_size_y = WORKGROUP_SIZE, local_size_z = 1 ) in;
layout (binding = 0) uniform sampler2D ycbcrSampler;
// todo: should it be sampler?
layout (binding = 1, rgba8) uniform image2D inputImage;
layout (binding = 2, rgba8) writeonly uniform image2D resultImage;
layout (constant_id = 0) const float width = 1920;
layout (constant_id = 1) const float height = 1080;
const vec2 in_res = vec2(width,height);
vec4 convertYuv(float y, float u, float v)
{
return vec4(y + 1.403*v, y - 0.344*u - 0.714*v, y + 1.770*u,1);
}
void main()
{
vec2 uv =(vec2(gl_GlobalInvocationID.xy) + vec2(0.5,0.5))/in_res;
vec3 yuv = texture(ycbcrSampler,uv).xyz;
vec3 rec = vec3(imageLoad(inputImage, ivec2(gl_GlobalInvocationID.xy)).xyz);
float ca1 = yuv.y;
float cb1 = (rec.x - 0.533333)/2;
float cc1 = (rec.y - 0.533333)/2;
float cd1 = (rec.z - 0.533333)/4;
float ca = ca1 + cb1;
float cb = cc1 + cd1;
float cc = ca1 - cb1;
float cd = cc1 - cd1;
float y1 = ca + cb;
float y2 = ca - cb;
float y3 = cc + cd;
float y4 = cc - cd;
imageStore(resultImage, ivec2(gl_GlobalInvocationID.x * 2, gl_GlobalInvocationID.y * 2), convertYuv(y1, yuv.z, yuv.x));
imageStore(resultImage, ivec2(gl_GlobalInvocationID.x * 2 + 1, gl_GlobalInvocationID.y * 2), convertYuv(y2, yuv.z, yuv.x));
imageStore(resultImage, ivec2(gl_GlobalInvocationID.x * 2, gl_GlobalInvocationID.y * 2 + 1), convertYuv(y3, yuv.z, yuv.x));
imageStore(resultImage, ivec2(gl_GlobalInvocationID.x * 2 + 1 , gl_GlobalInvocationID.y * 2 + 1), convertYuv(y4, yuv.z, yuv.x));
}