From 6501768a433ec422263470b1a5c4bf8f6d6746b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Wed, 15 May 2013 11:07:00 +0300 Subject: Shadows improved Fixed bugs. Change-Id: I7dc704387eb12d5dfec4bfb90ba4824a64e5d3d9 Reviewed-by: Miikka Heikkinen Reviewed-by: Mika Salmela --- examples/mapdata/mapdata.cpp | 14 ++++++- examples/widget/chart.cpp | 14 ++++++- src/engine/q3dbars.cpp | 33 ++++++++++++---- src/engine/q3dbars_p.h | 1 + src/engine/q3dmaps.cpp | 54 +++++++++++++++++++++----- src/engine/q3dmaps_p.h | 1 + src/engine/shaders/fragmentShadow | 4 +- src/engine/shaders/fragmentShadowNoTex | 30 +++++++++++++- src/engine/shaders/fragmentShadowNoTexColorOnY | 4 +- src/global/qdatavis3namespace.h | 4 +- src/utils/shaderhelper.cpp | 8 ++++ src/utils/shaderhelper_p.h | 2 + 12 files changed, 145 insertions(+), 24 deletions(-) diff --git a/examples/mapdata/mapdata.cpp b/examples/mapdata/mapdata.cpp index a991ed95..60d59f45 100644 --- a/examples/mapdata/mapdata.cpp +++ b/examples/mapdata/mapdata.cpp @@ -281,7 +281,19 @@ void MapsModifier::changeFontSize(int fontsize) void MapsModifier::changeShadowQuality(int quality) { - m_chart->setShadowQuality((ShadowQuality)quality); + ShadowQuality sq = ShadowNone; + switch (quality) { + case 1: + sq = ShadowLow; + break; + case 2: + sq = ShadowMedium; + break; + case 3: + sq = ShadowHigh; + break; + } + m_chart->setShadowQuality(sq); } //void MapsModifier::setGridEnabled(int enabled) diff --git a/examples/widget/chart.cpp b/examples/widget/chart.cpp index e90dd2ee..b5668ad1 100644 --- a/examples/widget/chart.cpp +++ b/examples/widget/chart.cpp @@ -237,7 +237,19 @@ void ChartModifier::changeFontSize(int fontsize) void ChartModifier::changeShadowQuality(int quality) { - m_chart->setShadowQuality((ShadowQuality)quality); + ShadowQuality sq = ShadowNone; + switch (quality) { + case 1: + sq = ShadowLow; + break; + case 2: + sq = ShadowMedium; + break; + case 3: + sq = ShadowHigh; + break; + } + m_chart->setShadowQuality(sq); } void ChartModifier::setGridEnabled(int enabled) diff --git a/src/engine/q3dbars.cpp b/src/engine/q3dbars.cpp index 4da60e78..df59920a 100644 --- a/src/engine/q3dbars.cpp +++ b/src/engine/q3dbars.cpp @@ -883,8 +883,10 @@ void Q3DBars::drawScene() if (d_ptr->m_shadowQuality > ShadowNone) { // Set shadow shader bindings - d_ptr->m_backgroundShader->setUniformValue(d_ptr->m_barShader->depth(), - depthMVPMatrix); + d_ptr->m_barShader->setUniformValue(d_ptr->m_barShader->shadowQ(), + d_ptr->m_shadowQualityToShader); + d_ptr->m_barShader->setUniformValue(d_ptr->m_barShader->depth(), + depthMVPMatrix); d_ptr->m_barShader->setUniformValue(d_ptr->m_barShader->lightS(), lightStrength / 10.0f); @@ -951,18 +953,20 @@ void Q3DBars::drawScene() if (d_ptr->m_shadowQuality > ShadowNone) { // Set shadow shader bindings + d_ptr->m_backgroundShader->setUniformValue(d_ptr->m_backgroundShader->shadowQ(), + d_ptr->m_shadowQualityToShader); d_ptr->m_backgroundShader->setUniformValue(d_ptr->m_backgroundShader->depth(), depthMVPMatrix); - d_ptr->m_barShader->setUniformValue(d_ptr->m_backgroundShader->lightS(), - d_ptr->m_theme->m_lightStrength / 10.0f); + d_ptr->m_backgroundShader->setUniformValue(d_ptr->m_backgroundShader->lightS(), + d_ptr->m_theme->m_lightStrength / 10.0f); // Draw the object d_ptr->m_drawer->drawObject(d_ptr->m_backgroundShader, d_ptr->m_backgroundObj, 0, d_ptr->m_depthTexture); } else { // Set shadowless shader bindings - d_ptr->m_barShader->setUniformValue(d_ptr->m_backgroundShader->lightS(), - d_ptr->m_theme->m_lightStrength); + d_ptr->m_backgroundShader->setUniformValue(d_ptr->m_backgroundShader->lightS(), + d_ptr->m_theme->m_lightStrength); // Draw the object d_ptr->m_drawer->drawObject(d_ptr->m_backgroundShader, d_ptr->m_backgroundObj); @@ -1577,6 +1581,20 @@ void Q3DBars::setGridEnabled(bool enable) void Q3DBars::setShadowQuality(ShadowQuality quality) { d_ptr->m_shadowQuality = quality; + switch (quality) { + case ShadowLow: + d_ptr->m_shadowQualityToShader = 33.3f; + break; + case ShadowMedium: + d_ptr->m_shadowQualityToShader = 66.7f; + break; + case ShadowHigh: + d_ptr->m_shadowQualityToShader = 100.0f; + break; + default: + d_ptr->m_shadowQualityToShader = 0.0f; + break; + } if (d_ptr->m_shadowQuality > ShadowNone) { // Re-init depth buffer d_ptr->initDepthBuffer(); @@ -1798,7 +1816,8 @@ Q3DBarsPrivate::Q3DBarsPrivate(Q3DBars *q) m_selectionDepthBuffer(0), m_updateLabels(false), m_gridEnabled(true), - m_shadowQuality(ShadowLow) + m_shadowQuality(ShadowLow), + m_shadowQualityToShader(33.3f) { m_dataSet->d_ptr->setDrawer(m_drawer); QObject::connect(m_drawer, &Drawer::drawerChanged, this, &Q3DBarsPrivate::updateTextures); diff --git a/src/engine/q3dbars_p.h b/src/engine/q3dbars_p.h index 2dcb3859..2623b695 100644 --- a/src/engine/q3dbars_p.h +++ b/src/engine/q3dbars_p.h @@ -170,6 +170,7 @@ public: bool m_updateLabels; bool m_gridEnabled; ShadowQuality m_shadowQuality; + GLfloat m_shadowQualityToShader; }; QTCOMMERCIALDATAVIS3D_END_NAMESPACE diff --git a/src/engine/q3dmaps.cpp b/src/engine/q3dmaps.cpp index 878004a1..820fc4f4 100644 --- a/src/engine/q3dmaps.cpp +++ b/src/engine/q3dmaps.cpp @@ -599,8 +599,10 @@ void Q3DMaps::drawScene() if (d_ptr->m_shadowQuality > ShadowNone) { // Set shadow shader bindings - d_ptr->m_backgroundShader->setUniformValue(d_ptr->m_barShader->depth(), - depthMVPMatrix); + d_ptr->m_barShader->setUniformValue(d_ptr->m_barShader->shadowQ(), + d_ptr->m_shadowQualityToShader); + d_ptr->m_barShader->setUniformValue(d_ptr->m_barShader->depth(), + depthMVPMatrix); d_ptr->m_barShader->setUniformValue(d_ptr->m_barShader->lightS(), lightStrength / 10.0f); @@ -649,16 +651,30 @@ void Q3DMaps::drawScene() d_ptr->m_backgroundShader->setUniformValue(d_ptr->m_backgroundShader->nModel(), modelMatrix.inverted().transposed()); d_ptr->m_backgroundShader->setUniformValue(d_ptr->m_backgroundShader->MVP(), MVPMatrix); - d_ptr->m_backgroundShader->setUniformValue(d_ptr->m_backgroundShader->depth(), - depthMVPMatrix); - d_ptr->m_backgroundShader->setUniformValue(d_ptr->m_backgroundShader->lightS(), - d_ptr->m_theme->m_lightStrength / 5.0f); d_ptr->m_backgroundShader->setUniformValue(d_ptr->m_backgroundShader->ambientS(), d_ptr->m_theme->m_ambientStrength * 3.0f); - // Draw the object - d_ptr->m_drawer->drawObject(d_ptr->m_backgroundShader, d_ptr->m_backgroundObj, - d_ptr->m_bgrTexture, d_ptr->m_depthTexture); + if (d_ptr->m_shadowQuality > ShadowNone) { + // Set shadow shader bindings + d_ptr->m_backgroundShader->setUniformValue(d_ptr->m_backgroundShader->shadowQ(), + d_ptr->m_shadowQualityToShader); + d_ptr->m_backgroundShader->setUniformValue(d_ptr->m_backgroundShader->depth(), + depthMVPMatrix); + d_ptr->m_backgroundShader->setUniformValue(d_ptr->m_backgroundShader->lightS(), + d_ptr->m_theme->m_lightStrength / 5.0f); + + // Draw the object + d_ptr->m_drawer->drawObject(d_ptr->m_backgroundShader, d_ptr->m_backgroundObj, + d_ptr->m_bgrTexture, d_ptr->m_depthTexture); + } else { + // Set shadowless shader bindings + d_ptr->m_backgroundShader->setUniformValue(d_ptr->m_backgroundShader->lightS(), + d_ptr->m_theme->m_lightStrength); + + // Draw the object + d_ptr->m_drawer->drawObject(d_ptr->m_backgroundShader, d_ptr->m_backgroundObj, + d_ptr->m_bgrTexture); + } } // Disable textures @@ -1335,6 +1351,23 @@ void Q3DMaps::setImage(const QImage &image) void Q3DMaps::setShadowQuality(ShadowQuality quality) { d_ptr->m_shadowQuality = quality; + switch (quality) { + case ShadowLow: + qDebug() << "ShadowLow"; + d_ptr->m_shadowQualityToShader = 33.3f; + break; + case ShadowMedium: + qDebug() << "ShadowMedium"; + d_ptr->m_shadowQualityToShader = 66.7f; + break; + case ShadowHigh: + qDebug() << "ShadowHigh"; + d_ptr->m_shadowQualityToShader = 100.0f; + break; + default: + d_ptr->m_shadowQualityToShader = 0.0f; + break; + } if (d_ptr->m_shadowQuality > ShadowNone) { // Re-init depth buffer d_ptr->initDepthBuffer(); @@ -1409,7 +1442,8 @@ Q3DMapsPrivate::Q3DMapsPrivate(Q3DMaps *q) m_areaSize(QSizeF(1.0f, 1.0f)), m_updateLabels(true), m_gridEnabled(true), - m_shadowQuality(ShadowLow) + m_shadowQuality(ShadowLow), + m_shadowQualityToShader(33.3f) { //m_data->d_ptr->setDrawer(m_drawer); //QObject::connect(m_drawer, &Drawer::drawerChanged, this, &Q3DMapsPrivate::updateTextures); diff --git a/src/engine/q3dmaps_p.h b/src/engine/q3dmaps_p.h index 8fdd600e..f02ebc36 100644 --- a/src/engine/q3dmaps_p.h +++ b/src/engine/q3dmaps_p.h @@ -163,6 +163,7 @@ public: bool m_gridEnabled; Q3DMaps::AdjustmentDirection m_adjustDirection; ShadowQuality m_shadowQuality; + GLfloat m_shadowQualityToShader; }; QTCOMMERCIALDATAVIS3D_END_NAMESPACE diff --git a/src/engine/shaders/fragmentShadow b/src/engine/shaders/fragmentShadow index 143da625..3a6ffc5a 100644 --- a/src/engine/shaders/fragmentShadow +++ b/src/engine/shaders/fragmentShadow @@ -3,6 +3,7 @@ uniform highp float lightStrength; uniform highp float ambientStrength; +uniform highp float shadowQuality; uniform highp sampler2D textureSampler; uniform highp sampler2DShadow shadowMap; // use with version 2 //uniform highp sampler2D shadowMap; // use with version 1 @@ -118,7 +119,8 @@ void main() { highp float visibility = 0.2; for (int i = 0; i < 15; i++) { vec4 shadCoordsPD = shadCoords; - shadCoordsPD.xy += poissonDisk[i] / 100.0; + shadCoordsPD.x += cos(poissonDisk[i].x) / shadowQuality; + shadCoordsPD.y += sin(poissonDisk[i].y) / shadowQuality; visibility += 0.05 * shadow2DProj(shadowMap, shadCoordsPD).r; } // stratified poisson; produces noise but hides pixel edges well diff --git a/src/engine/shaders/fragmentShadowNoTex b/src/engine/shaders/fragmentShadowNoTex index ff08ea51..31efbf63 100644 --- a/src/engine/shaders/fragmentShadowNoTex +++ b/src/engine/shaders/fragmentShadowNoTex @@ -3,6 +3,7 @@ uniform highp float lightStrength; uniform highp float ambientStrength; +uniform highp float shadowQuality; uniform highp vec3 color_mdl; uniform highp sampler2DShadow shadowMap; // use with version 2 //uniform highp sampler2D shadowMap; // use with version 1 @@ -31,6 +32,23 @@ const highp vec2 poissonDisk[16] = vec2[](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));*/ + /*float random(vec3 seed, int i) { vec4 seed4 = vec4(seed, i); float dot_product = dot(seed4, vec4(12.9898, 78.233, 45.164, 94.673)); @@ -108,7 +126,17 @@ void main() { highp float visibility = 0.2; for (int i = 0; i < 15; i++) { vec4 shadCoordsPD = shadCoords; - shadCoordsPD.xy += poissonDisk[i] / 100.0; + shadCoordsPD.x += cos(poissonDisk[i].x) / shadowQuality; + shadCoordsPD.y += sin(poissonDisk[i].y) / shadowQuality; + // good for low shadow quality + //shadCoordsPD.x += cos(poissonDisk[i].x) / 33.3; + //shadCoordsPD.y += sin(poissonDisk[i].y) / 33.3; + // good for medium shadow quality + //shadCoordsPD.x += cos(poissonDisk[i].x) / 66.7; + //shadCoordsPD.y += sin(poissonDisk[i].y) / 66.7; + // good for high shadow quality + //shadCoordsPD.x += cos(poissonDisk[i].x) / 100; + //shadCoordsPD.y += sin(poissonDisk[i].y) / 100; visibility += 0.05 * shadow2DProj(shadowMap, shadCoordsPD).r; } // stratified poisson; produces noise but hides pixel edges well diff --git a/src/engine/shaders/fragmentShadowNoTexColorOnY b/src/engine/shaders/fragmentShadowNoTexColorOnY index 0177abe3..d208c5fd 100644 --- a/src/engine/shaders/fragmentShadowNoTexColorOnY +++ b/src/engine/shaders/fragmentShadowNoTexColorOnY @@ -3,6 +3,7 @@ uniform highp float lightStrength; uniform highp float ambientStrength; +uniform highp float shadowQuality; uniform highp vec3 color_mdl; uniform highp sampler2DShadow shadowMap; // use with version 2 //uniform highp sampler2D shadowMap; // use with version 1 @@ -108,7 +109,8 @@ void main() { highp float visibility = 0.2; for (int i = 0; i < 15; i++) { vec4 shadCoordsPD = shadCoords; - shadCoordsPD.xy += poissonDisk[i] / 100.0; + shadCoordsPD.x += cos(poissonDisk[i].x) / shadowQuality; + shadCoordsPD.y += sin(poissonDisk[i].y) / shadowQuality; visibility += 0.05 * shadow2DProj(shadowMap, shadCoordsPD).r; } /*for (int i = 0; i < 15; i++) { diff --git a/src/global/qdatavis3namespace.h b/src/global/qdatavis3namespace.h index de598f9a..341aceae 100644 --- a/src/global/qdatavis3namespace.h +++ b/src/global/qdatavis3namespace.h @@ -132,8 +132,8 @@ enum LabelPosition { enum ShadowQuality { ShadowNone = 0, ShadowLow = 1, - ShadowMedium = 5, // TODO: Find out good values for these - ShadowHigh = 10 // TODO: Find out good values for these + ShadowMedium = 3, // TODO: Find out good values for these + ShadowHigh = 5 // TODO: Find out good values for these }; QTCOMMERCIALDATAVIS3D_END_NAMESPACE diff --git a/src/utils/shaderhelper.cpp b/src/utils/shaderhelper.cpp index 82405cba..a66b6a00 100644 --- a/src/utils/shaderhelper.cpp +++ b/src/utils/shaderhelper.cpp @@ -101,6 +101,7 @@ void ShaderHelper::initialize() m_lightPositionUniform = m_program->uniformLocation("lightPosition_wrld"); m_lightStrengthUniform = m_program->uniformLocation("lightStrength"); m_ambientStrengthUniform = m_program->uniformLocation("ambientStrength"); + m_shadowQualityUniform = m_program->uniformLocation("shadowQuality"); m_colorUniform = m_program->uniformLocation("color_mdl"); m_textureUniform = m_program->uniformLocation("textureSampler"); m_shadowUniform = m_program->uniformLocation("shadowMap"); @@ -199,6 +200,13 @@ GLuint ShaderHelper::ambientS() return m_ambientStrengthUniform; } +GLuint ShaderHelper::shadowQ() +{ + if (!m_initialized) + qFatal("Shader not initialized"); + return m_shadowQualityUniform; +} + GLuint ShaderHelper::color() { if (!m_initialized) diff --git a/src/utils/shaderhelper_p.h b/src/utils/shaderhelper_p.h index 68a98e16..83e8b981 100644 --- a/src/utils/shaderhelper_p.h +++ b/src/utils/shaderhelper_p.h @@ -89,6 +89,7 @@ class ShaderHelper GLuint lightP(); GLuint lightS(); GLuint ambientS(); + GLuint shadowQ(); GLuint color(); GLuint texture(); GLuint shadow(); @@ -120,6 +121,7 @@ class ShaderHelper GLuint m_lightPositionUniform; GLuint m_lightStrengthUniform; GLuint m_ambientStrengthUniform; + GLuint m_shadowQualityUniform; GLuint m_textureUniform; GLuint m_shadowUniform; -- cgit v1.2.3