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?