Есть два способа определения того, какие атрибуты в ваших шейдерах получить «в паре» с данными, вы предоставляете glVertexAttribPointer
. Единственный идентификатор, который вы получаете с glVertexAttribPointer
, - это index
(первый параметр), поэтому это должно быть сделано индексом как-то.
В первом методе вы получаете индекс атрибута из своего шейдера после его компиляции и связывания с использованием glGetAttribLocation и используете его в качестве первого параметра, например.
GLint program = ...;
GLint v3PosAttributeIndex = glGetAttribLocation(program, "v3Pos");
GLint v3varAttributeIndex = glGetAttribLocation(program, "v3_variable");
glVertexAttribPointer(v3PosAttributeIndex, ...);
glVertexAttribPointer(v3varAttributeIndex, ...);
Вы также можете явно задать расположение атрибутов при авторизации шейдер (как комментарий @ JP предполагает), так что вы бы изменить свой шейдер, как так:
layout(location = 1) in vec3 v3_variable;
layout(location = 0) in vec3 v3Pos;
, а затем в код вы бы установить их в явном виде:
glVertexAttribPointer(0, ...); // v3Pos data
glVertexAttribPointer(1, ...); // v3_variable data
Этот второй метод работает только в GLES 3.0+ (и OpenGL 3.0+), поэтому он не может быть применимо к вашему случаю, если вы используете только GLES 2,0. Также обратите внимание, что вы можете использовать оба этих метода вместе. Например. даже если вы явно определяете макеты, это не ограничивает вас последующим запросом.
с оформлением заявления более ясно, что он основан на индексе, см. Https://www.opengl.org/wiki/Layout_Qualifier_(GLSL) –