48 lines
1.9 KiB
GLSL
48 lines
1.9 KiB
GLSL
#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((pixel.x - UITransformBuffer[bufferStart].data[i].x) * UITransformBuffer[bufferStart].data[i].bufferX / UITransformBuffer[bufferStart].data[i].sizeX);
|
|
int16_t srcY = int16_t((pixel.y - UITransformBuffer[bufferStart].data[i].y) * UITransformBuffer[bufferStart].data[i].bufferY / UITransformBuffer[bufferStart].data[i].sizeY);
|
|
hitValue = vec4(UIPixelBuffer[bufferStart + UITransformBuffer[bufferStart].count].pixels[srcY * UITransformBuffer[bufferStart].data[i].bufferX + srcX]);
|
|
}
|
|
}
|
|
|
|
imageStore(image[0], ivec2(pixel), hitValue);
|
|
}
|