void PS_Phong(in float3 inNormal : TEXCOORD, in float3 inCameraDir : TEXCOORD1, in float3 inWorldPos : TEXCOORD2, out float4 outColor : COLOR) { outColor = float4(0.0f, 0.0f, 0.0f, 0.0f); //renormalize interpolated vectors inNormal = normalize(inNormal); inCameraDir = normalize(inCameraDir); const float shininess = 2; const float4 material_ambient = float4(0.05f, 0.05f, 0.05f, 1.0f); const float4 material_diffuse = float4(0.30f, 0.30f, 0.30f, 1.0f); const float4 material_specular = float4(0.20f, 0.20f, 0.20f, 1.0f); int i; const float opacity = 0.01; const float3 direction = inWorldPos-cameraPos; const float distance_to_wall = length(direction); float alpha_sum = 0; const float3 rayDirection = normalize(direction); for (i=0; i<4; i++) { if (cameraId == i) continue; float3 position = cameraPos + normalize(direction)*0.1; int playerIndex = i; float3 value = float3(0, 0, 0); float alpha = 1; float distance_from_nearplane = 0; while(distance_from_nearplane < distance_to_wall) { //float3 distance_2 = length(lightPos[playerIndex] - position); //float lightAttenuation = 1 / pow(distance_2, cameraId+1); float3 distance = lightPos[playerIndex] - position; float lightAttenuation = 1 / dot(distance, distance); float shadow = 1.0f; float lightIntensity=1.1337f; alpha = pow(1-opacity, distance_from_nearplane); alpha_sum += alpha * opacity; value.rgb = (alpha * opacity)*(lightColors[playerIndex] * lightIntensity * lightAttenuation * shadow); distance_from_nearplane = length(position - cameraPos) - 0.1; outColor += float4(value, 0); float rayLength = length(lightPos[playerIndex] - position)/5; position += rayDirection*(rayLength + 0.1); } } for (i = 0; i < MaxLights; ++i) { float3 lightDirection = (lightPos[i] - inWorldPos); float atten = 1.0f / (length(lightDirection)*linearLightFactor + dot(lightDirection, lightDirection)*quadraticLightFactor + constantLightFactor); lightDirection = normalize(lightDirection); float3 h = normalize(lightDirection + inCameraDir); float nDotL = saturate(dot(inNormal, lightDirection)); float nDotH = saturate(dot(inNormal, h)); float power = (nDotL == 0.0f) ? 0.0f : pow(nDotH, shininess); float4 color = (material_ambient) + (material_diffuse * nDotL);// + (material_specular * power); color *= atten; color *= shadowBrightness(inWorldPos, i); //color *= lightRad[i]; outColor += color*(1-alpha_sum)*float4(lightColors[i], 1); } outColor.a = 1; }