View difference between Paste ID: F5DqxqU1 and
SHOW:
|
|
- or go back to the newest paste.
1 | - | |
1 | + | void PS_Phong(in float3 inNormal : TEXCOORD, |
2 | in float3 inCameraDir : TEXCOORD1, | |
3 | in float3 inWorldPos : TEXCOORD2, | |
4 | out float4 outColor : COLOR) | |
5 | { | |
6 | outColor = float4(0.0f, 0.0f, 0.0f, 0.0f); | |
7 | ||
8 | //renormalize interpolated vectors | |
9 | inNormal = normalize(inNormal); | |
10 | inCameraDir = normalize(inCameraDir); | |
11 | ||
12 | const float shininess = 2; | |
13 | const float4 material_ambient = float4(0.05f, 0.05f, 0.05f, 1.0f); | |
14 | const float4 material_diffuse = float4(0.30f, 0.30f, 0.30f, 1.0f); | |
15 | const float4 material_specular = float4(0.20f, 0.20f, 0.20f, 1.0f); | |
16 | int i; | |
17 | ||
18 | const float opacity = 0.01; | |
19 | ||
20 | const float3 direction = inWorldPos-cameraPos; | |
21 | const float distance_to_wall = length(direction); | |
22 | ||
23 | float alpha_sum = 0; | |
24 | const float3 rayDirection = normalize(direction); | |
25 | ||
26 | for (i=0; i<4; i++) | |
27 | { | |
28 | if (cameraId == i) | |
29 | continue; | |
30 | ||
31 | float3 position = cameraPos + normalize(direction)*0.1; | |
32 | ||
33 | int playerIndex = i; | |
34 | ||
35 | float3 value = float3(0, 0, 0); | |
36 | float alpha = 1; | |
37 | float distance_from_nearplane = 0; | |
38 | ||
39 | while(distance_from_nearplane < distance_to_wall) | |
40 | { | |
41 | //float3 distance_2 = length(lightPos[playerIndex] - position); | |
42 | //float lightAttenuation = 1 / pow(distance_2, cameraId+1); | |
43 | float3 distance = lightPos[playerIndex] - position; | |
44 | float lightAttenuation = 1 / dot(distance, distance); | |
45 | ||
46 | float shadow = 1.0f; | |
47 | float lightIntensity=1.1337f; | |
48 | ||
49 | alpha = pow(1-opacity, distance_from_nearplane); | |
50 | alpha_sum += alpha * opacity; | |
51 | value.rgb = (alpha * opacity)*(lightColors[playerIndex] * lightIntensity * lightAttenuation * shadow); | |
52 | ||
53 | distance_from_nearplane = length(position - cameraPos) - 0.1; | |
54 | outColor += float4(value, 0); | |
55 | ||
56 | float rayLength = length(lightPos[playerIndex] - position)/5; | |
57 | position += rayDirection*(rayLength + 0.1); | |
58 | } | |
59 | } | |
60 | ||
61 | for (i = 0; i < MaxLights; ++i) | |
62 | { | |
63 | float3 lightDirection = (lightPos[i] - inWorldPos); | |
64 | float atten = 1.0f / (length(lightDirection)*linearLightFactor + dot(lightDirection, lightDirection)*quadraticLightFactor + constantLightFactor); | |
65 | ||
66 | lightDirection = normalize(lightDirection); | |
67 | float3 h = normalize(lightDirection + inCameraDir); | |
68 | ||
69 | float nDotL = saturate(dot(inNormal, lightDirection)); | |
70 | float nDotH = saturate(dot(inNormal, h)); | |
71 | ||
72 | float power = (nDotL == 0.0f) ? 0.0f : pow(nDotH, shininess); | |
73 | ||
74 | float4 color = (material_ambient) + (material_diffuse * nDotL);// + (material_specular * power); | |
75 | ||
76 | color *= atten; | |
77 | color *= shadowBrightness(inWorldPos, i); | |
78 | //color *= lightRad[i]; | |
79 | ||
80 | outColor += color*(1-alpha_sum)*float4(lightColors[i], 1); | |
81 | } | |
82 | ||
83 | outColor.a = 1; | |
84 | } |