Używanie macierzy jako atrybutu wierzchołka w profilu Core OpenGL3

Używam OpenGL3.2 Core Profile w OSX. I chcę zrobić instancję rysunku (glDrawArraysInstanced), gdzie przekazuję macierz dla każdej instancji.

Mój moduł cieniowania wierzchołków jest w porządku:

#version 150
in mediump vec4 position;
in mediump mat4 trf;
in lowp vec4 rgb;
out lowp vec4 colour;
uniform highp mat4 modelcamviewprojmat;
void main()
{
    mediump vec4 tpos = trf * position;
    gl_Position = modelcamviewprojmat * tpos;
    colour = rgb;
}

Wiązanie „trf” poszło dobrze:

glBindAttribLocation(program, ATTRIB_TRF, "trf" );

Ale jak mogę przekazać moje dane? glVertexAttribPointer nie może przekazywać wartości większych niż 4 zmiennoprzecinkowe. Więc to połączenie nie powiedzie się:

glVertexAttribPointer( ATTRIB_TRF,   16, GL_FLOAT, 0, 16 * sizeof(float), ... );

Podejrzewam, że muszę go zastąpić 4 wywołaniami glVertexAttribPointer, z których każde przechodzi 4 zmiennoprzecinkowe. Ale jaką wartość mogę użyć dla „indeksu” (pierwszy parm)? Czy muszę zamiast tego użyć 4 atrybutów wektorowych i złożyć cztery wektory w cieniującym wierzchołku GLSL? Jeśli tak, jaki rodzaj kodu GLSL to zapewnia? Czy mogę użyć wartości zwracanej z BindAttribLocation i użyć val + 0, val + 1, val + 2 i val + 3 dla wszystkich wierszy?

questionAnswers(1)

yourAnswerToTheQuestion