From 7132e31f51a9ce79ddcbe780e2ef827d551c1f63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Wed, 6 Nov 2013 13:45:09 +0200 Subject: ES2 support for scatter points Task-number: QTRD-2539 Change-Id: I2465322d9a4341ce4c345756fe085a4c5ad2be5b Reviewed-by: Miikka Heikkinen --- src/datavisualization/engine/engine.qrc | 1 + .../engine/scatter3dcontroller.cpp | 3 ++ src/datavisualization/engine/scatter3drenderer.cpp | 52 +++++++++++++++++----- src/datavisualization/engine/scatter3drenderer_p.h | 5 +++ .../engine/shaders/point_ES2.vert | 8 ++++ 5 files changed, 58 insertions(+), 11 deletions(-) create mode 100644 src/datavisualization/engine/shaders/point_ES2.vert (limited to 'src') diff --git a/src/datavisualization/engine/engine.qrc b/src/datavisualization/engine/engine.qrc index de4a04da..14fb1bc6 100644 --- a/src/datavisualization/engine/engine.qrc +++ b/src/datavisualization/engine/engine.qrc @@ -56,6 +56,7 @@ shaders/surfaceFlat.vert shaders/surfaceFlat.frag shaders/surface_ES2.frag + shaders/point_ES2.vert diff --git a/src/datavisualization/engine/scatter3dcontroller.cpp b/src/datavisualization/engine/scatter3dcontroller.cpp index 065f1f02..0786ad18 100644 --- a/src/datavisualization/engine/scatter3dcontroller.cpp +++ b/src/datavisualization/engine/scatter3dcontroller.cpp @@ -203,6 +203,9 @@ void Scatter3DController::setObjectType(QDataVis::MeshStyle style, bool smooth) objFile = QStringLiteral(":/defaultMeshes/dot"); } else { objFile = QString(); +#if defined(QT_OPENGL_ES_2) + qWarning("MeshStylePoints is not fully supported on OpenGL ES2"); +#endif } Abstract3DController::setMeshFileName(objFile); } diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 70c7e107..3ebbbf74 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -58,6 +58,9 @@ Scatter3DRenderer::Scatter3DRenderer(Scatter3DController *controller) m_yFlipped(false), m_updateLabels(false), m_dotShader(0), + #if defined(QT_OPENGL_ES_2) + m_pointShader(0), + #endif m_depthShader(0), m_selectionShader(0), m_backgroundShader(0), @@ -115,6 +118,9 @@ void Scatter3DRenderer::initializeOpenGL() #if !defined(QT_OPENGL_ES_2) // Init depth shader (for shadows). Init in any case, easier to handle shadow activation if done via api. initDepthShader(); +#else + // Init point shader + initPointShader(); #endif // Init selection shader @@ -274,13 +280,14 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) QMatrix4x4 depthProjectionMatrix; QMatrix4x4 depthProjectionViewMatrix; +#if !defined(QT_OPENGL_ES_2) if (m_drawingPoints) { glEnable(GL_POINT_SMOOTH); glEnable(GL_PROGRAM_POINT_SIZE); - glPointSize(m_dotSizeScale * 100.0f); // Don't scale points based on zoom for shadows + // Scale points based on shadow quality for shadows, not by zoom level + glPointSize(m_dotSizeScale * 100.0f * m_shadowQualityMultiplier); } -#if !defined(QT_OPENGL_ES_2) if (m_cachedShadowQuality > QDataVis::ShadowQualityNone) { // Render scene into a depth texture for using with shadow mapping // Bind depth shader @@ -392,16 +399,24 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) m_labelShader->release(); #endif } -#endif if (m_drawingPoints) glPointSize(m_dotSizeScale * activeCamera->zoomLevel()); // Scale points based on zoom + ShaderHelper *selectionShader = m_selectionShader; +#else + ShaderHelper *selectionShader; + if (m_drawingPoints) + selectionShader = m_pointShader; + else + selectionShader = m_selectionShader; +#endif + // Skip selection mode drawing if we have no selection mode if (m_cachedSelectionMode > QDataVis::SelectionNone && QDataVis::InputStateOnScene == m_inputState) { // Bind selection shader - m_selectionShader->bind(); + selectionShader->bind(); // Draw dots to selection buffer glBindFramebuffer(GL_FRAMEBUFFER, m_selectionFrameBuffer); @@ -435,16 +450,16 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) QVector3D dotColor = indexToSelectionColor(dot); dotColor /= 255.0f; - m_selectionShader->setUniformValue(m_selectionShader->MVP(), MVPMatrix); - m_selectionShader->setUniformValue(m_selectionShader->color(), dotColor); + selectionShader->setUniformValue(selectionShader->MVP(), MVPMatrix); + selectionShader->setUniformValue(selectionShader->color(), dotColor); if (m_drawingPoints) { - m_drawer->drawPoint(m_selectionShader); + m_drawer->drawPoint(selectionShader); } else { // 1st attribute buffer : vertices - glEnableVertexAttribArray(m_selectionShader->posAtt()); + glEnableVertexAttribArray(selectionShader->posAtt()); glBindBuffer(GL_ARRAY_BUFFER, m_dotObj->vertexBuf()); - glVertexAttribPointer(m_selectionShader->posAtt(), 3, GL_FLOAT, GL_FALSE, 0, (void *)0); + glVertexAttribPointer(selectionShader->posAtt(), 3, GL_FLOAT, GL_FALSE, 0, (void *)0); // Index buffer glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_dotObj->elementBuf()); @@ -456,7 +471,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); glBindBuffer(GL_ARRAY_BUFFER, 0); - glDisableVertexAttribArray(m_selectionShader->posAtt()); + glDisableVertexAttribArray(selectionShader->posAtt()); } } glEnable(GL_DITHER); @@ -473,7 +488,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) glBindFramebuffer(GL_FRAMEBUFFER, defaultFboHandle); // Release selection shader - m_selectionShader->release(); + selectionShader->release(); #if 0 // Use this if you want to see what is being drawn to the framebuffer m_labelShader->bind(); @@ -507,7 +522,11 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) glEnable(GL_TEXTURE_2D); } else { // We can use selection shader for points +#if !defined(QT_OPENGL_ES_2) dotShader = m_selectionShader; +#else + dotShader = m_pointShader; +#endif dotShader->bind(); } @@ -604,11 +623,13 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) // Release dot shader dotShader->release(); +#if !defined(QT_OPENGL_ES_2) if (m_drawingPoints) { glDisable(GL_POINT_SMOOTH); glDisable(GL_PROGRAM_POINT_SIZE); glEnable(GL_TEXTURE_2D); // Enable texturing for background } +#endif // Bind background shader m_backgroundShader->bind(); @@ -1564,6 +1585,15 @@ void Scatter3DRenderer::updateDepthBuffer() lowerShadowQuality(); } } +#else +void Scatter3DRenderer::initPointShader() +{ + if (m_pointShader) + delete m_pointShader; + m_pointShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertexPointES2"), + QStringLiteral(":/shaders/fragmentSelection")); + m_pointShader->initialize(); +} #endif void Scatter3DRenderer::initBackgroundShaders(const QString &vertexShader, diff --git a/src/datavisualization/engine/scatter3drenderer_p.h b/src/datavisualization/engine/scatter3drenderer_p.h index 36492e80..b74f2118 100644 --- a/src/datavisualization/engine/scatter3drenderer_p.h +++ b/src/datavisualization/engine/scatter3drenderer_p.h @@ -60,6 +60,9 @@ private: QRect m_mainViewPort; bool m_updateLabels; ShaderHelper *m_dotShader; +#if defined(QT_OPENGL_ES_2) + ShaderHelper *m_pointShader; +#endif ShaderHelper *m_depthShader; ShaderHelper *m_selectionShader; ShaderHelper *m_backgroundShader; @@ -122,6 +125,8 @@ private: #if !defined(QT_OPENGL_ES_2) void initDepthShader(); void updateDepthBuffer(); +#else + void initPointShader(); #endif void calculateTranslation(ScatterRenderItem &item); void calculateSceneScalingFactors(); diff --git a/src/datavisualization/engine/shaders/point_ES2.vert b/src/datavisualization/engine/shaders/point_ES2.vert new file mode 100644 index 00000000..b2dfdd7b --- /dev/null +++ b/src/datavisualization/engine/shaders/point_ES2.vert @@ -0,0 +1,8 @@ +uniform highp mat4 MVP; + +attribute highp vec3 vertexPosition_mdl; + +void main() { + gl_PointSize = 5.0; + gl_Position = MVP * vec4(vertexPosition_mdl, 1.0); +} -- cgit v1.2.3