All pastes #170937 Raw Edit

Someone

public text v1 · immutable
·published 2006-09-14 21:44 UTC
rendered paste body
// Globals
float4x4 view_proj_matrix : WorldViewProjection;
float time : Time;
float4x4 inv_view_matrix : WorldInverse;
float4x4 view_matrix : World;
float4 view_position;
float4 Light_Attenuation;
float4 Light_Color;
float4 Light_Ambient;


//float4x4 TransWorld;

struct VS_OUTPUT
{
	float4 Position : POSITION;
	float2 TexCoord: TEXCOORD0;
	float4 LightDir: TEXCOORD1;
	float3 HalfVect: TEXCOORD2;
};

VS_OUTPUT vertexMain( float4 inPos: POSITION, float3 inNormal: NORMAL,
                  float3 inTangent:TANGENT, float3 inBinormal:BINORMAL,
                  float2 inTxr: TEXCOORD0)
{
	// Set out output
	VS_OUTPUT Out;

	// Make a "wave" pattern.
	float ltime=(time/1000);
	inPos.y+=10*(sin((-0.01*inPos.x+0.07*inPos.z)+ltime*1.3)*0.5+0.5);
	
	// Position the vertex based on our projection
	Out.Position = mul(inPos, view_proj_matrix);
	Out.TexCoord = inTxr;
	
	

	// Calculate distance form light to vertex and its direction
	float4 LightDir;
	LightDir.xyz = mul(float3(80,00,-80),inv_view_matrix) - inPos;
	float Dist = length(LightDir.xyz);
	LightDir.xyz = LightDir.xyz / Dist;

	// Calculate vertex/distance based attenuation
	LightDir.w = clamp(0,1, 1 / ( Light_Attenuation.x +
                                 Light_Attenuation.y * Dist + 
                                 Light_Attenuation.z * Dist * Dist ));

	// Determine the eye vector
  	float3 EyeVector = normalize(view_position-inPos);
	
	// transform to tangent sspace
	float3x3 TangentSpace;
	TangentSpace[0] = inTangent;
	TangentSpace[1] = inBinormal;
	TangentSpace[2] = inNormal;
	Out.HalfVect = mul(TangentSpace,normalize(LightDir.xyz+EyeVector));
	Out.LightDir = float4(mul(TangentSpace,LightDir.xyz),LightDir.w);

	return Out;
}

//float4 Light1_Color;
sampler2D tex0;
sampler2D tex1;
float4 Light_Point(float3 Normal, float3 HalfVect, float4 LightDir,
                           float4 LightColor)
{
   // Compute both specular and diffuse factors
   float SpecularAttn =  pow( clamp(0, 1,dot(Normal, HalfVect)),16);
   float DiffuseAttn =  clamp(0, 1,dot(Normal, LightDir));
 
   // Compute final lighting
   float4 finallight =  LightColor * LightDir.w * (SpecularAttn+DiffuseAttn);
   finallight.y = 1.0;
   return finallight;
}


float4 pixelMain(float2 inTxr:TEXCOORD0,float4 LightDir:TEXCOORD1,
               float3 HalfVect:TEXCOORD2) : COLOR 
{
   // Read bump and influence the normal
   float3 normal = tex2D(tex1,inTxr) * 2 - 1; 

   // Output lighting color
   float4 lightdat = tex2D(tex0,inTxr)*
          (0.15+Light_Point(normal,HalfVect,LightDir,Light_Color));

return lightdat;
	//return float4(normal, 1.0);
}