vec3 aHalf = normalize (aLight + theView);
- float aNdotL = max (0.0, dot (theNormal, aLight));
- float aNdotH = max (0.0, dot (theNormal, aHalf ));
+ vec3 aFaceSideNormal = gl_FrontFacing ? theNormal : -theNormal;
+ float aNdotL = max (0.0, dot (aFaceSideNormal, aLight));
+ float aNdotH = max (0.0, dot (aFaceSideNormal, aHalf ));
float aSpecl = 0.0;
if (aNdotL > 0.0)
{
- aSpecl = pow (aNdotH, occFrontMaterial_Shininess());
+ aSpecl = pow (aNdotH, gl_FrontFacing ? occFrontMaterial_Shininess() : occBackMaterial_Shininess());
}
Diffuse += occLight_Diffuse (theId).rgb * aNdotL * anAtten;
}
vec3 aHalf = normalize (aLight + theView);
- float aNdotL = max (0.0, dot (theNormal, aLight));
- float aNdotH = max (0.0, dot (theNormal, aHalf ));
+
+ vec3 aFaceSideNormal = gl_FrontFacing ? theNormal : -theNormal;
+ float aNdotL = max (0.0, dot (aFaceSideNormal, aLight));
+ float aNdotH = max (0.0, dot (aFaceSideNormal, aHalf ));
float aSpecl = 0.0;
if (aNdotL > 0.0)
{
- aSpecl = pow (aNdotH, occFrontMaterial_Shininess());
+ aSpecl = pow (aNdotH, gl_FrontFacing ? occFrontMaterial_Shininess() : occBackMaterial_Shininess());
}
Diffuse += occLight_Diffuse (theId).rgb * aNdotL;
}
}
- return vec4 (Ambient, 1.0) * occFrontMaterial_Ambient()
- + vec4 (Diffuse, 1.0) * occFrontMaterial_Diffuse()
- + vec4 (Specular, 1.0) * occFrontMaterial_Specular();
+ vec4 aMaterialAmbient = gl_FrontFacing ? occFrontMaterial_Ambient() : occBackMaterial_Ambient();
+ vec4 aMaterialDiffuse = gl_FrontFacing ? occFrontMaterial_Diffuse() : occBackMaterial_Diffuse();
+ vec4 aMaterialSpecular = gl_FrontFacing ? occFrontMaterial_Specular() : occBackMaterial_Specular();
+ return vec4 (Ambient, 1.0) * aMaterialAmbient
+ + vec4 (Diffuse, 1.0) * aMaterialDiffuse
+ + vec4 (Specular, 1.0) * aMaterialSpecular;
}
//! Entry point to the Fragment Shader
--- /dev/null
+puts "========"
+puts "Per-pixel lighting using GLSL program (Phong shading), check lighting of back faces"
+puts "========"
+
+# create box
+box b 1 2 3
+explode b F
+
+# draw box
+vinit View1
+vclear
+vsetdispmode 1
+vaxo
+vdisplay b_1 b_2
+vfit
+vrotate 0.2 0.0 0.0
+
+# take snapshot with fixed pipeline
+vdump $::imagedir/${::casename}_OFF.png
+set aColorB [vreadpixel 150 150 rgb name]
+set aColorF [vreadpixel 250 250 rgb name]
+if { "$aColorB" != "$aColorF"} {
+ puts "Error: front/back colors are different!"
+}
+set aColorFixed $aColorF
+
+# activate phong shader
+vshaderprog phong
+set aColorB [vreadpixel 150 150 rgb name]
+set aColorF [vreadpixel 250 250 rgb name]
+if { "$aColorB" != "$aColorF"} {
+ puts "Error: front/back colors are different!"
+}
+
+if { "$aColorF" != "$aColorFixed"} {
+ puts "Error: colors are different!"
+}