#version 460 #extension GL_EXT_ray_tracing : enable #extension GL_EXT_shader_image_load_formatted : enable #extension GL_EXT_shader_explicit_arithmetic_types_int16 : enable #extension GL_EXT_descriptor_heap : enable #extension GL_EXT_nonuniform_qualifier : enable #extension GL_EXT_shader_explicit_arithmetic_types_float16 : enable struct UIScaledData{ int16_t x; int16_t y; int16_t sizeX; int16_t sizeY; uint16_t bufferX; uint16_t bufferY; }; layout(std430, descriptor_heap) buffer UIScaledDataBuffer { uint16_t count; uint16_t pad[5]; UIScaledData data[]; } UITransformBuffer[]; layout(std430, descriptor_heap) buffer UIPixelBufferr { f16vec4 pixels[]; } UIPixelBuffer[]; layout(constant_id = 0) const uint16_t bufferStart = 0us; layout(descriptor_heap) uniform writeonly image2D image[]; void main() { uvec2 pixel = gl_LaunchIDEXT.xy; uvec2 resolution = gl_LaunchSizeEXT.xy; vec4 hitValue = vec4(0); for (uint16_t i = 1us; i < UITransformBuffer[bufferStart].count+1; i++) { if(pixel.x > UITransformBuffer[bufferStart].data[i].x && pixel.x < UITransformBuffer[bufferStart].data[i].x + UITransformBuffer[bufferStart].data[i].sizeX && pixel.y > UITransformBuffer[bufferStart].data[i].y && pixel.y < UITransformBuffer[bufferStart].data[i].y + UITransformBuffer[bufferStart].data[i].sizeY) { int16_t srcX = int16_t(float(pixel.x - UITransformBuffer[bufferStart].data[i].x) * float(UITransformBuffer[bufferStart].data[i].bufferX) / float(UITransformBuffer[bufferStart].data[i].sizeX)); int16_t srcY = int16_t(float(pixel.y - UITransformBuffer[bufferStart].data[i].y) * float(UITransformBuffer[bufferStart].data[i].bufferY) / float(UITransformBuffer[bufferStart].data[i].sizeY)); hitValue = vec4(UIPixelBuffer[bufferStart + 1].pixels[srcY * UITransformBuffer[bufferStart].data[i].bufferX + srcX]); } } imageStore(image[0], ivec2(pixel), hitValue); }