summaryrefslogtreecommitdiffstats
path: root/src/datavis3d/engine
diff options
context:
space:
mode:
authorTomi Korpipää <tomi.korpipaa@digia.com>2013-09-02 09:35:09 +0300
committerTomi Korpipää <tomi.korpipaa@digia.com>2013-09-02 09:37:59 +0300
commit5299755440a19ab7c2e4fd2bc6ac0f39a7ee319b (patch)
treec71fa96578388a2a54fc064e751c1cdcc458c2a2 /src/datavis3d/engine
parent15f8c86385a055d35b07519e4bf8c8f1aa915ea3 (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.cpp40
-rw-r--r--src/datavis3d/engine/bars3drenderer_p.h1
-rw-r--r--src/datavis3d/engine/scatter3drenderer.cpp41
-rw-r--r--src/datavis3d/engine/scatter3drenderer_p.h1
-rw-r--r--src/datavis3d/engine/shaders/shadow.frag2
-rw-r--r--src/datavis3d/engine/shaders/shadowNoTex.frag34
-rw-r--r--src/datavis3d/engine/shaders/shadowNoTexColorOnY.frag2
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;