mirror of https://github.com/mosra/magnum.git
Browse Source
I got bored of copy/pasting and redocumenting/redebugging this code in every full screen effect ever implemented.pull/23/head
3 changed files with 148 additions and 0 deletions
@ -0,0 +1,59 @@
|
||||
/*
|
||||
This file is part of Magnum. |
||||
|
||||
Copyright © 2010, 2011, 2012, 2013 Vladimír Vondruš <mosra@centrum.cz> |
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a |
||||
copy of this software and associated documentation files (the "Software"), |
||||
to deal in the Software without restriction, including without limitation |
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||||
and/or sell copies of the Software, and to permit persons to whom the |
||||
Software is furnished to do so, subject to the following conditions: |
||||
|
||||
The above copyright notice and this permission notice shall be included |
||||
in all copies or substantial portions of the Software. |
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
||||
DEALINGS IN THE SOFTWARE. |
||||
*/ |
||||
|
||||
#include "FullScreenTriangle.h" |
||||
|
||||
#include "Math/Vector2.h" |
||||
#include "AbstractShaderProgram.h" |
||||
#include "Buffer.h" |
||||
#include "Context.h" |
||||
#include "Mesh.h" |
||||
|
||||
namespace Magnum { namespace MeshTools { |
||||
|
||||
std::pair<Buffer, Mesh> fullScreenTriangle() { |
||||
Mesh mesh; |
||||
mesh.setPrimitive(Mesh::Primitive::Triangles) |
||||
.setVertexCount(3); |
||||
|
||||
Buffer buffer; |
||||
#ifndef MAGNUM_TARGET_GLES |
||||
if(!Context::current()->isVersionSupported(Version::GL300)) |
||||
#else |
||||
if(!Context::current()->isVersionSupported(Version::GLES300)) |
||||
#endif |
||||
{ |
||||
constexpr Vector2 triangle[] = { |
||||
Vector2(-1.0, 1.0), |
||||
Vector2(-1.0, -3.0), |
||||
Vector2( 3.0, 1.0) |
||||
}; |
||||
buffer.setData(triangle, Buffer::Usage::StaticDraw); |
||||
mesh.addVertexBuffer(buffer, 0, AbstractShaderProgram::Attribute<0, Vector2>()); |
||||
} |
||||
|
||||
return {std::move(buffer), std::move(mesh)}; |
||||
} |
||||
|
||||
}} |
||||
@ -0,0 +1,87 @@
|
||||
#ifndef Magnum_MeshTools_FullScreenTriangle_h |
||||
#define Magnum_MeshTools_FullScreenTriangle_h |
||||
/*
|
||||
This file is part of Magnum. |
||||
|
||||
Copyright © 2010, 2011, 2012, 2013 Vladimír Vondruš <mosra@centrum.cz> |
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a |
||||
copy of this software and associated documentation files (the "Software"), |
||||
to deal in the Software without restriction, including without limitation |
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||||
and/or sell copies of the Software, and to permit persons to whom the |
||||
Software is furnished to do so, subject to the following conditions: |
||||
|
||||
The above copyright notice and this permission notice shall be included |
||||
in all copies or substantial portions of the Software. |
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
||||
DEALINGS IN THE SOFTWARE. |
||||
*/ |
||||
|
||||
/** @file
|
||||
* @brief Function @ref Magnum::MeshTools::fullScreenTriangle() |
||||
*/ |
||||
|
||||
#include <utility> |
||||
|
||||
#include "Magnum.h" |
||||
#include "MeshTools/magnumMeshToolsVisibility.h" |
||||
|
||||
namespace Magnum { namespace MeshTools { |
||||
|
||||
/**
|
||||
@brief Create full screen triangle mesh |
||||
|
||||
Returns pre-configured mesh along with vertex buffer which can be used for |
||||
full-screen post-processing effects. The mesh is single triangle covering whole |
||||
screen area (@f$ (-1, -1) - (1, 1) @f$ on both dimensions) and provides only |
||||
vertex positions, as other attributes (such as texture coordinates) can be |
||||
computed from them. The vertex positions are, in order: |
||||
@f[ |
||||
\begin{pmatrix} -1 \\ 1 \end{pmatrix}, |
||||
\begin{pmatrix} -1 \\ -3 \end{pmatrix}, |
||||
\begin{pmatrix} 3 \\ 1 \end{pmatrix} |
||||
@f] |
||||
|
||||
On OpenGL 2.1 and OpenGL ES 2.0 the vertex positions are passed explicitly as |
||||
attribute `0`, contained in the buffer. On OpenGL 3.0+ and OpenGL ES 3.0+ the |
||||
mesh is attribute-less and the vertex positions can be computed using |
||||
`gl_VertexID` builtin shader variable, thus the returned vertex buffer is empty |
||||
and basically useless. |
||||
|
||||
Computing positions in vertex shader in a portable way might be done like this. |
||||
For OpenGL 2.1 and OpenGL ES 2.0 you then need to bind the location of `position` |
||||
attribute to `0`. |
||||
@code |
||||
#if (!defined(GL_ES) && __VERSION__ >= 130) || (defined(GL_ES) && __VERSION__ >= 300) |
||||
#define NEW_GLSL |
||||
#endif |
||||
|
||||
#ifndef NEW_GLSL |
||||
attribute lowp vec4 position; |
||||
#endif |
||||
|
||||
void main() { |
||||
#ifdef NEW_GLSL |
||||
gl_Position = vec4((gl_VertexID == 2) ? 3.0 : -1.0, |
||||
(gl_VertexID == 1) ? -3.0 : 1.0, 0.0, 1.0); |
||||
#else |
||||
gl_Position = position; |
||||
#endif |
||||
} |
||||
@endcode |
||||
|
||||
@attention The implementation needs to check OpenGL version, so it expects |
||||
active context. |
||||
*/ |
||||
std::pair<Buffer, Mesh> MAGNUM_MESHTOOLS_EXPORT fullScreenTriangle(); |
||||
|
||||
}} |
||||
|
||||
#endif |
||||
Loading…
Reference in new issue