#include "VertexConstants.h" struct VS_INPUT { // Per vertex data float3 vPos : POSITION; float3 vNorm : NORMAL; float2 vTex : TEXCOORD0; float4 vCol : COLOR; // Per instance data matrix iModel : INSTANCE_TRANSFORM; // model matrix matrix iModelInvTrans : INSTANCE_INV_TRANSFORM; // (model matrix^-1)^T float4 iCol : INSTANCE_COLOR; // color of the model }; struct VS_OUTPUT { float4 Position : SV_POSITION; float3 Normal : TEXCOORD0; float3 WorldPos : TEXCOORD1; float2 Tex : TEXCOORD2; float4 PositionL : TEXCOORD3; float4 Color : COLOR0; }; VS_OUTPUT main(VS_INPUT input) { VS_OUTPUT output; // Get world position float4 pos = float4(input.vPos, 1.0f); float4 world_pos = mul(input.iModel, pos); // Transform the position from world space to homogeneous projection space float4 proj_pos = mul(View, world_pos); proj_pos = mul(Projection, proj_pos); output.Position = proj_pos; // Transform the position from world space to projection space of the light float4 proj_lpos = mul(LightView, world_pos); proj_lpos = mul(LightProjection, proj_lpos); output.PositionL = proj_lpos; // output normal float4 norm = float4(input.vNorm, 0.0f); output.Normal = normalize(mul(input.iModelInvTrans, norm).xyz); // output world position of the vertex output.WorldPos = world_pos.xyz; // output texture coordinates output.Tex = input.vTex; // output color output.Color = input.vCol * input.iCol; return output; }