float4x4 view_proj_matrix; float4x4 view_matrix; float4x4 inv_view_matrix; float4 light_position; float4 eye_position; struct VS_INPUT_STRUCT { float4 position: POSITION; float3 tangent: TANGENT; float3 normal: NORMAL; float2 texcoord0: TEXCOORD0; }; struct VS_OUTPUT_STRUCT { float4 position: POSITION; float2 bump_map: TEXCOORD0; float3 tangentlight: TEXCOORD1; float3 half_angle: TEXCOORD2; float3 tangenteye: TEXCOORD3; }; VS_OUTPUT_STRUCT main( VS_INPUT_STRUCT vsInStruct ) { VS_OUTPUT_STRUCT vsOutStruct; vsOutStruct.position = mul( view_proj_matrix, vsInStruct.position ); float3 position = mul( view_matrix, vsInStruct.position ); vsOutStruct.bump_map = vsInStruct.texcoord0; float3x3 tangentspace_matrix = float3x3(vsInStruct.tangent,cross(vsInStruct.tangent, vsInStruct.normal),vsInStruct.normal); float3 objectspace_light_vector = mul( inv_view_matrix, light_position ) - vsInStruct.position; vsOutStruct.tangentlight = mul( tangentspace_matrix, objectspace_light_vector ); float3 objectspace_view_vector = mul( inv_view_matrix, eye_position ) - vsInStruct.position; vsOutStruct.tangenteye = mul( tangentspace_matrix, objectspace_view_vector ); vsOutStruct.half_angle = vsOutStruct.tangentlight + vsOutStruct.tangenteye; return vsOutStruct; }