diff options
Diffstat (limited to 'src/render')
-rw-r--r-- | src/render/defaults/defaults.pri | 7 | ||||
-rw-r--r-- | src/render/defaults/qpervertexcolormaterial.cpp | 152 | ||||
-rw-r--r-- | src/render/defaults/qpervertexcolormaterial.h | 65 | ||||
-rw-r--r-- | src/render/defaults/qpervertexcolormaterial_p.h | 82 | ||||
-rw-r--r-- | src/render/render.qrc | 6 | ||||
-rw-r--r-- | src/render/shaders/es2/pervertexcolor.frag | 25 | ||||
-rw-r--r-- | src/render/shaders/es2/pervertexcolor.vert | 20 | ||||
-rw-r--r-- | src/render/shaders/gl3/pervertexcolor.frag | 29 | ||||
-rw-r--r-- | src/render/shaders/gl3/pervertexcolor.vert | 22 | ||||
-rw-r--r-- | src/render/shaders/pervertexcolor.frag | 29 | ||||
-rw-r--r-- | src/render/shaders/pervertexcolor.vert | 22 |
11 files changed, 457 insertions, 2 deletions
diff --git a/src/render/defaults/defaults.pri b/src/render/defaults/defaults.pri index e631dbbab..9657f3a88 100644 --- a/src/render/defaults/defaults.pri +++ b/src/render/defaults/defaults.pri @@ -14,7 +14,9 @@ HEADERS += \ $$PWD/qdiffusespecularmapmaterial.h \ $$PWD/qdiffusespecularmapmaterial_p.h \ $$PWD/qforwardrenderer.h \ - $$PWD/qforwardrenderer_p.h + $$PWD/qforwardrenderer_p.h \ + $$PWD/qpervertexcolormaterial.h \ + $$PWD/qpervertexcolormaterial_p.h SOURCES += \ $$PWD/qphongmaterial.cpp \ @@ -23,4 +25,5 @@ SOURCES += \ $$PWD/qnormaldiffusemapmaterial.cpp \ $$PWD/qnormaldiffusemapalphamaterial.cpp \ $$PWD/qdiffusespecularmapmaterial.cpp \ - $$PWD/qforwardrenderer.cpp + $$PWD/qforwardrenderer.cpp \ + $$PWD/qpervertexcolormaterial.cpp diff --git a/src/render/defaults/qpervertexcolormaterial.cpp b/src/render/defaults/qpervertexcolormaterial.cpp new file mode 100644 index 000000000..a86940a2d --- /dev/null +++ b/src/render/defaults/qpervertexcolormaterial.cpp @@ -0,0 +1,152 @@ +/**************************************************************************** +** +** Copyright (C) 2015 Lorenz Esch (TU Ilmenau). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qpervertexcolormaterial.h" +#include "qpervertexcolormaterial_p.h" +#include <Qt3DRenderer/qmaterial.h> +#include <Qt3DRenderer/qeffect.h> +#include <Qt3DRenderer/qtechnique.h> +#include <Qt3DRenderer/qshaderprogram.h> +#include <Qt3DRenderer/qparameter.h> +#include <Qt3DRenderer/qrenderpass.h> +#include <Qt3DRenderer/qopenglfilter.h> +#include <QUrl> +#include <QVector3D> +#include <QVector4D> + +QT_BEGIN_NAMESPACE + +namespace Qt3D { + +QPerVertexColorMaterialPrivate::QPerVertexColorMaterialPrivate(QPerVertexColorMaterial *qq) + : QMaterialPrivate(qq) + , m_vertexEffect(new QEffect()) + , m_lightPositionParameter(new QParameter(QStringLiteral("lightPosition"), QVector4D(1.0f, 1.0f, 0.0f, 1.0f))) + , m_lightIntensityParameter(new QParameter(QStringLiteral("lightIntensity"), QVector3D(1.0f, 1.0f, 1.0f))) + , m_vertexGL3Technique(new QTechnique()) + , m_vertexGL2Technique(new QTechnique()) + , m_vertexES2Technique(new QTechnique()) + , m_vertexGL3RenderPass(new QRenderPass()) + , m_vertexGL2RenderPass(new QRenderPass()) + , m_vertexES2RenderPass(new QRenderPass()) + , m_vertexGL3Shader(new QShaderProgram()) + , m_vertexGL2ES2Shader(new QShaderProgram()) +{ +} + +/*! + \class Qt3D::QPerVertexColorMaterial + \brief The QPerVertexColorMaterial class provides a default implementation for rendering the color properties set for each vertex. + \inmodule Qt3DRender + \since 5.5 + + This lighting effect is based on the combination of 2 lighting components ambient and diffuse. Ambient is set by the vertex color. + Diffuse takes in account the normal distribution of each vertex. + + \list + \li Ambient is the color that is emitted by an object without any other light source. + \li Diffuse is the color that is emitted for rough surface reflections with the lights + \endlist + + This material uses an effect with a single render pass approach and forms fragment lighting. + Techniques are provided for OpenGL 2, OpenGL 3 or above as well as OpenGL ES 2. +*/ + +/*! + \fn Qt3D::QPerVertexColorMaterial::QPerVertexColorMaterial(QNode *parent) + + Constructs a new QPerVertexColorMaterial instance with parent object \a parent. +*/ +QPerVertexColorMaterial::QPerVertexColorMaterial(QNode *parent) + : QMaterial(*new QPerVertexColorMaterialPrivate(this), parent) +{ + Q_D(QPerVertexColorMaterial); + d->init(); +} + +/*! + \fn Qt3D::QPerVertexColorMaterial::~QPerVertexColorMaterial() + + Destroys the QPerVertexColorMaterial +*/ +QPerVertexColorMaterial::~QPerVertexColorMaterial() +{ +} + +// TODO: Define how lights are proties are set in the shaders. Ideally using a QShaderData +void QPerVertexColorMaterialPrivate::init() +{ + m_vertexGL3Shader->setVertexShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/gl3/pervertexcolor.vert")))); + m_vertexGL3Shader->setFragmentShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/gl3/pervertexcolor.frag")))); + m_vertexGL2ES2Shader->setVertexShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/es2/pervertexcolor.vert")))); + m_vertexGL2ES2Shader->setFragmentShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/es2/pervertexcolor.frag")))); + + m_vertexGL3Technique->openGLFilter()->setApi(QOpenGLFilter::Desktop); + m_vertexGL3Technique->openGLFilter()->setMajorVersion(3); + m_vertexGL3Technique->openGLFilter()->setMinorVersion(1); + m_vertexGL3Technique->openGLFilter()->setProfile(QOpenGLFilter::Core); + + m_vertexGL2Technique->openGLFilter()->setApi(QOpenGLFilter::Desktop); + m_vertexGL2Technique->openGLFilter()->setMajorVersion(2); + m_vertexGL2Technique->openGLFilter()->setMinorVersion(0); + m_vertexGL2Technique->openGLFilter()->setProfile(QOpenGLFilter::None); + + m_vertexES2Technique->openGLFilter()->setApi(QOpenGLFilter::ES); + m_vertexES2Technique->openGLFilter()->setMajorVersion(2); + m_vertexES2Technique->openGLFilter()->setMinorVersion(0); + m_vertexES2Technique->openGLFilter()->setProfile(QOpenGLFilter::None); + + m_vertexGL3RenderPass->setShaderProgram(m_vertexGL3Shader); + m_vertexGL2RenderPass->setShaderProgram(m_vertexGL2ES2Shader); + m_vertexES2RenderPass->setShaderProgram(m_vertexGL2ES2Shader); + + m_vertexGL3Technique->addPass(m_vertexGL3RenderPass); + m_vertexGL2Technique->addPass(m_vertexGL2RenderPass); + m_vertexES2Technique->addPass(m_vertexES2RenderPass); + + m_vertexEffect->addTechnique(m_vertexGL3Technique); + m_vertexEffect->addTechnique(m_vertexGL2Technique); + m_vertexEffect->addTechnique(m_vertexES2Technique); + + m_vertexEffect->addParameter(m_lightPositionParameter); + m_vertexEffect->addParameter(m_lightIntensityParameter); + + static_cast<QMaterial *>(q_ptr)->setEffect(m_vertexEffect); +} + +} // Qt3D + +QT_END_NAMESPACE diff --git a/src/render/defaults/qpervertexcolormaterial.h b/src/render/defaults/qpervertexcolormaterial.h new file mode 100644 index 000000000..d0e17c722 --- /dev/null +++ b/src/render/defaults/qpervertexcolormaterial.h @@ -0,0 +1,65 @@ +/**************************************************************************** +** +** Copyright (C) 2015 Lorenz Esch (TU Ilmenau). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QT3D_RENDER_QPERVERTEXCOLORMATERIAL_H +#define QT3D_RENDER_QPERVERTEXCOLORMATERIAL_H + +#include <Qt3DRenderer/qmaterial.h> +#include <QColor> + +QT_BEGIN_NAMESPACE + +namespace Qt3D { + +class QPerVertexColorMaterialPrivate; + +class QT3DRENDERERSHARED_EXPORT QPerVertexColorMaterial : public QMaterial +{ + Q_OBJECT + +public: + explicit QPerVertexColorMaterial(QNode *parent = 0); + ~QPerVertexColorMaterial(); + +private: + Q_DECLARE_PRIVATE(QPerVertexColorMaterial) +}; + +} // Qt3D + +QT_END_NAMESPACE + +#endif // QT3D_RENDER_QPERVERTEXCOLORMATERIAL_H diff --git a/src/render/defaults/qpervertexcolormaterial_p.h b/src/render/defaults/qpervertexcolormaterial_p.h new file mode 100644 index 000000000..72a5d5b22 --- /dev/null +++ b/src/render/defaults/qpervertexcolormaterial_p.h @@ -0,0 +1,82 @@ +/**************************************************************************** +** +** Copyright (C) 2015 Lorenz Esch (TU Ilmenau). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QT3D_RENDER_QPERVERTEXCOLORMATERIAL_P_H +#define QT3D_RENDER_QPERVERTEXCOLORMATERIAL_P_H + +#include <Qt3DRenderer/private/qmaterial_p.h> + +QT_BEGIN_NAMESPACE + +namespace Qt3D { + +class QEffect; +class QTechnique; +class QParameter; +class QShaderProgram; +class QRenderPass; +class QParameterMapping; + +class QPerVertexColorMaterial; + +class QPerVertexColorMaterialPrivate : public QMaterialPrivate +{ +public: + QPerVertexColorMaterialPrivate(QPerVertexColorMaterial *qq); + + void init(); + + QEffect *m_vertexEffect; + QParameter *m_lightPositionParameter; + QParameter *m_lightIntensityParameter; + QTechnique *m_vertexGL3Technique; + QTechnique *m_vertexGL2Technique; + QTechnique *m_vertexES2Technique; + QRenderPass *m_vertexGL3RenderPass; + QRenderPass *m_vertexGL2RenderPass; + QRenderPass *m_vertexES2RenderPass; + QShaderProgram *m_vertexGL3Shader; + QShaderProgram *m_vertexGL2ES2Shader; + + Q_DECLARE_PUBLIC(QPerVertexColorMaterial) +}; + +} // Qt3D + +QT_END_NAMESPACE + +#endif // QT3D_RENDER_QPERVERTEXCOLORMATERIAL_P_H + diff --git a/src/render/render.qrc b/src/render/render.qrc index 7c7e7c0fe..7e2227aa2 100644 --- a/src/render/render.qrc +++ b/src/render/render.qrc @@ -39,5 +39,11 @@ <file>shaders/es2/diffusespecularmap.frag</file> <file>shaders/gl3/diffusespecularmap.vert</file> <file>shaders/gl3/diffusespecularmap.frag</file> + <file>shaders/pervertexcolor.frag</file> + <file>shaders/pervertexcolor.vert</file> + <file>shaders/gl3/pervertexcolor.frag</file> + <file>shaders/gl3/pervertexcolor.vert</file> + <file>shaders/es2/pervertexcolor.frag</file> + <file>shaders/es2/pervertexcolor.vert</file> </qresource> </RCC> diff --git a/src/render/shaders/es2/pervertexcolor.frag b/src/render/shaders/es2/pervertexcolor.frag new file mode 100644 index 000000000..ff00557f3 --- /dev/null +++ b/src/render/shaders/es2/pervertexcolor.frag @@ -0,0 +1,25 @@ +#define FP highp + +uniform FP vec4 lightPosition; +uniform FP vec3 lightIntensity; + +varying FP vec3 position; +varying FP vec3 normal; +varying FP vec3 color; + +FP vec3 adModel( const FP vec3 pos, const FP vec3 n, const FP vec3 col ) +{ + // Calculate the vector from the light to the fragment + FP vec3 s = normalize( vec3( lightPosition ) - pos ); + + // Calculate the diffuse component + FP float diffuse = max( dot( s, n ), 0.0 ); + + // Combine the ambient and diffuse + return lightIntensity * ( col + col * diffuse ); +} + +void main() +{ + gl_FragColor = vec4( adModel( position, normalize( normal ) ), 1.0 ); +} diff --git a/src/render/shaders/es2/pervertexcolor.vert b/src/render/shaders/es2/pervertexcolor.vert new file mode 100644 index 000000000..e7303052b --- /dev/null +++ b/src/render/shaders/es2/pervertexcolor.vert @@ -0,0 +1,20 @@ +attribute vec3 vertexPosition; +attribute vec3 vertexNormal; +attribute vec3 vertexColor; + +varying vec3 position; +varying vec3 normal; +varying vec3 color; + +uniform mat4 modelView; +uniform mat3 modelViewNormal; +uniform mat4 mvp; + +void main() +{ + normal = normalize( modelViewNormal * vertexNormal ); + position = vec3( modelView * vec4( vertexPosition, 1.0 ) ); + color = vertexColor; + + gl_Position = mvp * vec4( vertexPosition, 1.0 ); +} diff --git a/src/render/shaders/gl3/pervertexcolor.frag b/src/render/shaders/gl3/pervertexcolor.frag new file mode 100644 index 000000000..a636781c4 --- /dev/null +++ b/src/render/shaders/gl3/pervertexcolor.frag @@ -0,0 +1,29 @@ +#version 150 core + +// TODO: Replace with a uniform block +uniform vec4 lightPosition; +uniform vec3 lightIntensity; + +in vec3 position; +in vec3 normal; +in vec3 color; + +out vec4 fragColor; + +vec3 adModel( const in vec3 pos, const in vec3 n, const in vec3 col ) +{ + // Calculate the vector from the light to the fragment + vec3 s = normalize( vec3( lightPosition ) - pos ); + + // Calculate the diffuse component + float diffuse = max( dot( s, n ), 0.0 ); + + // Combine the ambient and diffuse contributions + return lightIntensity * ( col + col * diffuse ); +} + +void main() +{ + fragColor = vec4( adModel( position, normalize( normal ), color ), 1.0 ); +} + diff --git a/src/render/shaders/gl3/pervertexcolor.vert b/src/render/shaders/gl3/pervertexcolor.vert new file mode 100644 index 000000000..b6b1a5da7 --- /dev/null +++ b/src/render/shaders/gl3/pervertexcolor.vert @@ -0,0 +1,22 @@ +#version 150 core + +in vec3 vertexPosition; +in vec3 vertexNormal; +in vec3 vertexColor; + +out vec3 position; +out vec3 normal; +out vec3 color; + +uniform mat4 modelView; +uniform mat3 modelViewNormal; +uniform mat4 mvp; + +void main() +{ + normal = normalize( modelViewNormal * vertexNormal ); + position = vec3( modelView * vec4( vertexPosition, 1.0 ) ); + color = vertexColor; + + gl_Position = mvp * vec4( vertexPosition, 1.0 ); +} diff --git a/src/render/shaders/pervertexcolor.frag b/src/render/shaders/pervertexcolor.frag new file mode 100644 index 000000000..a636781c4 --- /dev/null +++ b/src/render/shaders/pervertexcolor.frag @@ -0,0 +1,29 @@ +#version 150 core + +// TODO: Replace with a uniform block +uniform vec4 lightPosition; +uniform vec3 lightIntensity; + +in vec3 position; +in vec3 normal; +in vec3 color; + +out vec4 fragColor; + +vec3 adModel( const in vec3 pos, const in vec3 n, const in vec3 col ) +{ + // Calculate the vector from the light to the fragment + vec3 s = normalize( vec3( lightPosition ) - pos ); + + // Calculate the diffuse component + float diffuse = max( dot( s, n ), 0.0 ); + + // Combine the ambient and diffuse contributions + return lightIntensity * ( col + col * diffuse ); +} + +void main() +{ + fragColor = vec4( adModel( position, normalize( normal ), color ), 1.0 ); +} + diff --git a/src/render/shaders/pervertexcolor.vert b/src/render/shaders/pervertexcolor.vert new file mode 100644 index 000000000..b6b1a5da7 --- /dev/null +++ b/src/render/shaders/pervertexcolor.vert @@ -0,0 +1,22 @@ +#version 150 core + +in vec3 vertexPosition; +in vec3 vertexNormal; +in vec3 vertexColor; + +out vec3 position; +out vec3 normal; +out vec3 color; + +uniform mat4 modelView; +uniform mat3 modelViewNormal; +uniform mat4 mvp; + +void main() +{ + normal = normalize( modelViewNormal * vertexNormal ); + position = vec3( modelView * vec4( vertexPosition, 1.0 ) ); + color = vertexColor; + + gl_Position = mvp * vec4( vertexPosition, 1.0 ); +} |