OpenGL Mathematics (GLM) is a C++ mathematics library for 3D software based on the OpenGL Shading Language (GLSL) specification.
The goal of the project is to provide to 3D programmers math classes and functions that miss in C++ when we use to program with GLSL or any high level GPU language. With GLM, the idea is to have a library that works the same way that GLSL which imply a strict following of GLSL specification for the implementation.
However, this project isn't limited by GLSL features. An extension system based on GLSL extensions development conventions allows to extend GLSL capabilities.
GLM is release under MIT license and available for all version of GCC from version 3.4 and Visual Studio from version 8.0 as a platform independent library.
GLM sample, compute a triangle normal:- #include <glm/glm.hpp>
- void computeNormal(triangle & Triangle)
-
{
-
glm::vec3 const & a = Triangle.Position[0];
-
glm::vec3 const & b = Triangle.Position[1];
-
glm::vec3 const & c = Triangle.Position[2];
-
Triangle.Normal = glm::normalize(glm::cross(c - a, b - a));
-
}
GLM sample, matrix transform:- #include <glm/glm.hpp>
- #include <glm/gtc/matrix_projection.hpp>
- #include <glm/gtc/matrix_transform.hpp>
- #include <glm/gtc/type_ptr.hpp>
-
{
-
glm::mat4 Projection =
-
glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.f);
-
glm::mat4 ViewTranslate = glm::translate(
-
glm::mat4(1.0f),
-
glm::vec3(0.0f, 0.0f, -Translate));
-
glm::mat4 ViewRotateX = glm::rotate(
-
ViewTranslate,
-
Rotate.y, glm::vec3(-1.0f, 0.0f, 0.0f));
-
glm::mat4 View = glm::rotate(
-
ViewRotateX,
-
Rotate.x, glm::vec3(0.0f, 1.0f, 0.0f));
-
glm::mat4 Model = glm::scale(
-
glm::mat4(1.0f),
-
glm::vec3(0.5f));
-
glm::mat4 MVP = Projection * View * Model;
-
glUniformMatrix4fv(
-
LocationMVP, 1, GL_FALSE, glm::value_ptr(MVP));
-
}
GLM sample, vector types:- #include <glm/glm.hpp>
- #include <glm/gtx/type_precision.hpp>
-
std::size_t const VertexCount = 4;
-
std::size_t const PositionSizeF32 = VertexCount * sizeof(glm::vec2);
-
glm::vec2 const PositionDataF32[VertexCount] =
-
{
-
glm::vec2(-1.0f,-1.0f),
-
glm::vec2( 1.0f,-1.0f),
-
glm::vec2( 1.0f, 1.0f),
-
glm::vec2(-1.0f, 1.0f)
-
};
-
std::size_t const PositionSizeF16 = VertexCount * sizeof(glm::hvec2);
-
glm::hvec2 const PositionDataF16[VertexCount] =
-
{
-
glm::hvec2(-1.0f, -1.0f),
-
glm::hvec2( 1.0f, -1.0f),
-
glm::hvec2( 1.0f, 1.0f),
-
glm::hvec2(-1.0f, 1.0f)
-
};
-
std::size_t const PositionSizeI8 = VertexCount * sizeof(glm::i8vec2);
-
glm::i8vec2 const PositionDataI8[VertexCount] =
-
{
-
glm::i8vec2(-1,-1),
-
glm::i8vec2( 1,-1),
-
glm::i8vec2( 1, 1),
-
glm::i8vec2(-1, 1)
-
};
-
std::size_t const PositionSizeI32 = VertexCount * sizeof(glm::i32vec2);
-
glm::i32vec2 const PositionDataI32[VertexCount] =
-
{
-
glm::i32vec2 (-1,-1),
-
glm::i32vec2 ( 1,-1),
-
glm::i32vec2 ( 1, 1),
-
glm::i32vec2 (-1, 1)
-
};
GLM sample, lighting:- #include <glm/glm.hpp>
- #include <glm/gtx/random.hpp>
-
glm::vec3 lighting
-
(
-
intersection const & Intersection,
-
material const & Material,
-
light const & Light,
-
glm::vec3 const & View
-
)
-
{
-
glm::vec3 Color = glm::vec3(0.0f);
-
glm::vec3 LightVertor = glm::normalize(
-
Light.position() - Intersection.globalPosition() +
-
glm::vecRand3(0.0f, Light.inaccuracy());
- if(!shadow(
-
Intersection.globalPosition(),
-
Light.position(),
-
LightVertor))
-
{
- float Diffuse = glm::dot(Intersection.normal(), LightVector);
- if(Diffuse <= 0.0f)
- return Color;
- if(Material.isDiffuse())
-
Color += Light.color() * Material.diffuse() * Diffuse;
- if(Material.isSpecular())
-
{
-
glm::vec3 Reflect = glm::reflect(
-
glm::normalize(-LightVector),
-
glm::normalize(Intersection.normal()));
- float Dot = glm::dot(Reflect, View);
- float Base = Dot > 0.0f ? Dot : 0.0f;
- float Specular = glm::pow(Base, Material.exponent());
-
Color += Material.specular() * Specular;
-
}
-
}
Releases:
- 20/03/2013 GLM 0.9.4.3 (ZIP, 5.1 MB) (7Z, 3.0 MB)
- 14/02/2013 GLM 0.9.4.2 (ZIP, 4.5 MB) (7Z, 2.4 MB)
- 22/12/2012 GLM 0.9.4.1 (ZIP, 4.5 MB) (7Z, 2.4 MB)
- 18/11/2012 GLM 0.9.4.0 (ZIP, 4.5 MB) (7Z, 2.4 MB)
- 30/06/2012 GLM 0.9.3.4 (ZIP, 6.4 MB) (7Z, 3.8 MB)
- 10/05/2012 GLM 0.9.3.3 (ZIP, 6.4 MB) (7Z, 3.8 MB)
- 15/03/2012 GLM 0.9.3.2 (ZIP, 6.2 MB) (7Z, 3.8 MB)
- 25/01/2012 GLM 0.9.3.1 (ZIP, 6.2 MB) (7Z, 3.8 MB)
- 09/01/2012 GLM 0.9.3.0 (ZIP, 4.0 MB) (7Z, 2.7 MB)
- 13/12/2011 GLM 0.9.3.B (ZIP, 5.4 MB) (7Z, 3.0 MB)
- 11/11/2011 GLM 0.9.3.A (ZIP, 4.3 MB) (7Z, 2.8 MB)
- 24/10/2011 GLM 0.9.2.7 (ZIP, 3.4 MB) (7Z, 2.1 MB)
- 01/10/2011 GLM 0.9.2.6 (ZIP, 3.4 MB) (7Z, 2.1 MB)
- 20/09/2011 GLM 0.9.2.5 (ZIP, 3.4 MB) (7Z, 2.1 MB)
- 03/09/2011 GLM 0.9.2.4 (ZIP, 3.4 MB) (7Z, 2.1 MB)
- 08/06/2011 GLM 0.9.2.3 (ZIP, 3.4 MB) (7Z, 2.1 MB)
- 02/06/2011 GLM 0.9.2.2 (ZIP, 3.4 MB) (7Z, 2.1 MB)
- 24/05/2011 GLM 0.9.2.1 (ZIP, 3.5 MB) (7Z, 2.1 MB)
- 09/05/2011 GLM 0.9.2.0 (ZIP, 3.5 MB) (7Z, 2.1 MB)
- 07/05/2011 GLM 0.9.1.3 (ZIP, 3.3 MB) (7Z, 2.0 MB)
- 15/04/2011 GLM 0.9.1.2 (ZIP, 3.3 MB) (7Z, 2.0 MB)
- 03/03/2011 GLM 0.9.1.1 (ZIP, 3.3 MB) (7Z, 2.0 MB)
- 03/03/2011 GLM 0.9.1.0 (ZIP, 3.1 MB) (7Z, 1.8 MB)
- 13/02/2011 GLM 0.9.1.B (ZIP, 3.2 MB) (7Z, 1.8 MB)
- 13/02/2011 GLM 0.9.0.8 (ZIP, 3.3 MB) (7Z, 2.0 MB)
- 31/01/2011 GLM 0.9.1.A (ZIP, 3.0 MB) (7Z, 2.0 MB)
- 30/01/2011 GLM 0.9.0.7 (ZIP, 1.4 MB) (7Z, 832 KB)
- 21/12/2010 GLM 0.9.0.6 (ZIP, 1.4 MB) (7Z, 800 KB)
- 01/11/2010 GLM 0.9.0.5 (ZIP, 2.2 MB) (7Z, 1.5 KB)
- 04/10/2010 GLM 0.9.0.4 (ZIP, 2.2 MB) (7Z, 1.5 KB)
- 26/08/2010 GLM 0.9.0.3 (ZIP, 1.2 MB) (7Z, 684 KB)
- 08/07/2010 GLM 0.9.0.2 (ZIP, 809 KB) (7Z, 651 KB)
- 21/06/2010 GLM 0.9.0.1 (ZIP, 712 KB) (7Z, 556 KB)
- 25/05/2010 GLM 0.9.0.0 (ZIP, 1.0 MB) (7Z, 514 KB)
- 30/04/2010 GLM 0.9.B.2 (ZIP, 1.1 MB) (7Z, 545 KB)
- 03/04/2010 GLM 0.9.B.1 (ZIP, 964 KB) (7Z, 414 KB)
- 20/02/2010 GLM 0.9.A.2 (ZIP, 1.3 MB) (7Z, 760 KB)
- 09/02/2010 GLM 0.9.A.1 (ZIP, 952 KB) (7Z, 391 KB)
- 10/01/2010 GLM 0.8.4.4 (ZIP, 1.1 MB) (7Z, 479 KB)
- 16/11/2009 GLM 0.8.4.3 (ZIP, 1.1 MB) (7Z, 462 KB)
- 19/10/2009 GLM 0.8.4.2 (ZIP, 1.2 MB) (7Z, 447 KB)
- 05/10/2009 GLM 0.8.4.1 (ZIP, 1.1 MB) (7Z, 443 KB)
- 16/09/2009 GLM 0.8.4.0 (ZIP, 1.1 MB) (7Z, 440 KB)
- 10/08/2009 GLM 0.8.3.5 (ZIP, 974 KB) (7Z, 406 KB)
- 10/08/2009 GLM 0.8.3.4 (ZIP, 971 KB)
- 25/06/2009 GLM 0.8.3.3 (ZIP, 971 KB)
- 04/06/2009 GLM 0.8.3.2 (ZIP, 971 KB)
- 21/05/2009 GLM 0.8.3.1 (ZIP, 945 KB)
- 06/05/2009 GLM 0.8.3.0 (ZIP, 896 KB)
- 01/04/2009 GLM 0.8.2.3 (ZIP, 961 KB)
- 24/02/2009 GLM 0.8.2.2 (ZIP, 961 KB)
- 13/02/2009 GLM 0.8.2.1 (ZIP, 963 KB)
- 21/01/2009 GLM 0.8.2.0 (ZIP, 963 KB)
- 30/10/2008 GLM 0.8.1.0 (ZIP, 938 KB)
- 29/10/2008 GLM 0.8.0.0 (ZIP, 936 KB) (7Z, 370 KB)
- 09/08/2008 GLM 0.7.6.0 (ZIP, 907 KB) (7Z, 389 KB)
- 05/07/2008 GLM 0.7.5.0 (ZIP, 852 KB)
- 01/06/2008 GLM 0.7.4.0 (ZIP, 859 KB)
- 24/05/2008 GLM 0.7.3.0 (ZIP, 1.8 MB)
- 27/04/2008 GLM 0.7.2.0 (ZIP, 1.8 MB)
- 24/03/2008 GLM 0.7.1.0 (ZIP, 1.8 MB) (7Z, 635 KB)
- 22/03/2008 GLM 0.7.0.0 (ZIP, 1.8 MB)
- 13/12/2007 GLM 0.6.4.0 (ZIP) (7Z)
- 05/11/2007 GLM 0.6.3.0 (ZIP, 1.8 MB)
- 08/10/2007 GLM 0.6.2.0 (ZIP, 1.8 MB)
- 07/10/2007 GLM 0.6.1.0 (ZIP, 1.8 MB)
- 16/09/2007 GLM 0.6.0.0 (ZIP, 1.8 MB) (7Z, 632 KB)
- 19/02/2007 GLM 0.5.1.0 (ZIP, 2.3 MB)
- 23/01/2007 GLM 0.5.0.0 (ZIP, 2.4 MB) (7Z, 843 KB)
- 22/05/2006 GLM 0.4.1.0 (ZIP, 1.6 MB)
- 17/05/2006 GLM 0.4.0.0 (ZIP, 905 KB)
- 22/04/2006 GLM 0.3.2.0 (ZIP, 955 KB)
- 28/03/2006 GLM 0.3.1.0 (ZIP, 963 KB)
- 19/02/2006 GLM 0.3.0.0 (ZIP, 945 KB)
- 05/05/2005 GLM 0.2.0.0 (ZIP, 194 KB)
- 21/02/2005 GLM 0.1.0.0 (ZIP, 29.2 KB)