• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#ifndef NUM_LIGHTS
2    #define NUM_LIGHTS 4
3#endif
4
5uniform mat4 g_ViewMatrix;
6uniform vec4 g_LightPosition[NUM_LIGHTS];
7uniform vec4 g_g_LightColor[NUM_LIGHTS];
8uniform float m_Shininess;
9
10float Lighting_Diffuse(vec3 norm, vec3 lightdir){
11    return max(0.0, dot(norm, lightdir));
12}
13
14float Lighting_Specular(vec3 norm, vec3 viewdir, vec3 lightdir, float shiny){
15    vec3 refdir = reflect(-lightdir, norm);
16    return pow(max(dot(refdir, viewdir), 0.0), shiny);
17}
18
19void Lighting_Direction(vec3 worldPos, vec4 color, vec4 position, out vec4 lightDir){
20    float posLight = step(0.5, color.w);
21    vec3 tempVec = position.xyz * sign(posLight - 0.5) - (worldPos * posLight);
22    float dist = length(tempVec);
23
24    lightDir.w = clamp(1.0 - position.w * dist * posLight, 0.0, 1.0);
25    lightDir.xyz = tempVec / dist;
26}
27
28void Lighting_ComputePS(vec3 tanNormal, mat3 tbnMat,
29                     int lightCount, out vec3 outDiffuse, out vec3 outSpecular){
30   // find tangent view dir & vert pos
31   vec3 tanViewDir = viewDir * tbnMat;
32
33   for (int i = 0; i < lightCount; i++){
34       // find light dir in tangent space, works for point & directional lights
35       vec4 wvLightPos = (g_ViewMatrix * vec4(g_LightPosition[i].xyz, g_LightColor[i].w));
36       wvLightPos.w = g_LightPosition[i].w;
37
38       vec4 tanLightDir;
39       Lighting_Direction(wvPosition, g_LightColor[i], wvLightPos, tanLightDir);
40       tanLightDir.xyz = tanLightDir.xyz * tbnMat;
41
42       vec3 lightScale = g_LightColor[i].rgb * tanLightDir.w;
43       float specular = Lighting_Specular(tanNormal, tanViewDir, tanLightDir.xyz, m_Shininess);
44       float diffuse = Lighting_Diffuse(tanNormal, tanLightDir.xyz);
45       outSpecular += specular * lightScale * step(0.01, diffuse) * g_LightColor[i].rgb;
46       outDiffuse += diffuse * lightScale * g_LightColor[i].rgb;
47   }
48}
49