mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-09-03 14:10:33 +03:00
0032039: Visualization, TKOpenGl - implement simple shadow mapping for a direct light source
Graphic3d_CLight::ToCastShadows() - added new property defining if light should cast shadows (ignored by Ray-Tracing). OpenGl_ShaderManager::stdComputeLighting() now implements shadow mapping for directional lights. OpenGl_ShaderManager::prepareGeomMainSrc() now handles copying of arrays. OpenGl_Context::ShadowMapTexUnit() - added property defining an offset for shadow map texture units. OpenGl_ShadowMap - added new class storing shadow map FBO with parameters. OpenGl_View::prepareFrameBuffers() - added resizing of shadow map FBOs. OpenGl_View::Redraw() - added section redrawing scene into shadow map FBOs via OpenGl_View::renderShadowMap() method. vrenderparams - added new parameters -shadowMapResolution and -shadowMapBias.
This commit is contained in:
27
src/Shaders/DirectionalLightShadow.glsl
Normal file
27
src/Shaders/DirectionalLightShadow.glsl
Normal file
@@ -0,0 +1,27 @@
|
||||
//! Coefficients for gathering close samples.
|
||||
const vec2 occPoissonDisk16[16] = vec2[](
|
||||
vec2(-0.94201624,-0.39906216), vec2( 0.94558609,-0.76890725), vec2(-0.09418410,-0.92938870), vec2( 0.34495938, 0.29387760),
|
||||
vec2(-0.91588581, 0.45771432), vec2(-0.81544232,-0.87912464), vec2(-0.38277543, 0.27676845), vec2( 0.97484398, 0.75648379),
|
||||
vec2( 0.44323325,-0.97511554), vec2( 0.53742981,-0.47373420), vec2(-0.26496911,-0.41893023), vec2( 0.79197514, 0.19090188),
|
||||
vec2(-0.24188840, 0.99706507), vec2(-0.81409955, 0.91437590), vec2( 0.19984126, 0.78641367), vec2( 0.14383161,-0.14100790)
|
||||
);
|
||||
|
||||
//! Function computes directional light shadow attenuation (1.0 means no shadow).
|
||||
float occDirectionalLightShadow (in int theId,
|
||||
in vec3 theNormal)
|
||||
{
|
||||
vec4 aPosLightSpace = PosLightSpace[theId];
|
||||
vec3 aLightDir = vec3 (occWorldViewMatrix * vec4 (occLight_Position (theId), 0.0));
|
||||
vec3 aProjCoords = (aPosLightSpace.xyz / aPosLightSpace.w) * 0.5 + vec3 (0.5);
|
||||
float aCurrentDepth = aProjCoords.z;
|
||||
if (abs(aProjCoords.x) > 1.0 || abs(aProjCoords.y) > 1.0 || aCurrentDepth > 1.0) { return 1.0; }
|
||||
vec2 aTexelSize = vec2 (occShadowMapSizeBias.x);
|
||||
float aBias = max (occShadowMapSizeBias.y * (1.0 - dot (theNormal, aLightDir)), occShadowMapSizeBias.y * 0.1);
|
||||
float aShadow = 0.0;
|
||||
for (int aPosIter = 0; aPosIter < 16; ++aPosIter)
|
||||
{
|
||||
float aClosestDepth = occTexture2D (occShadowMapSamplers[theId], aProjCoords.xy + occPoissonDisk16[aPosIter] * aTexelSize).r;
|
||||
aShadow += (aCurrentDepth - aBias) > aClosestDepth ? 1.0 : 0.0;
|
||||
}
|
||||
return 1.0 - aShadow / 16.0;
|
||||
}
|
@@ -1,5 +1,6 @@
|
||||
srcinc:::Declarations.glsl
|
||||
srcinc:::DeclarationsImpl.glsl
|
||||
srcinc:::DirectionalLightShadow.glsl
|
||||
srcinc:::PBRCookTorrance.glsl
|
||||
srcinc:::PBRDistribution.glsl
|
||||
srcinc:::PBREnvBaking.fs
|
||||
@@ -19,6 +20,7 @@ srcinc:::RaytraceSmooth.fs
|
||||
srcinc:::TangentSpaceNormal.glsl
|
||||
Shaders_Declarations_glsl.pxx
|
||||
Shaders_DeclarationsImpl_glsl.pxx
|
||||
Shaders_DirectionalLightShadow_glsl.pxx
|
||||
Shaders_Display_fs.pxx
|
||||
Shaders_PBRCookTorrance_glsl.pxx
|
||||
Shaders_PBRDistribution_glsl.pxx
|
||||
|
30
src/Shaders/Shaders_DirectionalLightShadow_glsl.pxx
Normal file
30
src/Shaders/Shaders_DirectionalLightShadow_glsl.pxx
Normal file
@@ -0,0 +1,30 @@
|
||||
// This file has been automatically generated from resource file src/Shaders/DirectionalLightShadow.glsl
|
||||
|
||||
static const char Shaders_DirectionalLightShadow_glsl[] =
|
||||
"//! Coefficients for gathering close samples.\n"
|
||||
"const vec2 occPoissonDisk16[16] = vec2[](\n"
|
||||
" vec2(-0.94201624,-0.39906216), vec2( 0.94558609,-0.76890725), vec2(-0.09418410,-0.92938870), vec2( 0.34495938, 0.29387760),\n"
|
||||
" vec2(-0.91588581, 0.45771432), vec2(-0.81544232,-0.87912464), vec2(-0.38277543, 0.27676845), vec2( 0.97484398, 0.75648379),\n"
|
||||
" vec2( 0.44323325,-0.97511554), vec2( 0.53742981,-0.47373420), vec2(-0.26496911,-0.41893023), vec2( 0.79197514, 0.19090188),\n"
|
||||
" vec2(-0.24188840, 0.99706507), vec2(-0.81409955, 0.91437590), vec2( 0.19984126, 0.78641367), vec2( 0.14383161,-0.14100790)\n"
|
||||
");\n"
|
||||
"\n"
|
||||
"//! Function computes directional light shadow attenuation (1.0 means no shadow).\n"
|
||||
"float occDirectionalLightShadow (in int theId,\n"
|
||||
" in vec3 theNormal)\n"
|
||||
"{\n"
|
||||
" vec4 aPosLightSpace = PosLightSpace[theId];\n"
|
||||
" vec3 aLightDir = vec3 (occWorldViewMatrix * vec4 (occLight_Position (theId), 0.0));\n"
|
||||
" vec3 aProjCoords = (aPosLightSpace.xyz / aPosLightSpace.w) * 0.5 + vec3 (0.5);\n"
|
||||
" float aCurrentDepth = aProjCoords.z;\n"
|
||||
" if (abs(aProjCoords.x) > 1.0 || abs(aProjCoords.y) > 1.0 || aCurrentDepth > 1.0) { return 1.0; }\n"
|
||||
" vec2 aTexelSize = vec2 (occShadowMapSizeBias.x);\n"
|
||||
" float aBias = max (occShadowMapSizeBias.y * (1.0 - dot (theNormal, aLightDir)), occShadowMapSizeBias.y * 0.1);\n"
|
||||
" float aShadow = 0.0;\n"
|
||||
" for (int aPosIter = 0; aPosIter < 16; ++aPosIter)\n"
|
||||
" {\n"
|
||||
" float aClosestDepth = occTexture2D (occShadowMapSamplers[theId], aProjCoords.xy + occPoissonDisk16[aPosIter] * aTexelSize).r;\n"
|
||||
" aShadow += (aCurrentDepth - aBias) > aClosestDepth ? 1.0 : 0.0;\n"
|
||||
" }\n"
|
||||
" return 1.0 - aShadow / 16.0;\n"
|
||||
"}\n";
|
Reference in New Issue
Block a user