struct VertexShaderInput { // Per Vertex float4 pos : VERTEX_POSITION; float2 uv : UV_VERTEX; uint vid : SV_VertexID; // Per Instance float4 pos_size : INSTANCE_POSITION_SIZE; uint tile_type : TILE_TYPE; float4 uv0uv1 : UV_INSTANCE; }; [[vk::binding(0, 1)]] cbuffer constants { float aspect_ratio; }; struct VertexShaderOutput { float4 pos : SV_POSITION; float4 uv0uv1 : COORDINATES; uint tile_type : TILE_TYPE; }; [shader("vertex")] VertexShaderOutput main(VertexShaderInput input) { VertexShaderOutput output; float3x3 coord_sys = { 2, 0, -1, 0, -2, 1, 0, 0, 1 }; input.pos_size.xy = mul(coord_sys, float3(input.pos_size.xy, 1)).xy; float3x3 pos = { 1, 0, input.pos_size.x, 0, 1, input.pos_size.y, 0, 0, 1 }; float3x3 size = { input.pos_size.z, 0, 0, 0, input.pos_size.w, 0, 0, 0, 1 }; output.pos.xy = mul(pos, mul(size, input.pos.xyz)).xy; float correction_factor = aspect_ratio / (16.0 / 9.0); if(correction_factor < 1) output.pos.y *= correction_factor; else output.pos.x /= correction_factor; output.pos.zw = float2(0, 1); output.uv0uv1.zw = float2(0, 0); output.uv0uv1.xy = lerp(input.uv0uv1.xy, input.uv0uv1.zw, input.uv.xy); output.tile_type = input.tile_type; return output; }