0024310: TKOpenGl - GLSL compatibility issues
[occt.git] / src / Shaders / PhongShading.fs
1 // Created on: 2013-10-10
2 // Created by: Denis BOGOLEPOV
3 // Copyright (c) 2013 OPEN CASCADE SAS
4 //
5 // The content of this file is subject to the Open CASCADE Technology Public
6 // License Version 6.5 (the "License"). You may not use the content of this file
7 // except in compliance with the License. Please obtain a copy of the License
8 // at http://www.opencascade.org and read it completely before using this file.
9 //
10 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
11 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
12 //
13 // The Original Code and all software distributed under the License is
14 // distributed on an "AS IS" basis, without warranty of any kind, and the
15 // Initial Developer hereby disclaims all such warranties, including without
16 // limitation, any warranties of merchantability, fitness for a particular
17 // purpose or non-infringement. Please see the License for the specific terms
18 // and conditions governing the rights and limitations under the License.
19
20 varying vec3 View;     //!< Direction to the viewer
21 varying vec3 Normal;   //!< Vertex normal in view space
22 varying vec4 Position; //!< Vertex position in view space.
23
24 vec3 Ambient;  //!< Ambient  contribution of light sources
25 vec3 Diffuse;  //!< Diffuse  contribution of light sources
26 vec3 Specular; //!< Specular contribution of light sources
27
28 //! Computes contribution of isotropic point light source
29 void pointLight (in int  theId,
30                  in vec3 theNormal,
31                  in vec3 theView,
32                  in vec3 thePoint)
33 {
34   vec3 aLight = occLight_Position (theId).xyz;
35   if (occLight_IsHeadlight (theId) == 0)
36   {
37     aLight = vec3 (occWorldViewMatrix * occModelWorldMatrix * vec4 (aLight, 1.0));
38   }
39   aLight -= thePoint;
40
41   float aDist = length (aLight);
42   aLight = aLight * (1.0 / aDist);
43
44   float anAtten = 1.0 / (occLight_ConstAttenuation  (theId)
45                        + occLight_LinearAttenuation (theId) * aDist);
46
47   vec3 aHalf = normalize (aLight + theView);
48
49   float aNdotL = max (0.0, dot (theNormal, aLight));
50   float aNdotH = max (0.0, dot (theNormal, aHalf ));
51
52   float aSpecl = 0.0;
53   if (aNdotL > 0.0)
54   {
55     aSpecl = pow (aNdotH, occFrontMaterial_Shininess());
56   }
57
58   Diffuse  += occLight_Diffuse  (theId).rgb * aNdotL * anAtten;
59   Specular += occLight_Specular (theId).rgb * aSpecl * anAtten;
60 }
61
62 //! Computes contribution of directional light source
63 void directionalLight (in int  theId,
64                        in vec3 theNormal,
65                        in vec3 theView)
66 {
67   vec3 aLight = normalize (occLight_Position (theId).xyz);
68   if (occLight_IsHeadlight (theId) == 0)
69   {
70     aLight = vec3 (occWorldViewMatrix * occModelWorldMatrix * vec4 (aLight, 0.0));
71   }
72
73   vec3 aHalf = normalize (aLight + theView);
74   float aNdotL = max (0.0, dot (theNormal, aLight));
75   float aNdotH = max (0.0, dot (theNormal, aHalf ));
76
77   float aSpecl = 0.0;
78   if (aNdotL > 0.0)
79   {
80     aSpecl = pow (aNdotH, occFrontMaterial_Shininess());
81   }
82
83   Diffuse  += occLight_Diffuse  (theId).rgb * aNdotL;
84   Specular += occLight_Specular (theId).rgb * aSpecl;
85 }
86
87 //! Computes illumination from light sources
88 vec4 computeLighting (in vec3 theNormal,
89                       in vec3 theView,
90                       in vec4 thePoint)
91 {
92   // Clear the light intensity accumulators
93   Ambient  = occLightAmbient.rgb;
94   Diffuse  = vec3 (0.0);
95   Specular = vec3 (0.0);
96   vec3 aPoint = thePoint.xyz / thePoint.w;
97   for (int anIndex = 0; anIndex < occLightSourcesCount; ++anIndex)
98   {
99     int aType = occLight_Type (anIndex);
100     if (aType == OccLightType_Direct)
101     {
102       directionalLight (anIndex, theNormal, theView);
103     }
104     else if (aType == OccLightType_Point)
105     {
106       pointLight (anIndex, theNormal, theView, aPoint);
107     }
108     else if (aType == OccLightType_Spot)
109     {
110       // Not implemented
111     }
112   }
113
114   return vec4 (Ambient,  1.0) * occFrontMaterial_Ambient()
115        + vec4 (Diffuse,  1.0) * occFrontMaterial_Diffuse()
116        + vec4 (Specular, 1.0) * occFrontMaterial_Specular();
117 }
118
119 //! Entry point to the Fragment Shader
120 void main()
121 {
122   gl_FragColor = computeLighting (normalize (Normal),
123                                   normalize (View),
124                                   Position);
125 }