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 | |
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>
-rw-r--r-- | examples/scatterchart/main.cpp | 3 | ||||
-rw-r--r-- | examples/scatterchart/scatterchart.cpp | 29 | ||||
-rw-r--r-- | examples/widget/chart.cpp | 29 | ||||
-rw-r--r-- | examples/widget/main.cpp | 5 | ||||
-rw-r--r-- | src/datavis3d/datavis3d.pro | 3 | ||||
-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 | ||||
-rw-r--r-- | src/datavis3d/global/qdatavis3denums.h | 9 | ||||
-rw-r--r-- | src/datavis3d/global/qtdatavis3denums.qdoc | 6 |
14 files changed, 121 insertions, 84 deletions
diff --git a/examples/scatterchart/main.cpp b/examples/scatterchart/main.cpp index c94e1cd6..b0135ef3 100644 --- a/examples/scatterchart/main.cpp +++ b/examples/scatterchart/main.cpp @@ -111,6 +111,9 @@ int main(int argc, char **argv) shadowQuality->addItem(QStringLiteral("Low")); shadowQuality->addItem(QStringLiteral("Medium")); shadowQuality->addItem(QStringLiteral("High")); + shadowQuality->addItem(QStringLiteral("Low Soft")); + shadowQuality->addItem(QStringLiteral("Medium Soft")); + shadowQuality->addItem(QStringLiteral("High Soft")); shadowQuality->setCurrentIndex(3); QFontComboBox *fontList = new QFontComboBox(widget); diff --git a/examples/scatterchart/scatterchart.cpp b/examples/scatterchart/scatterchart.cpp index 92b99652..aab230f2 100644 --- a/examples/scatterchart/scatterchart.cpp +++ b/examples/scatterchart/scatterchart.cpp @@ -160,20 +160,8 @@ void ScatterDataModifier::changeFontSize(int fontsize) void ScatterDataModifier::shadowQualityUpdatedByVisual(QDataVis::ShadowQuality sq) { - int quality = 0; - switch (sq) { - case QDataVis::ShadowLow: - quality = 1; - break; - case QDataVis::ShadowMedium: - quality = 2; - break; - case QDataVis::ShadowHigh: - quality = 3; - break; - } - - // Updates the UI component to show correct shadow quality + int quality = int(sq); + // Updates the UI component to show correct shadow quality emit shadowQualityChanged(quality); } @@ -318,18 +306,7 @@ void ScatterDataModifier::handleSelectionChange(int index) void ScatterDataModifier::changeShadowQuality(int quality) { - QDataVis::ShadowQuality sq = QDataVis::ShadowNone; - switch (quality) { - case 1: - sq = QDataVis::ShadowLow; - break; - case 2: - sq = QDataVis::ShadowMedium; - break; - case 3: - sq = QDataVis::ShadowHigh; - break; - } + QDataVis::ShadowQuality sq = QDataVis::ShadowQuality(quality); m_chart->setShadowQuality(sq); emit shadowQualityChanged(quality); } diff --git a/examples/widget/chart.cpp b/examples/widget/chart.cpp index 7468ec0d..106fd2d6 100644 --- a/examples/widget/chart.cpp +++ b/examples/widget/chart.cpp @@ -114,6 +114,8 @@ ChartModifier::ChartModifier(Q3DBars *barchart) m_chart->addAxis(m_genericRowAxis); m_chart->addAxis(m_genericColumnAxis); + m_chart->setShadowQuality(QDataVis::ShadowSoftMedium); + m_temperatureData->setItemLabelFormat(QStringLiteral("@valueTitle for @colLabel @rowLabel: @valueLabel")); m_genericData->setItemLabelFormat(QStringLiteral("@valueTitle for (@rowIdx, @colIdx): @valueLabel")); @@ -436,19 +438,7 @@ void ChartModifier::changeFontSize(int fontsize) void ChartModifier::shadowQualityUpdatedByVisual(QDataVis::ShadowQuality sq) { - int quality = 0; - switch (sq) { - case QDataVis::ShadowLow: - quality = 1; - break; - case QDataVis::ShadowMedium: - quality = 2; - break; - case QDataVis::ShadowHigh: - quality = 3; - break; - } - + int quality = int(sq); // Updates the UI component to show correct shadow quality emit shadowQualityChanged(quality); } @@ -461,18 +451,7 @@ void ChartModifier::handleSelectionChange(const QPoint &position) void ChartModifier::changeShadowQuality(int quality) { - QDataVis::ShadowQuality sq = QDataVis::ShadowNone; - switch (quality) { - case 1: - sq = QDataVis::ShadowLow; - break; - case 2: - sq = QDataVis::ShadowMedium; - break; - case 3: - sq = QDataVis::ShadowHigh; - break; - } + QDataVis::ShadowQuality sq = QDataVis::ShadowQuality(quality); m_chart->setShadowQuality(sq); emit shadowQualityChanged(quality); } diff --git a/examples/widget/main.cpp b/examples/widget/main.cpp index a774c0e8..98d2dbbd 100644 --- a/examples/widget/main.cpp +++ b/examples/widget/main.cpp @@ -181,7 +181,10 @@ int main(int argc, char **argv) shadowQuality->addItem(QStringLiteral("Low")); shadowQuality->addItem(QStringLiteral("Medium")); shadowQuality->addItem(QStringLiteral("High")); - shadowQuality->setCurrentIndex(2); + shadowQuality->addItem(QStringLiteral("Low Soft")); + shadowQuality->addItem(QStringLiteral("Medium Soft")); + shadowQuality->addItem(QStringLiteral("High Soft")); + shadowQuality->setCurrentIndex(5); vLayout->addWidget(staticCheckBox, 0, Qt::AlignTop); vLayout->addWidget(rotationCheckBox, 0, Qt::AlignTop); diff --git a/src/datavis3d/datavis3d.pro b/src/datavis3d/datavis3d.pro index 449ec14c..1f0118f0 100644 --- a/src/datavis3d/datavis3d.pro +++ b/src/datavis3d/datavis3d.pro @@ -27,5 +27,6 @@ wince* { OTHER_FILES += doc/qtdatavis3d.qdocconf \ doc/src/* \ doc/images/* \ - doc/snippets/* + doc/snippets/* \ + global/*.qdoc 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; diff --git a/src/datavis3d/global/qdatavis3denums.h b/src/datavis3d/global/qdatavis3denums.h index e337430e..a8f6d6a2 100644 --- a/src/datavis3d/global/qdatavis3denums.h +++ b/src/datavis3d/global/qdatavis3denums.h @@ -107,9 +107,12 @@ public: enum ShadowQuality { ShadowNone = 0, - ShadowLow = 1, - ShadowMedium = 3, - ShadowHigh = 5 + ShadowLow, + ShadowMedium, + ShadowHigh, + ShadowSoftLow, + ShadowSoftMedium, + ShadowSoftHigh }; enum LabelTransparency { diff --git a/src/datavis3d/global/qtdatavis3denums.qdoc b/src/datavis3d/global/qtdatavis3denums.qdoc index c9d6c03f..015b1803 100644 --- a/src/datavis3d/global/qtdatavis3denums.qdoc +++ b/src/datavis3d/global/qtdatavis3denums.qdoc @@ -154,6 +154,12 @@ Shadows are rendered in medium quality. \value ShadowHigh Shadows are rendered in high quality. + \value ShadowSoftLow + Shadows are rendered in low quality with softened edges. + \value ShadowSoftMedium + Shadows are rendered in medium quality with softened edges. + \value ShadowSoftHigh + Shadows are rendered in high quality with softened edges. */ /*! |