// View-corrected Anisotropic Lighting // Copyright (C) 2003 by Marco Jez struct appdata { float4 position: POSITION; float4 normal: NORMAL; }; struct vpconn { float4 position: POSITION; float2 texcoord0: TEXCOORD0; }; vpconn main(appdata input, uniform float4x4 view_inverse: ATTR0) { // compute model matrix float4x4 modelmat = mul(view_inverse, glstate.matrix.modelview[0]); // compute rotational model matrix float3x3 rot_only_modelmat; rot_only_modelmat[0] = modelmat[0].xyz; rot_only_modelmat[1] = modelmat[1].xyz; rot_only_modelmat[2] = modelmat[2].xyz; // compute world-space vertex position float4 world_position = mul(modelmat, input.position); // compute world-space vertex normal float4 world_normal; world_normal.xyz = mul(rot_only_modelmat, input.normal.xyz); world_normal.w = 0; // compute world-space light vector float4 world_lightvec = mul(view_inverse, glstate.light[0].position); // compute world-space viewpoint float4 world_viewpoint = mul(view_inverse, float4(0, 0, 0, 1)); // compute world-space halfway vector float4 world_halfway = normalize(normalize(world_viewpoint - world_position) + normalize(world_lightvec)); float LdotN = dot(world_lightvec, world_normal); float HdotN = dot(world_halfway, world_normal); vpconn output; output.position = mul(glstate.matrix.mvp, input.position); output.texcoord0.x = max(HdotN, 0); output.texcoord0.y = max(LdotN, 0); return output; }