From 17ee1d7fd8c10e08362ffa47810e26854c4e9ee0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 10 Nov 2012 21:28:45 +0100 Subject: [PATCH] Shaders: portable vertex color shader (currently 2D only). --- src/Shaders/CMakeLists.txt | 3 ++ src/Shaders/VertexColorShader.cpp | 75 ++++++++++++++++++++++++++++ src/Shaders/VertexColorShader.h | 69 +++++++++++++++++++++++++ src/Shaders/VertexColorShader2D.frag | 14 ++++++ src/Shaders/VertexColorShader2D.vert | 21 ++++++++ 5 files changed, 182 insertions(+) create mode 100644 src/Shaders/VertexColorShader.cpp create mode 100644 src/Shaders/VertexColorShader.h create mode 100644 src/Shaders/VertexColorShader2D.frag create mode 100644 src/Shaders/VertexColorShader2D.vert diff --git a/src/Shaders/CMakeLists.txt b/src/Shaders/CMakeLists.txt index 38a3ce0ad..46139bbed 100644 --- a/src/Shaders/CMakeLists.txt +++ b/src/Shaders/CMakeLists.txt @@ -1,14 +1,17 @@ corrade_add_resource(MagnumShaders_RCS MagnumShaders FlatShader2D.vert FlatShader2D.frag PhongShader.vert PhongShader.frag + VertexColorShader2D.vert VertexColorShader2D.frag compatibility.glsl) set(MagnumShaders_SRCS FlatShader.cpp PhongShader.cpp + VertexColorShader.cpp ${MagnumShaders_RCS}) set(MagnumShaders_HEADERS FlatShader.h PhongShader.h + VertexColorShader.h magnumShadersVisibility.h) diff --git a/src/Shaders/VertexColorShader.cpp b/src/Shaders/VertexColorShader.cpp new file mode 100644 index 000000000..bb6305b4d --- /dev/null +++ b/src/Shaders/VertexColorShader.cpp @@ -0,0 +1,75 @@ +/* + Copyright © 2010, 2011, 2012 Vladimír Vondruš + + This file is part of Magnum. + + Magnum is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 3 + only, as published by the Free Software Foundation. + + Magnum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License version 3 for more details. +*/ + +#include "VertexColorShader.h" + +#include + +#include "Extensions.h" +#include "Shader.h" + +namespace Magnum { namespace Shaders { + +namespace { + template struct ShaderName {}; + + template<> struct ShaderName<2> { + constexpr static const char* vertex() { return "VertexColorShader2D.vert"; } + constexpr static const char* fragment() { return "VertexColorShader2D.frag"; } + }; + + template<> struct ShaderName<3> { + constexpr static const char* vertex() { return "VertexColorShader3D.vert"; } + constexpr static const char* fragment() { return "VertexColorShader3D.frag"; } + }; +} + +template VertexColorShader::VertexColorShader() { + Corrade::Utility::Resource rs("MagnumShaders"); + + #ifndef MAGNUM_TARGET_GLES + Version v = Context::current()->supportedVersion({Version::GL320, Version::GL210}); + #else + Version v = Context::current()->supportedVersion({Version::GLES300, Version::GLES200}); + #endif + + Shader vertexShader(v, Shader::Type::Vertex); + vertexShader.addSource(rs.get("compatibility.glsl")); + vertexShader.addSource(rs.get(ShaderName::vertex())); + attachShader(vertexShader); + + Shader fragmentShader(v, Shader::Type::Fragment); + fragmentShader.addSource(rs.get("compatibility.glsl")); + fragmentShader.addSource(rs.get(ShaderName::fragment())); + attachShader(fragmentShader); + + #ifndef MAGNUM_TARGET_GLES + if(!Context::current()->isExtensionSupported()) { + #else + if(!Context::current()->isVersionSupported(Version::GLES300)) { + #endif + bindAttributeLocation(Position::Location, "position"); + bindAttributeLocation(Color::Location, "color"); + } + + link(); + + transformationProjectionUniform = uniformLocation("transformationProjection"); +} + +template class VertexColorShader<2>; +template class VertexColorShader<3>; + +}} diff --git a/src/Shaders/VertexColorShader.h b/src/Shaders/VertexColorShader.h new file mode 100644 index 000000000..4fa87b65d --- /dev/null +++ b/src/Shaders/VertexColorShader.h @@ -0,0 +1,69 @@ +#ifndef Magnum_Shaders_VertexColorShader_h +#define Magnum_Shaders_VertexColorShader_h +/* + Copyright © 2010, 2011, 2012 Vladimír Vondruš + + This file is part of Magnum. + + Magnum is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 3 + only, as published by the Free Software Foundation. + + Magnum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License version 3 for more details. +*/ + +/** @file + * @brief Class Magnum::Shaders::VertexColorShader + */ + +#include "Math/Matrix3.h" +#include "Math/Matrix4.h" +#include "AbstractShaderProgram.h" +#include "Color.h" +#include "DimensionTraits.h" + +#include "magnumShadersVisibility.h" + +namespace Magnum { namespace Shaders { + +/** +@brief Vertex color shader + +Draws vertex-colored mesh. +@see VertexColorShader2D, VertexColorShader3D +*/ +template class SHADERS_EXPORT VertexColorShader: public AbstractShaderProgram { + public: + /** @brief Vertex position */ + typedef Attribute<0, typename DimensionTraits::PointType> Position; + + /** @brief Vertex color */ + typedef Attribute<1, Math::Point2D> Color; + + VertexColorShader(); + + /** + * @brief Set transformation and projection + * @return Pointer to self (for method chaining) + */ + inline VertexColorShader* setTransformationProjection(const typename DimensionTraits::MatrixType& matrix) { + setUniform(transformationProjectionUniform, matrix); + return this; + } + + private: + GLint transformationProjectionUniform; +}; + +/** @brief 2D vertex color shader */ +typedef VertexColorShader<2> VertexColorShader2D; + +/** @brief 3D vertex color shader */ +typedef VertexColorShader<3> VertexColorShader3D; + +}} + +#endif diff --git a/src/Shaders/VertexColorShader2D.frag b/src/Shaders/VertexColorShader2D.frag new file mode 100644 index 000000000..641dd081e --- /dev/null +++ b/src/Shaders/VertexColorShader2D.frag @@ -0,0 +1,14 @@ +#ifndef NEW_GLSL +#define in varying +#define fragmentColor gl_FragColor +#endif + +in lowp vec3 interpolatedColor; + +#ifdef NEW_GLSL +out lowp vec4 fragmentColor; +#endif + +void main() { + fragmentColor = vec4(interpolatedColor, 1.0); +} diff --git a/src/Shaders/VertexColorShader2D.vert b/src/Shaders/VertexColorShader2D.vert new file mode 100644 index 000000000..12be1d046 --- /dev/null +++ b/src/Shaders/VertexColorShader2D.vert @@ -0,0 +1,21 @@ +#ifndef NEW_GLSL +#define in attribute +#define out varying +#endif + +uniform highp mat3 transformationProjection; + +#ifdef EXPLICIT_ATTRIB_LOCATION +layout(location = 0) in highp vec3 position; +layout(location = 1) in lowp vec3 color; +#else +in highp vec3 position; +in lowp vec3 color; +#endif + +out lowp vec3 interpolatedColor; + +void main() { + gl_Position.xywz = vec4(transformationProjection*position, 0.0); + interpolatedColor = color; +}