1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-01 17:36:21 +03:00
occt/resources/Shaders/PhongShading.fs
Pasukhin Dmitry df4b931988
Configuration - Resource structure reorganization #429
Reorganized resources to keep source part in src and real-time scripts in resource folder.
For the installation result no changes, still installed to src for windows.
2025-03-18 22:54:43 +00:00

192 lines
6.0 KiB
GLSL
Executable File

// Created on: 2013-10-10
// Created by: Denis BOGOLEPOV
// Copyright (c) 2013-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
varying vec3 View; //!< Direction to the viewer
varying vec3 Normal; //!< Vertex normal in view space
varying vec4 Position; //!< Vertex position in view space.
varying vec4 PositionWorld; //!< Vertex position in world space
vec3 Ambient; //!< Ambient contribution of light sources
vec3 Diffuse; //!< Diffuse contribution of light sources
vec3 Specular; //!< Specular contribution of light sources
//! Computes contribution of isotropic point light source
void pointLight (in int theId,
in vec3 theNormal,
in vec3 theView,
in vec3 thePoint)
{
vec3 aLight = occLight_Position (theId).xyz;
if (!occLight_IsHeadlight (theId))
{
aLight = vec3 (occWorldViewMatrix * vec4 (aLight, 1.0));
}
aLight -= thePoint;
float aDist = length (aLight);
aLight = aLight * (1.0 / aDist);
float anAtten = 1.0 / (occLight_ConstAttenuation (theId)
+ occLight_LinearAttenuation (theId) * aDist);
vec3 aHalf = normalize (aLight + theView);
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, occMaterial_Shininess (gl_FrontFacing));
}
Diffuse += occLight_Diffuse (theId).rgb * aNdotL * anAtten;
Specular += occLight_Specular (theId).rgb * aSpecl * anAtten;
}
//! Computes contribution of spotlight source
void spotLight (in int theId,
in vec3 theNormal,
in vec3 theView,
in vec3 thePoint)
{
vec3 aLight = occLight_Position (theId).xyz;
vec3 aSpotDir = occLight_SpotDirection (theId).xyz;
if (!occLight_IsHeadlight (theId))
{
aLight = vec3 (occWorldViewMatrix * vec4 (aLight, 1.0));
aSpotDir = vec3 (occWorldViewMatrix * vec4 (aSpotDir, 0.0));
}
aLight -= thePoint;
float aDist = length (aLight);
aLight = aLight * (1.0 / aDist);
aSpotDir = normalize (aSpotDir);
// light cone
float aCosA = dot (aSpotDir, -aLight);
if (aCosA >= 1.0 || aCosA < cos (occLight_SpotCutOff (theId)))
{
return;
}
float anExponent = occLight_SpotExponent (theId);
float anAtten = 1.0 / (occLight_ConstAttenuation (theId)
+ occLight_LinearAttenuation (theId) * aDist);
if (anExponent > 0.0)
{
anAtten *= pow (aCosA, anExponent * 128.0);
}
vec3 aHalf = normalize (aLight + theView);
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, occMaterial_Shininess (gl_FrontFacing));
}
Diffuse += occLight_Diffuse (theId).rgb * aNdotL * anAtten;
Specular += occLight_Specular (theId).rgb * aSpecl * anAtten;
}
//! Computes contribution of directional light source
void directionalLight (in int theId,
in vec3 theNormal,
in vec3 theView)
{
vec3 aLight = normalize (occLight_Position (theId).xyz);
if (!occLight_IsHeadlight (theId))
{
aLight = vec3 (occWorldViewMatrix * vec4 (aLight, 0.0));
}
vec3 aHalf = normalize (aLight + theView);
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, occMaterial_Shininess (gl_FrontFacing));
}
Diffuse += occLight_Diffuse (theId).rgb * aNdotL;
Specular += occLight_Specular (theId).rgb * aSpecl;
}
//! Computes illumination from light sources
vec4 computeLighting (in vec3 theNormal,
in vec3 theView,
in vec4 thePoint)
{
// Clear the light intensity accumulators
Ambient = occLightAmbient.rgb;
Diffuse = vec3 (0.0);
Specular = vec3 (0.0);
vec3 aPoint = thePoint.xyz / thePoint.w;
for (int anIndex = 0; anIndex < occLightSourcesCount; ++anIndex)
{
int aType = occLight_Type (anIndex);
if (aType == OccLightType_Direct)
{
directionalLight (anIndex, theNormal, theView);
}
else if (aType == OccLightType_Point)
{
pointLight (anIndex, theNormal, theView, aPoint);
}
else if (aType == OccLightType_Spot)
{
spotLight (anIndex, theNormal, theView, aPoint);
}
}
vec3 aMatAmbient = occMaterial_Ambient (gl_FrontFacing);
vec4 aMatDiffuse = occMaterial_Diffuse (gl_FrontFacing);
vec3 aMatSpecular = occMaterial_Specular(gl_FrontFacing);
vec3 aMatEmission = occMaterial_Emission(gl_FrontFacing);
vec3 aColor = Ambient * aMatAmbient.rgb
+ Diffuse * aMatDiffuse.rgb
+ Specular * aMatSpecular.rgb
+ aMatEmission.rgb;
return vec4 (aColor, aMatDiffuse.a);
}
//! Entry point to the Fragment Shader
void main()
{
// process clipping planes
for (int anIndex = 0; anIndex < occClipPlaneCount; ++anIndex)
{
vec4 aClipEquation = occClipPlaneEquations[anIndex];
if (dot (aClipEquation.xyz, PositionWorld.xyz / PositionWorld.w) + aClipEquation.w < 0.0)
{
discard;
}
}
vec4 aColor = computeLighting (normalize (Normal), normalize (View), Position);
occSetFragColor (aColor);
}