struct vertOUT { float4 hPos :POSITION; float4 hPosition :TEXCOORD4; float3 wPos :TEXCOORD1; float2 texCoord :TEXCOORD0; float3 mNormal :TEXCOORD2; }; vertOUT PhongVS(float4 position : POSITION, float3 normal : NORMAL, half3 tangent : TEXCOORD1, float2 texCoord : TEXCOORD0, uniform float4x4 worldViewProj, uniform float4x4 world) { vertOUT OUT; OUT.hPos = OUT.hPosition = mul(worldViewProj, position); OUT.wPos = mul(world, position).xyz; OUT.mNormal = mul(world, normal); //OUT.mNormal = normal; OUT.texCoord = texCoord; return OUT; } float4 PhongPS( vertOUT IN, uniform float3 cameraPos, uniform float3 lightpos1, uniform float3 lightpos2, uniform float3 lightpos3, uniform float3 lightpos4, uniform float3 lightpos5, uniform float3 lightpos6, uniform float3 lightpos7, uniform float3 lightpos8, uniform float4 lightcol1, uniform float4 lightcol2, uniform float4 lightcol3, uniform float4 lightcol4, uniform float4 lightcol5, uniform float4 lightcol6, uniform float4 lightcol7, uniform float4 lightcol8, uniform float4 ambientLight, uniform float shininess, uniform float4 specular, uniform float4 diffuse, uniform float4 ambient ) : COLOR0 { float3 N = IN.mNormal; N = normalize( N ); float3 pos = IN.wPos; float M = 4; float3 lightpositions[8]; float4 lightcolors[8]; lightpositions[0] = lightpos1; lightpositions[1] = lightpos2; lightpositions[2] = lightpos3; lightpositions[3] = lightpos4; lightpositions[4] = lightpos5; lightpositions[5] = lightpos6; lightpositions[6] = lightpos7; lightpositions[7] = lightpos8; lightcolors[0] = lightcol1; lightcolors[1] = lightcol2; lightcolors[2] = lightcol3; lightcolors[3] = lightcol4; lightcolors[4] = lightcol5; lightcolors[5] = lightcol6; lightcolors[6] = lightcol7; lightcolors[7] = lightcol8; float4 I = ambientLight * ambient; for(int i=0; i< M; i++) { float3 V = normalize(cameraPos - pos); float3 L = lightpositions[i] - pos; float d = length(L); L = normalize(L); float3 H = normalize(L + V); float lightscale = 3.0; float4 spec = specular * lightcolors[i] * pow(dot(H, N), shininess) * lightscale; float4 diff = diffuse * lightcolors[i] * abs(dot(L, N)) * lightscale; float range = 4.0; I += 1.0 / d * (spec + diff); } //return 1; return I; } vertOUT PhongViewSpaceVS(float4 position : POSITION, float3 normal : NORMAL, half3 tangent : TEXCOORD1, float2 texCoord : TEXCOORD0, uniform float4x4 worldViewProj, uniform float4x4 worldView, uniform float4x4 worldViewI) { vertOUT OUT; OUT.hPos = OUT.hPosition = mul(worldViewProj, position); OUT.wPos = mul(worldView, position).xyz; OUT.mNormal = normal;//mul(normal, worldViewI).xyz; //OUT.mNormal = normal; OUT.texCoord = texCoord; return OUT; } float4 PhongTexturedPS( vertOUT IN, uniform float3 cameraPos, uniform float4 lightpos1, uniform float4 lightpos2, uniform float4 lightpos3, uniform float4 lightpos4, uniform float4 lightpos5, uniform float4 lightpos6, uniform float4 lightpos7, uniform float4 lightpos8, uniform float4 lightdir1, uniform float4 lightdir2, uniform float4 lightdir3, uniform float4 lightdir4, uniform float4 lightdir5, uniform float4 lightdir6, uniform float4 lightdir7, uniform float4 lightdir8, uniform float lightscale1, uniform float lightscale2, uniform float lightscale3, uniform float lightscale4, uniform float lightscale5, uniform float lightscale6, uniform float lightscale7, uniform float lightscale8, uniform float4 lightcol1, uniform float4 lightcol2, uniform float4 lightcol3, uniform float4 lightcol4, uniform float4 lightcol5, uniform float4 lightcol6, uniform float4 lightcol7, uniform float4 lightcol8, uniform float4 ambientLight, uniform float shininess, uniform float4 specular, uniform float4 diffuse, uniform float4 ambient, uniform sampler2D colorTexture ) : COLOR0 { float3 N = IN.mNormal; N = normalize( N ); float3 pos = IN.wPos; float M = 3; float4 lightpositions[8]; float4 lightdirs[8]; float4 lightcolors[8]; lightpositions[0] = lightpos1; lightpositions[1] = lightpos2; lightpositions[2] = lightpos3; lightpositions[3] = lightpos4; lightpositions[4] = lightpos5; lightpositions[5] = lightpos6; lightpositions[6] = lightpos7; lightpositions[7] = lightpos8; lightdirs[0] = lightdir1; lightdirs[1] = lightdir2; lightdirs[2] = lightdir3; lightdirs[3] = lightdir4; lightdirs[4] = lightdir5; lightdirs[5] = lightdir6; lightdirs[6] = lightdir7; lightdirs[7] = lightdir8; lightcolors[0] = lightcol1 * lightscale1; lightcolors[1] = lightcol2 * lightscale2; lightcolors[2] = lightcol3 * lightscale3; lightcolors[3] = lightcol4 * lightscale4; lightcolors[4] = lightcol5 * lightscale5; lightcolors[5] = lightcol6 * lightscale6; lightcolors[6] = lightcol7 * lightscale7; lightcolors[7] = lightcol8 * lightscale8; float4 texColor = tex2D(colorTexture, IN.texCoord); if(length(texColor)==0)texColor = 1; float4 I = 0; I = texColor * ambientLight * ambient; float maxlightangle = 90.0 / 180.0 * 3.14; for(int i=0; i< M; i++) { float3 V = normalize(cameraPos - pos); float3 L = lightpositions[i].xyz - pos * lightpositions[i].w; float d = length(L); L = normalize(L); float3 H = normalize(L + V); float spotscale = 1.0; if( lightdirs[i].w && lightpositions[i].w)//spotlight { float lightangle; lightangle = acos(dot(-L, normalize(lightdirs[i].xyz))); spotscale = 1 - saturate(lightangle / maxlightangle); //spotscale *= spotscale; } float4 spec = spotscale * specular * lightcolors[i] * pow(dot(H, N), shininess); float4 diff = spotscale * texColor * diffuse * lightcolors[i] * dot(L, N); I += 1.0 / d / d * (spec + diff); //I+= spotscale; } //return texColor; //return float4(N,1); return I; } float4 PhongPlaneReflectPS( vertOUT IN, uniform float3 cameraPos, uniform float3 lightpos1, uniform float3 lightpos2, uniform float3 lightpos3, uniform float3 lightpos4, uniform float3 lightpos5, uniform float3 lightpos6, uniform float3 lightpos7, uniform float3 lightpos8, uniform float4 lightcol1, uniform float4 lightcol2, uniform float4 lightcol3, uniform float4 lightcol4, uniform float4 lightcol5, uniform float4 lightcol6, uniform float4 lightcol7, uniform float4 lightcol8, uniform float4 ambientLight, uniform float shininess, uniform float4 specular, uniform float4 diffuse, uniform float4 ambient, uniform sampler2D reflectionTex, uniform float reflectionAmount ) : COLOR0 { float3 N = IN.mNormal; N = normalize( N ); float3 pos = IN.wPos; float M = 4; float3 lightpositions[8]; float4 lightcolors[8]; lightpositions[0] = lightpos1; lightpositions[1] = lightpos2; lightpositions[2] = lightpos3; lightpositions[3] = lightpos4; lightpositions[4] = lightpos5; lightpositions[5] = lightpos6; lightpositions[6] = lightpos7; lightpositions[7] = lightpos8; lightcolors[0] = lightcol1; lightcolors[1] = lightcol2; lightcolors[2] = lightcol3; lightcolors[3] = lightcol4; lightcolors[4] = lightcol5; lightcolors[5] = lightcol6; lightcolors[6] = lightcol7; lightcolors[7] = lightcol8; float4 I = ambientLight * ambient; for(int i=0; i< M; i++) { float3 V = normalize(cameraPos - pos); float3 L = lightpositions[i] - pos; float d = length(L); L = normalize(L); float3 H = normalize(L + V); float lightscale = 3; float4 spec = specular * lightcolors[i] * pow(dot(H, N), shininess) * lightscale; float4 diff = diffuse * lightcolors[i] * abs(dot(L, N)) * lightscale; float range = 4.0; I += 1.0 / d * (spec + diff); } float2 uv = (IN.hPosition.xy/IN.hPosition.w + 1.0) * 0.5; uv.y = 1.0 - uv.y; float4 reflection = tex2D(reflectionTex, uv); I *= reflectionAmount * reflection + (1 - reflectionAmount); //I = reflection; //return 1; return I; }