Browse Source

GL: improve Attribute docs with clear integer/double unavailablility errors.

pull/368/head
Vladimír Vondruš 7 years ago
parent
commit
8587afaca7
  1. 9
      doc/snippets/MagnumGL.cpp
  2. 4
      src/Magnum/GL/AbstractShaderProgram.h
  3. 54
      src/Magnum/GL/Attribute.h

9
doc/snippets/MagnumGL.cpp

@ -312,11 +312,16 @@ MyShader& bindSpecularTexture(GL::Texture2D& texture) {
/* [AbstractShaderProgram-textures] */ /* [AbstractShaderProgram-textures] */
/* [AbstractShaderProgram-xfb] */ /* [AbstractShaderProgram-xfb] */
MyShader& setTransformFeedback(GL::TransformFeedback& feedback, GL::Buffer& positions, GL::Buffer& data) { MyShader& setTransformFeedback(GL::TransformFeedback& feedback,
GL::Buffer& positions, GL::Buffer& data)
{
feedback.attachBuffers(0, {&positions, &data}); feedback.attachBuffers(0, {&positions, &data});
return *this; return *this;
} }
MyShader& setTransformFeedback(GL::TransformFeedback& feedback, Int totalCount, GL::Buffer& positions, GLintptr positionsOffset, GL::Buffer& data, GLintptr dataOffset) { MyShader& setTransformFeedback(GL::TransformFeedback& feedback, Int totalCount,
GL::Buffer& positions, GLintptr positionsOffset, GL::Buffer& data,
GLintptr dataOffset)
{
feedback.attachBuffers(0, { feedback.attachBuffers(0, {
std::make_tuple(&positions, positionsOffset, totalCount*sizeof(Vector3)), std::make_tuple(&positions, positionsOffset, totalCount*sizeof(Vector3)),
std::make_tuple(&data, dataOffset, totalCount*sizeof(Vector2ui)) std::make_tuple(&data, dataOffset, totalCount*sizeof(Vector2ui))

4
src/Magnum/GL/AbstractShaderProgram.h

@ -54,8 +54,8 @@ This class is designed to be used via subclassing. Subclasses define these
functions and properties: functions and properties:
<ul> <ul>
<li> **Attribute definitions** with location and type for <li> **Attribute definitions** using @ref Attribute typedefs with location and
configuring meshes, for example: type for configuring meshes, for example:
@snippet MagnumGL.cpp AbstractShaderProgram-input-attributes @snippet MagnumGL.cpp AbstractShaderProgram-input-attributes
</li> </li>

54
src/Magnum/GL/Attribute.h

@ -34,6 +34,7 @@
#include "Magnum/Magnum.h" #include "Magnum/Magnum.h"
#include "Magnum/GL/OpenGL.h" #include "Magnum/GL/OpenGL.h"
#include "Magnum/GL/visibility.h" #include "Magnum/GL/visibility.h"
#include "Magnum/Math/TypeTraits.h"
namespace Magnum { namespace GL { namespace Magnum { namespace GL {
@ -42,28 +43,36 @@ namespace Implementation { template<class> struct Attribute; }
/** /**
@brief Base class for vertex attribute location and type @brief Base class for vertex attribute location and type
For use in @ref AbstractShaderProgram subclasses. Template parameter @p location For use in @ref AbstractShaderProgram subclasses. The @p location template
is vertex attribute location, number between @cpp 0 @ce and parameter is vertex attribute location, a number between @cpp 0 @ce and
@ref AbstractShaderProgram::maxVertexAttributes(). To ensure compatibility, you @ref AbstractShaderProgram::maxVertexAttributes(). To ensure compatibility, you
should always have vertex attribute with location @cpp 0 @ce. should always have a vertex attribute with location @cpp 0 @ce.
Template parameter @p T is the type which is used for shader attribute, e.g. The @p T template parameter is the type which is used for shader attribute,
@ref Magnum::Vector4i "Vector4i" for @glsl ivec4 @ce. DataType is type of e.g. @ref Magnum::Vector4i "Vector4i" for @glsl ivec4 @ce. @ref DataType is
passed data when adding vertex buffers to mesh. By default it is the same as type of passed data when adding vertex buffers to mesh. By default it is the
type used in shader (e.g. @ref DataType::Int for @ref Magnum::Vector4i "Vector4i"). same as type used in shader (e.g. @ref DataType::Int for
It's also possible to pass integer data to floating-point shader inputs. In @ref Magnum::Vector4i "Vector4i"). It's also possible to pass integer data to
this case you may want to normalize the values (e.g. color components from floating-point shader inputs. In this case you may want to normalize the values
@cpp 0 @ce -- @cpp 255 @ce to @cpp 0.0f @ce -- @cpp 1.0f @ce) --- see (e.g. color components from @cpp 0 @ce -- @cpp 255 @ce to @cpp 0.0f @ce --
@ref DataOption::Normalized. @cpp 1.0f @ce) --- see @ref DataOption::Normalized.
Only some types are allowed as attribute types, see @ref GL-AbstractShaderProgram-types @attention Only some types are allowed as attribute types and there are
for more information. additional restrictions applied for OpenGL ES and WebGL, see
@ref GL-AbstractShaderProgram-types for more information.
See @ref GL-AbstractShaderProgram-subclassing for example usage in shaders and See @ref GL-AbstractShaderProgram-subclassing for example usage in shaders and
@ref GL-Mesh-configuration for example usage when adding vertex buffers to @ref GL-Mesh-configuration for example usage when adding vertex buffers to a
mesh. mesh.
*/ */
template<UnsignedInt location, class T> class Attribute { template<UnsignedInt location, class T> class Attribute {
#ifdef MAGNUM_TARGET_GLES2
static_assert(!Math::IsIntegral<T>::value, "integral attributes are not available on OpenGL ES 2.0 and WebGL 1");
#endif
#ifdef MAGNUM_TARGET_GLES
static_assert(!std::is_same<Math::UnderlyingTypeOf<T>, Double>::value, "double attributes and uniforms are not available in OpenGL ES and WebGL");
#endif
public: public:
enum: UnsignedInt { enum: UnsignedInt {
/** /**
@ -343,11 +352,24 @@ class DynamicAttribute {
GenericNormalized, GenericNormalized,
#ifndef MAGNUM_TARGET_GLES2 #ifndef MAGNUM_TARGET_GLES2
/** Integral, matches integral shader type */ /**
* Integral, matches integral shader type
*
* @requires_gl30 Extension @gl_extension{EXT,gpu_shader4}
* @requires_gles30 Integral attributes are not available in OpenGL
* ES 2.0.
* @requires_webgl20 Integral attributes are not available in WebGL
* 1.0.
*/
Integral, Integral,
#ifndef MAGNUM_TARGET_GLES #ifndef MAGNUM_TARGET_GLES
/** Long, matches double-precision shader type */ /**
* Long, matches double-precision shader type
* @requires_gl40 Extension @gl_extension{ARB,gpu_shader_fp64}
* @requires_gl Double attributes and uniforms are not available in
* OpenGL ES and WebGL.
*/
Long Long
#endif #endif
#endif #endif

Loading…
Cancel
Save