55 lines
1.4 KiB
HLSL
55 lines
1.4 KiB
HLSL
#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)
|
|
{
|
|
if (bufferId == INVALID_HANDLE)
|
|
{
|
|
return 0.0f.xx;
|
|
}
|
|
else
|
|
{
|
|
return uvBuffer[bufferId][vertexIdx];
|
|
}
|
|
}
|
|
|
|
float4 GetPosition(uint bufferId, uint vertexIdx)
|
|
{
|
|
return float4(vertexBuffer[bufferId][vertexIdx].xyz, 1.0f);
|
|
}
|
|
|
|
float4 GetColor(uint bufferId, uint vertexIdx)
|
|
{
|
|
return (bufferId != INVALID_HANDLE) ? colorBuffer[bufferId][vertexIdx] : float4(1.0f, 0.0f, 1.0f, 1.0f);
|
|
}
|
|
|
|
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.uvBufferHandle, stage_input.vertexIndex);
|
|
output.outColor = GetColor(pcb.colorHandle, 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;
|
|
}
|