#include "bindless_structs.hlsli" struct VS_Input { uint vertexIndex : SV_VertexID; }; struct VS_Output { float4 outPosition : POSITION; float4 outColor : COLOR0; float2 outUV : TEXCOORD0; float4 position : SV_Position; }; float2 GetUV(uint bufferId, uint vertexIdx) { return (bufferId == INVALID_HANDLE) ? 0.0f.xx : vertexDataBuffer[bufferId][vertexIdx].m_TexCoord0.xy; } float4 GetPosition(uint bufferId, uint vertexIdx) { return float4(vertexBuffer[bufferId][vertexIdx].xyz, 1.0f); } float4 GetColor(uint bufferId, uint vertexIdx) { return (bufferId == INVALID_HANDLE) ? float4(1.0f, 0.0f, 1.0f, 1.0f) : vertexDataBuffer[bufferId][vertexIdx].m_Color0; } float4x4 GetModel(uint bufferId, uint index) { return nodeBuffer[bufferId][index].transform; } VS_Output main(VS_Input stage_input) { VS_Output output; output.outPosition = GetPosition(pcb.vertexBufferHandle, stage_input.vertexIndex); output.outUV = GetUV(pcb.vertexDataHandle, stage_input.vertexIndex); output.outColor = GetColor(pcb.vertexDataHandle, stage_input.vertexIndex); float4 globalPosition = mul(camera.model, mul(GetModel(pcb.nodeBufferHandle, pcb.m_NodeIdx), GetPosition(pcb.vertexBufferHandle, stage_input.vertexIndex))); float4 clipSpace = mul(camera.view, globalPosition); output.position = mul(camera.proj, clipSpace); return output; }