From: apl Date: Wed, 13 Nov 2013 17:09:55 +0000 (+0400) Subject: 0024344: TKOpenGl - only front side is lighted within Phong GLSL program X-Git-Tag: V6_7_0~80 X-Git-Url: http://git.dev.opencascade.org/gitweb/?p=occt.git;a=commitdiff_plain;h=c90e941f788db073df5628615d692ceeed5b4b37 0024344: TKOpenGl - only front side is lighted within Phong GLSL program --- diff --git a/src/Shaders/PhongShading.fs b/src/Shaders/PhongShading.fs index 1b0779f026..665f83d3e1 100644 --- a/src/Shaders/PhongShading.fs +++ b/src/Shaders/PhongShading.fs @@ -46,13 +46,14 @@ void pointLight (in int theId, 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; @@ -71,13 +72,15 @@ void directionalLight (in int theId, } 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; @@ -111,9 +114,12 @@ vec4 computeLighting (in vec3 theNormal, } } - 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 diff --git a/tests/v3d/glsl/phong_sides b/tests/v3d/glsl/phong_sides new file mode 100644 index 0000000000..6d7fe78850 --- /dev/null +++ b/tests/v3d/glsl/phong_sides @@ -0,0 +1,37 @@ +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!" +}