// Define inputs from application. struct VertexIn { float4 position : POSITION; // Vertex in object-space float4 normal : NORMAL; // Vertex's Normal float2 subTexCoord : TEXCOORD0; // Vertex's Texture Coordinates float3 color : COLOR0; }; // Define outputs from vertex shader. struct Vertex { float4 position : POSITION; // Vertex position in screen-space float2 texCoord : TEXCOORD0; // Vertex texture coordinates float2 subTexCoord : TEXCOORD1; // Vertex texture coordinates float3 normal : TEXCOORD2; // Normal in eye-space float3 halfVector : TEXCOORD3; // Half angle vector in eye space float3 lightVector : TEXCOORD4; // Light vector in eye space float4 wposition : TEXCOORD5; // Vertex position in world-space float3 color : COLOR0; }; Vertex main(VertexIn p_In, uniform float4x4 p_ModelViewProjection, // Model view projection matrix uniform float4 p_LightPosition, // Light position in object-space uniform float4x4 p_ModelView, // Model view matrix uniform float4x4 p_InverseModelView, // Model view matrix inverted uniform float4x4 p_Model // Model matrix ) { Vertex l_Out; // Compute light position in eye-space float4 l_LightPosition4 = mul(p_ModelView, p_LightPosition); float3 l_LightPosition3 = l_LightPosition4.xyz; // Compute vertex position in eye-space float4 l_Position4 = mul(p_ModelView, p_In.position); float3 l_Position3 = l_Position4.xyz / l_Position4.w; // Transform normal from model-space to eye-space. l_Out.normal = mul(p_Model, p_In.normal); l_Out.normal = normalize(mul(transpose(p_InverseModelView), float4(l_Out.normal,1.0)).xyz); // Light vector. l_Out.lightVector = l_LightPosition3 - (l_Position3 * l_LightPosition4.w); // Half angle vector = light vector + eye vector l_Out.halfVector = l_Out.lightVector + (- l_Position3); // Compute vertex position in light space // First object to world space l_Out.wposition = mul(p_Model, float4(0.0, 0.0, 0.0, 1.0)); // Transform vertex position into homogenous screen-space. l_Out.position = mul(p_ModelViewProjection, p_In.position); // Pass texture coordinates to fragment shader l_Out.subTexCoord = p_In.subTexCoord; l_Out.texCoord = p_In.color.xy; l_Out.color = p_In.color; return l_Out; }