summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomi Korpipää <tomi.korpipaa@digia.com>2013-05-15 11:07:00 +0300
committerTomi Korpipää <tomi.korpipaa@digia.com>2013-05-16 07:53:05 +0300
commit6501768a433ec422263470b1a5c4bf8f6d6746b4 (patch)
tree6687572089277a4ad7282eef933d77b6ae35a383
parent547cbfd201056b88ab40d22959112e5486d0fd7a (diff)
Shadows improved
Fixed bugs. Change-Id: I7dc704387eb12d5dfec4bfb90ba4824a64e5d3d9 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com> Reviewed-by: Mika Salmela <mika.salmela@digia.com>
-rw-r--r--examples/mapdata/mapdata.cpp14
-rw-r--r--examples/widget/chart.cpp14
-rw-r--r--src/engine/q3dbars.cpp33
-rw-r--r--src/engine/q3dbars_p.h1
-rw-r--r--src/engine/q3dmaps.cpp54
-rw-r--r--src/engine/q3dmaps_p.h1
-rw-r--r--src/engine/shaders/fragmentShadow4
-rw-r--r--src/engine/shaders/fragmentShadowNoTex30
-rw-r--r--src/engine/shaders/fragmentShadowNoTexColorOnY4
-rw-r--r--src/global/qdatavis3namespace.h4
-rw-r--r--src/utils/shaderhelper.cpp8
-rw-r--r--src/utils/shaderhelper_p.h2
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;