1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-10 18:51:21 +03:00
occt/src/Shaders/PhongPointLight.glsl
kgv b470ebea04 0032200: Visualization, TKOpenGl - unify Phong/PBR light space calculations
Graphic3d_ShaderManager - Phong shading now uses World space calculations.
OpenGl_ShaderManager::pushLightSourceState() - fixed unnormalized direction of headlight source.
2021-03-17 19:53:13 +03:00

37 lines
1.3 KiB
GLSL

//! Function computes contribution of isotropic point light source
//! into global variables Diffuse and Specular (Phong shading).
//! @param theId light source index
//! @param theNormal surface normal
//! @param theView view direction
//! @param thePoint 3D position (world space)
//! @param theIsFront front/back face flag
void occPointLight (in int theId,
in vec3 theNormal,
in vec3 theView,
in vec3 thePoint,
in bool theIsFront)
{
vec3 aLight = occLight_Position (theId) - thePoint;
float aDist = length (aLight);
float aRange = occLight_Range (theId);
float anAtten = occPointLightAttenuation (aDist, aRange, occLight_LinearAttenuation (theId), occLight_ConstAttenuation (theId));
if (anAtten <= 0.0) return;
aLight /= aDist;
vec3 aHalf = normalize (aLight + theView);
vec3 aFaceSideNormal = theIsFront ? 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, occMaterial_Shininess (theIsFront));
}
Diffuse += occLight_Diffuse (theId) * aNdotL * anAtten;
Specular += occLight_Specular(theId) * aSpecl * anAtten;
}