import "includes/structs"; struct Varyings { float4 positionCS : SV_Position; nointerpolation uint instance; float2 texCoord; } struct GuiImage { float4 tint; float2 positionSSPX; float2 sizePX; float2 uvMin; float2 uvMax; uint16_t texture; } [[vk::binding(0, 0)]] ConstantBuffer _Global; [[vk::binding(1, 0)]] StructuredBuffer _Images; [[vk::binding(2, 0)]] SamplerState _Sampler; [[vk::binding(3, 0)]] Texture2D _Textures[]; static const float2 VERTICES[4] = { float2(0, 1), float2(1, 1), float2(0, 0), float2(1, 0), }; [shader("vertex")] Varyings vertexMain(uint vertexID : SV_VulkanVertexID, uint instanceID : SV_VulkanInstanceID) { Varyings out; let vertex = VERTICES[vertexID]; let image = _Images[instanceID]; let positionSSPX = vertex * image.sizePX + image.positionSSPX; let positionCS = float4(mul(_Global.matrixSSPXtoCS, float3(positionSSPX, 1.0)), 0.0, 1.0); let texCoord = vertex * (image.uvMax - image.uvMin) + image.uvMin; out.positionCS = positionCS; out.instance = instanceID; out.texCoord = texCoord; return out; } [shader("fragment")] float4 fragmentMain(Varyings frag) : SV_Target { let image = _Images[frag.instance]; let texel = _Textures[image.texture].Sample(_Sampler, frag.texCoord); return texel * image.tint; }