diff options
author | Tomi Korpipää <tomi.korpipaa@digia.com> | 2013-09-02 09:35:09 +0300 |
---|---|---|
committer | Tomi Korpipää <tomi.korpipaa@digia.com> | 2013-09-02 09:37:59 +0300 |
commit | 5299755440a19ab7c2e4fd2bc6ac0f39a7ee319b (patch) | |
tree | c71fa96578388a2a54fc064e751c1cdcc458c2a2 /src/datavis3d/engine | |
parent | 15f8c86385a055d35b07519e4bf8c8f1aa915ea3 (diff) |
Option for softer shadows added
+ fixed a shadow shader bug that caused a little bit of shadowing always
Change-Id: Ia39ff5d92d2aca32e4f6c5a3bd6d68213564254a
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Diffstat (limited to 'src/datavis3d/engine')
-rw-r--r-- | src/datavis3d/engine/bars3drenderer.cpp | 40 | ||||
-rw-r--r-- | src/datavis3d/engine/bars3drenderer_p.h | 1 | ||||
-rw-r--r-- | src/datavis3d/engine/scatter3drenderer.cpp | 41 | ||||
-rw-r--r-- | src/datavis3d/engine/scatter3drenderer_p.h | 1 | ||||
-rw-r--r-- | src/datavis3d/engine/shaders/shadow.frag | 2 | ||||
-rw-r--r-- | src/datavis3d/engine/shaders/shadowNoTex.frag | 34 | ||||
-rw-r--r-- | src/datavis3d/engine/shaders/shadowNoTexColorOnY.frag | 2 |
7 files changed, 93 insertions, 28 deletions
diff --git a/src/datavis3d/engine/bars3drenderer.cpp b/src/datavis3d/engine/bars3drenderer.cpp index ee28c58b..133b47f2 100644 --- a/src/datavis3d/engine/bars3drenderer.cpp +++ b/src/datavis3d/engine/bars3drenderer.cpp @@ -72,7 +72,8 @@ Bars3DRenderer::Bars3DRenderer(Bars3DController *controller) m_depthFrameBuffer(0), m_selectionFrameBuffer(0), m_selectionDepthBuffer(0), - m_shadowQualityToShader(33.3f), + m_shadowQualityToShader(100.0f), + m_shadowQualityMultiplier(3), m_heightNormalizer(1.0f), m_yAdjustment(0.0f), m_rowWidth(0), @@ -475,8 +476,8 @@ void Bars3DRenderer::drawScene(CameraHelper *camera, // Set viewport for depth map rendering. Must match texture size. Larger values give smoother shadows. glViewport(m_mainViewPort.x(), m_mainViewPort.y(), - m_mainViewPort.width() * m_cachedShadowQuality, - m_mainViewPort.height() * m_cachedShadowQuality); + m_mainViewPort.width() * m_shadowQualityMultiplier, + m_mainViewPort.height() * m_shadowQualityMultiplier); // Get the depth view matrix // It may be possible to hack lightPos here if we want to make some tweaks to shadow @@ -1522,15 +1523,31 @@ void Bars3DRenderer::updateShadowQuality(QDataVis::ShadowQuality quality) switch (quality) { case QDataVis::ShadowLow: m_shadowQualityToShader = 33.3f; + m_shadowQualityMultiplier = 1; break; case QDataVis::ShadowMedium: m_shadowQualityToShader = 100.0f; + m_shadowQualityMultiplier = 3; break; case QDataVis::ShadowHigh: m_shadowQualityToShader = 200.0f; + m_shadowQualityMultiplier = 5; + break; + case QDataVis::ShadowSoftLow: + m_shadowQualityToShader = 5.0f; + m_shadowQualityMultiplier = 1; + break; + case QDataVis::ShadowSoftMedium: + m_shadowQualityToShader = 10.0f; + m_shadowQualityMultiplier = 3; + break; + case QDataVis::ShadowSoftHigh: + m_shadowQualityToShader = 15.0f; + m_shadowQualityMultiplier = 4; break; default: m_shadowQualityToShader = 0.0f; + m_shadowQualityMultiplier = 1; break; } @@ -1724,7 +1741,7 @@ void Bars3DRenderer::updateDepthBuffer() if (m_cachedShadowQuality > QDataVis::ShadowNone) { m_depthTexture = m_textureHelper->createDepthTexture(m_mainViewPort.size(), m_depthFrameBuffer, - m_cachedShadowQuality); + m_shadowQualityMultiplier); if (!m_depthTexture) { switch (m_cachedShadowQuality) { case QDataVis::ShadowHigh: @@ -1742,6 +1759,21 @@ void Bars3DRenderer::updateDepthBuffer() (void)m_controller->setShadowQuality(QDataVis::ShadowNone); updateShadowQuality(QDataVis::ShadowNone); break; + case QDataVis::ShadowSoftHigh: + qWarning("Creating soft high quality shadows failed. Changing to soft medium quality."); + (void)m_controller->setShadowQuality(QDataVis::ShadowSoftMedium); + updateShadowQuality(QDataVis::ShadowSoftMedium); + break; + case QDataVis::ShadowSoftMedium: + qWarning("Creating soft medium quality shadows failed. Changing to soft low quality."); + (void)m_controller->setShadowQuality(QDataVis::ShadowSoftLow); + updateShadowQuality(QDataVis::ShadowSoftLow); + break; + case QDataVis::ShadowSoftLow: + qWarning("Creating soft low quality shadows failed. Switching shadows off."); + (void)m_controller->setShadowQuality(QDataVis::ShadowNone); + updateShadowQuality(QDataVis::ShadowNone); + break; default: // You'll never get here break; diff --git a/src/datavis3d/engine/bars3drenderer_p.h b/src/datavis3d/engine/bars3drenderer_p.h index d57a4e27..cbfaa403 100644 --- a/src/datavis3d/engine/bars3drenderer_p.h +++ b/src/datavis3d/engine/bars3drenderer_p.h @@ -88,6 +88,7 @@ private: GLuint m_selectionFrameBuffer; GLuint m_selectionDepthBuffer; GLfloat m_shadowQualityToShader; + GLint m_shadowQualityMultiplier; GLfloat m_heightNormalizer; GLfloat m_yAdjustment; GLfloat m_rowWidth; diff --git a/src/datavis3d/engine/scatter3drenderer.cpp b/src/datavis3d/engine/scatter3drenderer.cpp index bee1ee5c..8f28e050 100644 --- a/src/datavis3d/engine/scatter3drenderer.cpp +++ b/src/datavis3d/engine/scatter3drenderer.cpp @@ -71,7 +71,8 @@ Scatter3DRenderer::Scatter3DRenderer(Scatter3DController *controller) m_depthFrameBuffer(0), m_selectionFrameBuffer(0), m_selectionDepthBuffer(0), - m_shadowQualityToShader(33.3f), + m_shadowQualityToShader(100.0f), + m_shadowQualityMultiplier(3), m_heightNormalizer(1.0f), m_scaleFactor(0), m_selection(selectionSkipColor), @@ -294,8 +295,8 @@ void Scatter3DRenderer::drawScene(CameraHelper *camera, // Set viewport for depth map rendering. Must match texture size. Larger values give smoother shadows. glViewport(m_mainViewPort.x(), m_mainViewPort.y(), - m_mainViewPort.width() * m_cachedShadowQuality, - m_mainViewPort.height() * m_cachedShadowQuality); + m_mainViewPort.width() * m_shadowQualityMultiplier, + m_mainViewPort.height() * m_shadowQualityMultiplier); // Enable drawing to framebuffer glBindFramebuffer(GL_FRAMEBUFFER, m_depthFrameBuffer); @@ -1403,20 +1404,35 @@ void Scatter3DRenderer::updateBackgroundEnabled(bool enable) void Scatter3DRenderer::updateShadowQuality(QDataVis::ShadowQuality quality) { - qDebug() << __FUNCTION__ << quality; m_cachedShadowQuality = quality; switch (quality) { case QDataVis::ShadowLow: m_shadowQualityToShader = 33.3f; + m_shadowQualityMultiplier = 1; break; case QDataVis::ShadowMedium: m_shadowQualityToShader = 100.0f; + m_shadowQualityMultiplier = 3; break; case QDataVis::ShadowHigh: m_shadowQualityToShader = 200.0f; + m_shadowQualityMultiplier = 5; + break; + case QDataVis::ShadowSoftLow: + m_shadowQualityToShader = 5.0f; + m_shadowQualityMultiplier = 1; + break; + case QDataVis::ShadowSoftMedium: + m_shadowQualityToShader = 10.0f; + m_shadowQualityMultiplier = 3; + break; + case QDataVis::ShadowSoftHigh: + m_shadowQualityToShader = 15.0f; + m_shadowQualityMultiplier = 4; break; default: m_shadowQualityToShader = 0.0f; + m_shadowQualityMultiplier = 1; break; } @@ -1560,7 +1576,7 @@ void Scatter3DRenderer::updateDepthBuffer() if (m_cachedShadowQuality > QDataVis::ShadowNone) { m_depthTexture = m_textureHelper->createDepthTexture(m_mainViewPort.size(), m_depthFrameBuffer, - m_cachedShadowQuality); + m_shadowQualityMultiplier); if (!m_depthTexture) { switch (m_cachedShadowQuality) { case QDataVis::ShadowHigh: @@ -1578,6 +1594,21 @@ void Scatter3DRenderer::updateDepthBuffer() (void)m_controller->setShadowQuality(QDataVis::ShadowNone); updateShadowQuality(QDataVis::ShadowNone); break; + case QDataVis::ShadowSoftHigh: + qWarning("Creating soft high quality shadows failed. Changing to soft medium quality."); + (void)m_controller->setShadowQuality(QDataVis::ShadowSoftMedium); + updateShadowQuality(QDataVis::ShadowSoftMedium); + break; + case QDataVis::ShadowSoftMedium: + qWarning("Creating soft medium quality shadows failed. Changing to soft low quality."); + (void)m_controller->setShadowQuality(QDataVis::ShadowSoftLow); + updateShadowQuality(QDataVis::ShadowSoftLow); + break; + case QDataVis::ShadowSoftLow: + qWarning("Creating soft low quality shadows failed. Switching shadows off."); + (void)m_controller->setShadowQuality(QDataVis::ShadowNone); + updateShadowQuality(QDataVis::ShadowNone); + break; default: // You'll never get here break; diff --git a/src/datavis3d/engine/scatter3drenderer_p.h b/src/datavis3d/engine/scatter3drenderer_p.h index 12fa7a04..50518a27 100644 --- a/src/datavis3d/engine/scatter3drenderer_p.h +++ b/src/datavis3d/engine/scatter3drenderer_p.h @@ -81,6 +81,7 @@ private: GLuint m_selectionFrameBuffer; GLuint m_selectionDepthBuffer; GLfloat m_shadowQualityToShader; + GLint m_shadowQualityMultiplier; GLfloat m_heightNormalizer; GLfloat m_scaleFactor; QVector3D m_selection; diff --git a/src/datavis3d/engine/shaders/shadow.frag b/src/datavis3d/engine/shaders/shadow.frag index c299e25c..5309b5bb 100644 --- a/src/datavis3d/engine/shaders/shadow.frag +++ b/src/datavis3d/engine/shaders/shadow.frag @@ -58,7 +58,7 @@ void main() { // direct method; needs large shadow texture to look good //highp float visibility = 0.75 * shadow2DProj(shadowMap, shadCoords).r + 0.25; // poisson disk sampling; smoothes edges - highp float visibility = 0.4; + highp float visibility = 0.6; for (int i = 0; i < 15; i++) { vec4 shadCoordsPD = shadCoords; shadCoordsPD.x += cos(poissonDisk[i].x) / shadowQuality; diff --git a/src/datavis3d/engine/shaders/shadowNoTex.frag b/src/datavis3d/engine/shaders/shadowNoTex.frag index b63075de..9ee20864 100644 --- a/src/datavis3d/engine/shaders/shadowNoTex.frag +++ b/src/datavis3d/engine/shaders/shadowNoTex.frag @@ -30,22 +30,22 @@ highp vec2 poissonDisk[16] = vec2[16](vec2(-0.94201624, -0.39906216), vec2(0.19984126, 0.78641367), vec2(0.14383161, -0.14100790)); -/*const highp vec2 poissonDisk[16] = vec2[](vec2(-0.25, -0.25), - vec2(0.25, -0.25), - vec2(-0.25, 0.25), - vec2(0.25, 0.25), - vec2(-0.5, -0.5), - vec2(0.5, -0.5), - vec2(-0.5, 0.5), - vec2(0.5, 0.5), - vec2(-0.75, -0.75), - vec2(0.75, -0.75), - vec2(-0.75, 0.75), - vec2(0.75, 0.75), - vec2(-1.0, -1.0), - vec2(1.0, -1.0), - vec2(-1.0, 1.0), - vec2(1.0, 1.0));*/ +/*highp vec2 poissonDisk[16] = vec2[16](vec2(-0.25, -0.25), + vec2(0.25, -0.25), + vec2(-0.25, 0.25), + vec2(0.25, 0.25), + vec2(-0.5, -0.5), + vec2(0.5, -0.5), + vec2(-0.5, 0.5), + vec2(0.5, 0.5), + vec2(-0.75, -0.75), + vec2(0.75, -0.75), + vec2(-0.75, 0.75), + vec2(0.75, 0.75), + vec2(-1.0, -1.0), + vec2(1.0, -1.0), + vec2(-1.0, 1.0), + vec2(1.0, 1.0));*/ /*float random(vec3 seed, int i) { vec4 seed4 = vec4(seed, i); @@ -75,7 +75,7 @@ void main() { // direct method; needs large shadow texture to look good //highp float visibility = 0.75 * shadow2DProj(shadowMap, shadCoords).r + 0.25; // poisson disk sampling; smoothes edges - highp float visibility = 0.4; + highp float visibility = 0.6; for (int i = 0; i < 15; i++) { vec4 shadCoordsPD = shadCoords; shadCoordsPD.x += cos(poissonDisk[i].x) / shadowQuality; diff --git a/src/datavis3d/engine/shaders/shadowNoTexColorOnY.frag b/src/datavis3d/engine/shaders/shadowNoTexColorOnY.frag index cea83786..957d2b0b 100644 --- a/src/datavis3d/engine/shaders/shadowNoTexColorOnY.frag +++ b/src/datavis3d/engine/shaders/shadowNoTexColorOnY.frag @@ -58,7 +58,7 @@ void main() { // direct method; needs large shadow texture to look good //highp float visibility = 0.75 * shadow2DProj(shadowMap, shadCoords).r + 0.25; // poisson disk sampling; smoothes edges - highp float visibility = 0.4; + highp float visibility = 0.6; for (int i = 0; i < 15; i++) { vec4 shadCoordsPD = shadCoords; shadCoordsPD.x += cos(poissonDisk[i].x) / shadowQuality; |