ALLEGRO_PRIM_ATTR - Allegro 5 API
-
#include <allegro5/allegro_primitives.h>
typedef enum ALLEGRO_PRIM_ATTR
Enumerates the types of vertex attributes that a custom vertex may
have.
- ALLEGRO_PRIM_POSITION - Position information, can be stored only in
ALLEGRO_PRIM_SHORT_2, ALLEGRO_PRIM_FLOAT_2 and ALLEGRO_PRIM_FLOAT_3.
- ALLEGRO_PRIM_COLOR_ATTR - Color information, stored in an
ALLEGRO_COLOR(3). The storage field of ALLEGRO_VERTEX_ELEMENT is
ignored
- ALLEGRO_PRIM_TEX_COORD - Texture coordinate information, can be stored
only in ALLEGRO_PRIM_FLOAT_2 and ALLEGRO_PRIM_SHORT_2. These coordinates
are normalized by the width and height of the texture, meaning that the
bottom-right corner has texture coordinates of (1, 1).
- ALLEGRO_PRIM_TEX_COORD_PIXEL - Texture coordinate information, can be
stored only in ALLEGRO_PRIM_FLOAT_2 and ALLEGRO_PRIM_SHORT_2. These
coordinates are measured in pixels.
- ALLEGRO_PRIM_USER_ATTR - A user specified attribute. You can use any
storage for this attribute. You may have at most
ALLEGRO_PRIM_MAX_USER_ATTR (currently 10) of these that you can specify by
adding an index to the value of ALLEGRO_PRIM_USER_ATTR, e.g. the
first user attribute is ALLEGRO_PRIM_USER_ATTR +
0, the second is ALLEGRO_PRIM_USER_ATTR + 1
and so on.
To access these custom attributes from GLSL shaders you need to
declare attributes that follow this nomenclature:
al_user_attr_# where # is the index of the
attribute.
For example to have a position and a normal vector for each vertex
you could declare it like this:
-
ALLEGRO_VERTEX_ELEMENT elements[3] = {
{ALLEGRO_PRIM_POSITION, ALLEGRO_PRIM_FLOAT_3, 0},
{ALLEGRO_PRIM_USER_ATTR + 0, ALLEGRO_PRIM_FLOAT_3, 12},
{0, 0, 0}};
And then in your vertex shader access it like this:
-
attribute vec3 al_pos; // ALLEGRO_PRIM_POSITION
attribute vec3 al_user_attr_0; // ALLEGRO_PRIM_USER_ATTR + 0
varying float light;
const vec3 light_direction = vec3(0, 0, 1);
void main() {
light = dot(al_user_attr_0, light_direction);
gl_Position = al_pos;
}
To access these custom attributes from HLSL you need to declare a
parameter with the following semantics: TEXCOORD{# +
2} where # is the index of the attribute. E.g. the first attribute
can be accessed via TEXCOORD2, second via
TEXCOORD3 and so on.
Since: 5.1.6
ALLEGRO_VERTEX_DECL(3), ALLEGRO_PRIM_STORAGE(3),
al_attach_shader_source(3)