home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GameStar 2005 April
/
Gamestar_72_2005-04_dvd.iso
/
Dema
/
Liquidator
/
Liquidator.tma
/
data
/
renderer
/
pixellights.fx
< prev
next >
Wrap
Text File
|
2004-09-27
|
12KB
|
302 lines
//--------------------------------------------------------------------------
// TMShaders
// Copyright (c) 2002 by Tools-Media Corp., All Right Reserved.
// Programmer: Tima Tcvetkov
//
// pixellights.fx
// Per-pixeligt shaders
//--------------------------------------------------------------------------
#ifndef __PIXELLIGHTS_FX__
#define __PIXELLIGHTS_FX__
void CalculateVertexLightDistanceIF( ){
float3 vecLight = (float3)vecPointLightPosition[0].w * (vecPointLightPosition[0].xyz - g_fWorldViewVertexPosition.xyz);
g_fTexCoords[0].x = clamp( 1.0f - dot(vecLight,vecLight),0.0f,1.0f);
}
void CalculateLightDistanceIF( ){
g_fTexCoords[0].xyz = vecPointLightPosition[0].w * (vecPointLightPosition[0].xyz - g_fWorldViewVertexPosition.xyz);
}
/********************************************************************************************
Function computes tangent light vector and volume-map distance attenuation
for either point or spot lights.
********************************************************************************************/
void CalculatePPLightWithTextureAttenuation( uniform int NumLights, uniform bool bSpecular, uniform bool bSpotLight ){
if( bSpotLight ){
for( int i =0; i<NumLights; i++ ){
float3 fSpotLightDirection = -vecSpotLightDirection[i];
g_fTexCoords[i+i+1].xyz = mul(g_fVertexPosition,matTextureProjection[i]);
if( bSpecular ){
float3 fVecVertex2Eye = normalize( -(float3)g_fWorldViewVertexPosition );
float1 fDot = dot(g_fWorldViewNormal,fSpotLightDirection);
fDot = fDot * 6.5f + 0.5f;
fDot = clamp(fDot,0.0,1.0);
fSpotLightDirection = fVecVertex2Eye + fSpotLightDirection;
// back face culling value
if( i== 0 ){
g_fColor0.xyz = float3(fDot,fDot,fDot);
}else if( i == 1 ){
g_fColor0.w = fDot;
}else if( i == 2 ){
g_fColor1.xyz = float3(fDot,fDot,fDot);
}
else if( i == 3 ){
g_fColor1.w = fDot;
} // if i
} // if specular
/*
g_fTexCoords[i+i+2].x = dot(g_fWorldViewS, fSpotLightDirection);
g_fTexCoords[i+i+2].y = dot(g_fWorldViewT, fSpotLightDirection);
g_fTexCoords[i+i+2].z = dot(g_fWorldViewSxT,fSpotLightDirection);
*/
g_fTexCoords[i+i+2].x = dot(g_fWorldViewS, fSpotLightDirection);
g_fTexCoords[i+i+2].y = dot(g_fWorldViewT, fSpotLightDirection);
g_fTexCoords[i+i+2].z = dot(g_fWorldViewSxT,fSpotLightDirection);
} // for
} // if spot light
else{
for( int i =0; i < NumLights; i++){
float3 rV2LV = (float3)vecPointLightPosition[i] - (float3)g_fWorldViewVertexPosition;
float3 rVertex2LightVector = normalize(rV2LV);
if( bSpecular ){
float3 fVecVertex2Eye = normalize( -(float3)g_fWorldViewVertexPosition );
float1 fDot = dot(g_fWorldViewNormal,rVertex2LightVector);
fDot = fDot * 6.5f + 0.5f;
fDot = clamp(fDot,0.0,1.0);
rVertex2LightVector = fVecVertex2Eye + rVertex2LightVector;
// back face culling value
if( i== 0 ){
g_fColor0.xyz = float3(fDot,fDot,fDot);
}else if( i == 1 ){
g_fColor0.w = fDot;
}else if( i == 2 ){
g_fColor1.xyz = float3(fDot,fDot,fDot);
}
else if( i == 3 ){
g_fColor1.w = fDot;
}// if i
} // if specular
g_fTexCoords[i+i+1].xyz = rV2LV * vecPointLightPosition[i].w + 0.5;
g_fTexCoords[i+i+2].x = dot(g_fWorldViewS,rVertex2LightVector);
g_fTexCoords[i+i+2].y = dot(g_fWorldViewT,rVertex2LightVector);
g_fTexCoords[i+i+2].z = dot(g_fWorldViewSxT,rVertex2LightVector);
}// for
}// else
}
/*******************************************************************************
Simplified function for diffuse per-pixel lighting.
Distance attenuation passed thru diffuse and specular intrapolators.
Tangent light vector passed thru texture coordinates.
********************************************************************************/
void CalculateSimplePointLightDiffuseTangentLightVector20( uniform int NumLights ){
for( int i =0; i<NumLights; i++ ){
/*
float4 Vertex2PointLight;
Vertex2PointLight.xyz = vecPointLightPosition[i] - (float3)g_fWorldViewVertexPosition;
float DotProduct = dot(Vertex2PointLight.xyz,Vertex2PointLight.xyz);
Vertex2PointLight.w = rsqrt(DotProduct);
Vertex2PointLight.xyz = Vertex2PointLight.xyz * Vertex2PointLight.w;
float fAttenuationDot = 1.0f - (Vertex2PointLight.w * DotProduct * vecPointLightPosition[i].w);
float DotProduct = clamp(dot(g_fWorldViewNormal,(float3)Vertex2PointLight),0.0f,1.0f);
*/
float3 Vertex2PointLight;
Vertex2PointLight = vecPointLightPosition[i].xyz - (float3)g_fWorldViewVertexPosition;
float3 AttenuatedLightVec = Vertex2PointLight * (float3)vecPointLightPosition[i].w;
float fAttenuationDot = clamp(1.0f - dot(AttenuatedLightVec,AttenuatedLightVec),0.0f,1.0f);
Vertex2PointLight = normalize(Vertex2PointLight);
//float DotProduct = clamp(dot(g_fWorldViewNormal,Vertex2PointLight),0.0f,1.0f);
g_fTexCoords[i+1].w = /*DotProduct **/ fAttenuationDot;
g_fTexCoords[i+1].x = dot(g_fWorldViewS,Vertex2PointLight);
g_fTexCoords[i+1].y = dot(g_fWorldViewT,Vertex2PointLight);
g_fTexCoords[i+1].z = dot(g_fWorldViewSxT,Vertex2PointLight);
}
}
void CalculateSimplePointLightDiffuseTangentLightVector( uniform int NumLights ){
for( int i =0; i<NumLights; i++ ){
/*
float4 Vertex2PointLight;
Vertex2PointLight.xyz = vecPointLightPosition[i] - (float3)g_fWorldViewVertexPosition;
float DotProduct = dot(Vertex2PointLight.xyz,Vertex2PointLight.xyz);
Vertex2PointLight.w = rsqrt(DotProduct);
Vertex2PointLight.xyz = Vertex2PointLight.xyz * Vertex2PointLight.w;
float1 fAttenuationDot = 1.0f - (Vertex2PointLight.w * DotProduct * vecPointLightPosition[i].w);
*/
float3 Vertex2PointLight;
Vertex2PointLight = vecPointLightPosition[i].xyz - (float3)g_fWorldViewVertexPosition;
float3 AttenuatedLightVec = Vertex2PointLight * (float3)vecPointLightPosition[i].w;
float fAttenuationDot = clamp(1.0f - dot(AttenuatedLightVec,AttenuatedLightVec),0.0f,1.0f);
Vertex2PointLight = normalize(Vertex2PointLight);
//float DotProduct = clamp(dot(g_fWorldViewNormal,(float3)Vertex2PointLight),0.0f,1.0f);
g_fColor0.w = /*DotProduct **/ fAttenuationDot;
g_fColor0.x = dot(g_fWorldViewS,Vertex2PointLight);
g_fColor0.y = dot(g_fWorldViewT,Vertex2PointLight);
g_fColor0.z = dot(g_fWorldViewSxT,Vertex2PointLight);
g_fColor0.xyz = g_fColor0.xyz * 0.5f + 0.5f;
}
}
/*******************************************************************************
Simplified function for specular per-pixel lighting.
Distance attenuation passed thru diffuse and specular intrapolators.
Tangent light vector passed thru texture coordinates.
********************************************************************************/
void CalculateVertexSpecularHalfVector20( uniform int NumLights ){
float3 VecVertex2Eye = normalize( -(float3)g_fWorldViewVertexPosition );
for( int i =0; i<NumLights; i++){
/*
float4 Vertex2PointLight;
Vertex2PointLight.xyz = vecPointLightPosition[i] - (float3)g_fWorldViewVertexPosition;
float DotProduct = dot(Vertex2PointLight.xyz,Vertex2PointLight.xyz);
Vertex2PointLight.w = rsqrt(DotProduct);
Vertex2PointLight.xyz = Vertex2PointLight.xyz * Vertex2PointLight.w;
float1 fAttenuationDot = 1.0f - (Vertex2PointLight.w * DotProduct * vecPointLightPosition[i].w);
*/
float3 Vertex2PointLight;
Vertex2PointLight = vecPointLightPosition[i].xyz - (float3)g_fWorldViewVertexPosition;
float3 AttenuatedLightVec = Vertex2PointLight * (float3)vecPointLightPosition[i].w;
float fAttenuationDot = clamp(1.0f - dot(AttenuatedLightVec,AttenuatedLightVec),0.0f,1.0f);
Vertex2PointLight = normalize(Vertex2PointLight);
//float DotProduct = clamp( dot(g_fWorldViewNormal,(float3)Vertex2PointLight),0.0f,1.0f);
g_fTexCoords[i+1].w = /*DotProduct **/ fAttenuationDot;
float3 VecHalf = normalize( Vertex2PointLight + VecVertex2Eye );
g_fTexCoords[i+1].x = dot(g_fWorldViewS,VecHalf);
g_fTexCoords[i+1].y = dot(g_fWorldViewT,VecHalf);
g_fTexCoords[i+1].z = dot(g_fWorldViewSxT,VecHalf);
}// for
}
void CalculateVertexSpecularHalfVector( uniform int NumLights ){
float3 VecVertex2Eye = normalize( -(float3)g_fWorldViewVertexPosition );
for( int i =0; i<NumLights; i++){
/*
float4 Vertex2PointLight;
Vertex2PointLight.xyz = vecPointLightPosition[i] - (float3)g_fWorldViewVertexPosition;
float DotProduct = dot(Vertex2PointLight.xyz,Vertex2PointLight.xyz);
Vertex2PointLight.w = rsqrt(DotProduct);
Vertex2PointLight.xyz = Vertex2PointLight.xyz * Vertex2PointLight.w;
float1 fAttenuationDot = 1.0f - (Vertex2PointLight.w * DotProduct * vecPointLightPosition[i].w);
DotProduct = clamp( dot(g_fWorldViewNormal,(float3)Vertex2PointLight),0.0f,1.0f);
*/
float3 Vertex2PointLight;
Vertex2PointLight = vecPointLightPosition[i].xyz - (float3)g_fWorldViewVertexPosition;
float3 AttenuatedLightVec = Vertex2PointLight * (float3)vecPointLightPosition[i].w;
float fAttenuationDot = clamp(1.0f - dot(AttenuatedLightVec,AttenuatedLightVec),0.0f,1.0f);
Vertex2PointLight = normalize(Vertex2PointLight);
//float DotProduct = clamp( dot(g_fWorldViewNormal,(float3)Vertex2PointLight),0.0f,1.0f);
g_fColor0.w = /*DotProduct **/ fAttenuationDot;
float3 VecHalf = normalize( Vertex2PointLight + VecVertex2Eye );
g_fColor0.x = dot(g_fWorldViewS,VecHalf);
g_fColor0.y = dot(g_fWorldViewT,VecHalf);
g_fColor0.z = dot(g_fWorldViewSxT,VecHalf);
g_fColor0.xyz = g_fColor0.xyz * 0.5f + 0.5f;
}// for
}
/*******************************************************************
Simple 3D texture projection for point and spot lights
********************************************************************/
void CalculateSimple3DBallLight( uniform int NumLights, uniform bool bSpot ){
for( int i =0; i<NumLights; i++ ){
if( bSpot ){
g_fTexCoords[i].xyz = mul(g_fVertexPosition,matTextureProjection[i]);
} // if bSpot
else{
float3 Vertex2PointLight;
Vertex2PointLight.xyz = vecPointLightPosition[i] - (float3)g_fWorldViewVertexPosition;
g_fTexCoords[i].xyz = Vertex2PointLight.xyz * vecPointLightPosition[i].w + 0.5;
}//else
} // for
}
void CalculateBlinnBumpmapMatrix(){
float3 Eye = (float3)vecEyePosition - (float3)g_fVertexPosition;
g_fTexCoords[1].x = dot( g_fS, (float3)vecCubeMapMatrixRow[0]);
g_fTexCoords[1].y = dot( g_fT, (float3)vecCubeMapMatrixRow[0]);
g_fTexCoords[1].z = dot( g_fSxT,(float3)vecCubeMapMatrixRow[0]);
g_fTexCoords[1].w = Eye[0];
g_fTexCoords[2].x = dot( g_fS, (float3)vecCubeMapMatrixRow[1]);
g_fTexCoords[2].y = dot( g_fT, (float3)vecCubeMapMatrixRow[1]);
g_fTexCoords[2].z = dot( g_fSxT,(float3)vecCubeMapMatrixRow[1]);
g_fTexCoords[2].w = Eye[1];
g_fTexCoords[3].x = dot( g_fS, (float3)vecCubeMapMatrixRow[2]);
g_fTexCoords[3].y = dot( g_fT, (float3)vecCubeMapMatrixRow[2]);
g_fTexCoords[3].z = dot( g_fSxT,(float3)vecCubeMapMatrixRow[2]);
g_fTexCoords[3].w = Eye[2];
}
void ProjectTexture( uniform int NumLights ){
for( int i =0; i<NumLights; i++ ){
g_fTexCoords[i].xyz = mul(g_fWorldViewVertexPosition,matTextureProjection[i]);
}
}
void TransformPosition4x4( uniform int NumLights ){
for( int i =0; i<NumLights; i++ ){
g_fTexCoords[i] = mul(g_fVertexPosition,matTextureProjection[i]);
}
}
#endif //__PIXELLIGHTS_FX__