#version 440 core layout(std430) buffer; #ifdef INT layout(set=0, binding=0) uniform isampler2D uInput; layout(set=0, binding=1) writeonly buffer destBuffer{ int data[]; } uOutBuffer; #else layout(set=0, binding=0) uniform sampler2D uInput; layout(set=0, binding=1) writeonly buffer destBuffer{ float data[]; } uOutBuffer; #endif layout(set=0, binding=2) readonly uniform constBuffer{ ivec4 size; // w, h, c, n ivec4 stride; } uConstant; layout(set=0, binding=3) readonly uniform offsetBuffer { ivec4 offset; // Offset x, y, 0, 0 ivec4 size;//w, h, 0, w*h } uOffset; layout (local_size_x = 256, local_size_y = 1, local_size_z = 1) in; void main() { int posX = ivec3(gl_GlobalInvocationID).x; if (posX < uOffset.size.w) { ivec2 pos; pos.x = posX % uOffset.size.x; pos.y = posX / uOffset.size.x; #ifdef INT ivec4 color = texelFetch(uInput, pos, 0); #else vec4 color = texelFetch(uInput, pos, 0); #endif pos = pos + uOffset.offset.xy; int n = pos.y / uConstant.size.y; int h = pos.y % uConstant.size.y; int c = pos.x / uConstant.size.x; int w = pos.x % uConstant.size.x; int basicOffset = 0 + n * uConstant.stride.w + 4 * c * uConstant.stride.z + h * uConstant.stride.y + w * uConstant.stride.x; uOutBuffer.data[basicOffset+0] = color.r; if (4 * c + 1 < uConstant.size.z) { uOutBuffer.data[basicOffset + 1 * uConstant.stride.z] = color.g; } if (4 * c + 2 < uConstant.size.z) { uOutBuffer.data[basicOffset + 2 * uConstant.stride.z] = color.b; } if (4 * c + 3 < uConstant.size.z) { uOutBuffer.data[basicOffset + 3 * uConstant.stride.z] = color.a; } } }