Performance optimization for deciding when the directional shadow gets rendered.
This commit is contained in:
parent
a8ce6916e7
commit
c8ba61ca56
@ -47,6 +47,7 @@ uniform bool movingTexture;
|
|||||||
uniform vec2 movement;
|
uniform vec2 movement;
|
||||||
uniform vec2 movingTextureOffset;
|
uniform vec2 movingTextureOffset;
|
||||||
uniform float time;
|
uniform float time;
|
||||||
|
uniform bool sampleDirectionalShadowSwitch;
|
||||||
|
|
||||||
vec2 poissonDisk[16] = vec2[](
|
vec2 poissonDisk[16] = vec2[](
|
||||||
vec2( -0.94201624, -0.39906216 ),
|
vec2( -0.94201624, -0.39906216 ),
|
||||||
@ -171,40 +172,38 @@ void main()
|
|||||||
|
|
||||||
// direction lighting
|
// direction lighting
|
||||||
float sunAngle = -1.0;
|
float sunAngle = -1.0;
|
||||||
if(length(directionalLightVector)>0.0f) {
|
if(sampleDirectionalShadowSwitch) {
|
||||||
vec3 directionalVector = normalize(directionalLightVector);
|
vec3 directionalVector = normalize(directionalLightVector);
|
||||||
sunAngle = dot(vec3(0.0, 1.0, 0.0), directionalVector);
|
sunAngle = dot(vec3(0.0, 1.0, 0.0), directionalVector);
|
||||||
if ( sunAngle > 0.0) {
|
float directionalVisibility = 1.0f;
|
||||||
float directionalVisibility = 1.0f;
|
float directionalIntensity = sunIntensity(sunAngle);
|
||||||
float directionalIntensity = sunIntensity(sunAngle);
|
if (distanceToBorder(shadowCoord1.xy) <= 0.5 && distanceToBorder(shadowCoord1.xy) > 0.2) {
|
||||||
if (distanceToBorder(shadowCoord1.xy) <= 0.5 && distanceToBorder(shadowCoord1.xy) > 0.2) {
|
if (distanceToBorder(shadowCoord0.xy) <= 0.5 && distanceToBorder(shadowCoord0.xy) > 0.2) {
|
||||||
if (distanceToBorder(shadowCoord0.xy) <= 0.5 && distanceToBorder(shadowCoord0.xy) > 0.2) {
|
directionalVisibility = sampleDirectionalShadow(shadowMap_directional0, shadowCoord0, 0.001, directionalIntensity);
|
||||||
directionalVisibility = sampleDirectionalShadow(shadowMap_directional0, shadowCoord0, 0.001, directionalIntensity);
|
|
||||||
}
|
|
||||||
else if (distanceToBorder(shadowCoord0.xy) <= 0.5 && distanceToBorder(shadowCoord0.xy) > 0.0) {
|
|
||||||
float directionalVisibility0 = sampleDirectionalShadow(shadowMap_directional0, shadowCoord0, 0.001, directionalIntensity);
|
|
||||||
float directionalVisibility1 = sampleDirectionalShadow(shadowMap_directional1, shadowCoord1, 0.002, directionalIntensity);
|
|
||||||
directionalVisibility = mix(directionalVisibility0, directionalVisibility1, distanceToBorder(shadowCoord0.xy) * 5);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
directionalVisibility = sampleDirectionalShadow(shadowMap_directional1, shadowCoord1, 0.002, directionalIntensity);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (distanceToBorder(shadowCoord1.xy) <= 0.5 && distanceToBorder(shadowCoord1.xy) > 0.0) {
|
else if (distanceToBorder(shadowCoord0.xy) <= 0.5 && distanceToBorder(shadowCoord0.xy) > 0.0) {
|
||||||
|
float directionalVisibility0 = sampleDirectionalShadow(shadowMap_directional0, shadowCoord0, 0.001, directionalIntensity);
|
||||||
float directionalVisibility1 = sampleDirectionalShadow(shadowMap_directional1, shadowCoord1, 0.002, directionalIntensity);
|
float directionalVisibility1 = sampleDirectionalShadow(shadowMap_directional1, shadowCoord1, 0.002, directionalIntensity);
|
||||||
float directionalVisibility2 = sampleDirectionalShadow(shadowMap_directional2, shadowCoord2, 0.01, directionalIntensity);
|
directionalVisibility = mix(directionalVisibility0, directionalVisibility1, distanceToBorder(shadowCoord0.xy) * 5);
|
||||||
directionalVisibility = mix(directionalVisibility1, directionalVisibility2, distanceToBorder(shadowCoord1.xy) * 5);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
directionalVisibility = sampleDirectionalShadow(shadowMap_directional2, shadowCoord2, 0.01, directionalIntensity);
|
directionalVisibility = sampleDirectionalShadow(shadowMap_directional1, shadowCoord1, 0.002, directionalIntensity);
|
||||||
}
|
}
|
||||||
diffuseColor += clamp(dot(normalize(vNormal), directionalVector)
|
|
||||||
*diffuseFactor*directionalIntensity*sunColor(sunAngle), 0.0, 1.0)*directionalVisibility;
|
|
||||||
vec3 cameraVector = normalize(camera - vec3(fragPosition));
|
|
||||||
specularColor += clamp(pow((dot((cameraVector+directionalVector),normalize(vNormal))/
|
|
||||||
(length(cameraVector+directionalVector)*length(normalize(vNormal)))),shininess), 0.0, 1.0)
|
|
||||||
*specularFactor*directionalIntensity*sunColor(sunAngle)*directionalVisibility;
|
|
||||||
}
|
}
|
||||||
|
else if (distanceToBorder(shadowCoord1.xy) <= 0.5 && distanceToBorder(shadowCoord1.xy) > 0.0) {
|
||||||
|
float directionalVisibility1 = sampleDirectionalShadow(shadowMap_directional1, shadowCoord1, 0.002, directionalIntensity);
|
||||||
|
float directionalVisibility2 = sampleDirectionalShadow(shadowMap_directional2, shadowCoord2, 0.01, directionalIntensity);
|
||||||
|
directionalVisibility = mix(directionalVisibility1, directionalVisibility2, distanceToBorder(shadowCoord1.xy) * 5);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
directionalVisibility = sampleDirectionalShadow(shadowMap_directional2, shadowCoord2, 0.01, directionalIntensity);
|
||||||
|
}
|
||||||
|
diffuseColor += clamp(dot(normalize(vNormal), directionalVector)
|
||||||
|
*diffuseFactor*directionalIntensity*sunColor(sunAngle), 0.0, 1.0)*directionalVisibility;
|
||||||
|
vec3 cameraVector = normalize(camera - vec3(fragPosition));
|
||||||
|
specularColor += clamp(pow((dot((cameraVector+directionalVector),normalize(vNormal))/
|
||||||
|
(length(cameraVector+directionalVector)*length(normalize(vNormal)))),shininess), 0.0, 1.0)
|
||||||
|
*specularFactor*directionalIntensity*sunColor(sunAngle)*directionalVisibility;
|
||||||
}
|
}
|
||||||
|
|
||||||
// point lights
|
// point lights
|
||||||
|
@ -30,6 +30,7 @@ Graphics::Graphics(glm::uvec2 windowSize, float nearPlane,
|
|||||||
renderFlames = true;
|
renderFlames = true;
|
||||||
renderWorld = true;
|
renderWorld = true;
|
||||||
renderDebug = false;
|
renderDebug = false;
|
||||||
|
directionalShadowSwitch = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Graphics::Graphics() {
|
Graphics::Graphics() {
|
||||||
@ -196,6 +197,7 @@ void Graphics::init(Level* level) {
|
|||||||
lightingShader->setUniform("fogColorRise", level->getFogColourRise());
|
lightingShader->setUniform("fogColorRise", level->getFogColourRise());
|
||||||
lightingShader->setUniform("fogColorNight", level->getFogColourNight());
|
lightingShader->setUniform("fogColorNight", level->getFogColourNight());
|
||||||
lightingShader->setUniform("ambientColor", level->getAmbientLight());
|
lightingShader->setUniform("ambientColor", level->getAmbientLight());
|
||||||
|
lightingShader->setUniform("sampleDirectionalShadowSwitch", false);
|
||||||
if(level->getDirectionalLight()) {
|
if(level->getDirectionalLight()) {
|
||||||
lightingShader->setUniform("directionalLightVector",
|
lightingShader->setUniform("directionalLightVector",
|
||||||
level->getDirectionalLight()->getPosition());
|
level->getDirectionalLight()->getPosition());
|
||||||
@ -361,37 +363,46 @@ void Graphics::render(double time)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// render depth textures for sun
|
|
||||||
depthShader->use();
|
|
||||||
glViewport(0, 0, windowSize.x, windowSize.y);
|
glViewport(0, 0, windowSize.x, windowSize.y);
|
||||||
|
|
||||||
|
// render depth textures for sun
|
||||||
float sunAngle = glm::dot(glm::vec3(0.0f, 1.0f, 0.0f), glm::normalize(level->getDirectionalLight()->getPosition()));
|
float sunAngle = glm::dot(glm::vec3(0.0f, 1.0f, 0.0f), glm::normalize(level->getDirectionalLight()->getPosition()));
|
||||||
glm::vec3 sunVector = (level->getCameraCenter()->getPosition() + level->getDirectionalLight()->getPosition());
|
glm::vec3 sunVector = (level->getCameraCenter()->getPosition() + level->getDirectionalLight()->getPosition());
|
||||||
|
|
||||||
for (unsigned int i = 0; i<framebuffer_directional.size(); i++) {
|
if (sunAngle > 0.0f) {
|
||||||
framebuffer_directional.at(i)->bind();
|
if (!directionalShadowSwitch) {
|
||||||
glClear(GL_DEPTH_BUFFER_BIT);
|
lightingShader->use();
|
||||||
if (sunAngle > 0.0f) {
|
lightingShader->setUniform("sampleDirectionalShadowSwitch", true);
|
||||||
float projection_size = 0.0f;
|
directionalShadowSwitch = true;
|
||||||
switch(i) {
|
|
||||||
case 0:
|
|
||||||
projection_size = 10.0f;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
projection_size = 30.0f;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
projection_size = farPlane/1.5f;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
depthViewProjectionMatrices.at(i) = glm::ortho<float>(-projection_size, projection_size, -projection_size, projection_size, -farPlane/1.5f, farPlane/1.5f) *
|
|
||||||
glm::lookAt(sunVector, level->getCameraCenter()->getPosition(), glm::vec3(0,1,0));
|
|
||||||
level->render(depthShader, false, -1, &depthViewProjectionMatrices.at(i));
|
|
||||||
if (!framebuffer_directional.at(i)->isFrameBufferObjectComplete()) {
|
|
||||||
printf("Framebuffer incomplete, unknown error occured during shadow generation!\n");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
depthShader->use();
|
||||||
|
for (unsigned int i = 0; i<framebuffer_directional.size(); i++) {
|
||||||
|
framebuffer_directional.at(i)->bind();
|
||||||
|
glClear(GL_DEPTH_BUFFER_BIT);
|
||||||
|
float projection_size = 0.0f;
|
||||||
|
switch(i) {
|
||||||
|
case 0:
|
||||||
|
projection_size = 10.0f;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
projection_size = 30.0f;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
projection_size = farPlane/1.5f;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
depthViewProjectionMatrices.at(i) = glm::ortho<float>(-projection_size, projection_size, -projection_size, projection_size, -farPlane/1.5f, farPlane/1.5f) *
|
||||||
|
glm::lookAt(sunVector, level->getCameraCenter()->getPosition(), glm::vec3(0,1,0));
|
||||||
|
level->render(depthShader, false, -1, &depthViewProjectionMatrices.at(i));
|
||||||
|
if (!framebuffer_directional.at(i)->isFrameBufferObjectComplete()) {
|
||||||
|
printf("Framebuffer incomplete, unknown error occured during shadow generation!\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (directionalShadowSwitch) {
|
||||||
|
lightingShader->use();
|
||||||
|
lightingShader->setUniform("sampleDirectionalShadowSwitch", false);
|
||||||
|
directionalShadowSwitch = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,6 +84,7 @@ class Graphics {
|
|||||||
bool renderFlames;
|
bool renderFlames;
|
||||||
bool renderDebug;
|
bool renderDebug;
|
||||||
bool renderWorld;
|
bool renderWorld;
|
||||||
|
bool directionalShadowSwitch;
|
||||||
DebugDraw debugDrawer;
|
DebugDraw debugDrawer;
|
||||||
SharedArrayBuffer debug_ab;
|
SharedArrayBuffer debug_ab;
|
||||||
SharedVertexArrayObject debug_vao;
|
SharedVertexArrayObject debug_vao;
|
||||||
|
Loading…
Reference in New Issue
Block a user