40 lines
1.6 KiB
Text
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));
|
|
}
|