struct Output { float4 Color : TEXCOORD0; float2 UV : TEXCOORD1; float4 Position : SV_Position; }; #include "RootConstants.hlsl" struct Vertex { float2 Pos; float2 UV; uint Color; }; Output main(uint vertexIndex : SV_VertexID) { Output output; // Retrieve the vertex buffer using SM6.6 bindless syntax ByteAddressBuffer buffer = ResourceDescriptorHeap[BufferIndex]; // Add VertexOffset for indexed drawing with bindless buffers // (SV_VertexID in indexed draw is raw index from index buffer, doesn't include BaseVertexLocation) uint actualVertexIndex = vertexIndex + VertexOffset; // ImDrawVert stride = 20 bytes (Vec2 pos + Vec2 uv + uint color) uint stride = 20; uint offset = actualVertexIndex * stride; float2 pos = asfloat(buffer.Load2(offset)); float2 uv = asfloat(buffer.Load2(offset + 8)); uint col = buffer.Load(offset + 16); // Unpack color (uint to float4) // ImGui colors are 0xAABBGGRR (ABGR packed) // We need to unpack to float4. // HLSL unpacks as little endian. // uint 0xAABBGGRR -> byte0=RR, byte1=GG, byte2=BB, byte3=AA float4 c; c.x = float(col & 0xFF) / 255.0f; c.y = float((col >> 8) & 0xFF) / 255.0f; c.z = float((col >> 16) & 0xFF) / 255.0f; c.w = float((col >> 24) & 0xFF) / 255.0f; // Transform // ImGui sends pixel coordinates. // We need to transform to NDC [-1, 1]. // PushConstants should contain Scale and Translate. // float2 Scale = 2.0 / DisplaySize // float2 Translate = -1.0 - (DisplayPos * Scale) // We will assume PushConstants are float2 Scale, float2 Translate. // Struct in RootConstants.hlsl? // RootConstants.hlsl likely defines `cbuffer PushConstants : register(b0)`. // Let's assume standard push constants usage. // Debug.vert.hlsl used `ViewProjection`. // We need to customize PushConstants or reuse `ViewProjection` slot? // Juliet uses 128 bytes of push constants. // We can map float4 ProjectionMatrix (or similar). // Use Scale and Translate from RootConstants output.Position = float4(pos * Scale + Translate, 0.0f, 1.0f); output.Color = c; output.UV = uv; return output; }