GLES2 Необходим ли glBindAttribLocation()?

Это может быть нубский вопрос. Насколько я понимаю, glBindAttribLocation(..., AAA,...) привяжет атрибут внутри программы к идентификатору местоположения AAA, если AAA уникален. Если у меня есть следующий код:

glBindAttribLocation(..., 0, "XXX");
glBindAttribLocation(..., 1, "YYY");

Это свяжет две мои переменные с идентификатором местоположения 0 и 1. Затем я бы назвал:

glBindBuffer(GL_ARRAY_BUFFER, VBId);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBId);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, 0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void *) 0 + sizeof(float) * 3);
glEnableVertexAttribArray(1);

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

До этого момента я понимаю, что идентификаторы 0 и 1 передаются в glVertexAttribPointer() в качестве первого параметра.

Можно ли с уверенностью предположить, что если бы я получил идентификаторы местоположения атрибутов (как указано выше) с помощью вызовов glGetAttribLocation(), так что возвращаемые идентификаторы были бы 5 и 6 вместо 0 и 1, мог бы я передать 5 и 6 в glVertexAttribPointer( ) и glEnableVertexAttribArray() вместо 0 и 1??


person MarkP    schedule 28.09.2011    source источник


Ответы (1)


glGetAttribLocation() возвращает правильный индекс. Так что да, безопасно использовать эти значения в glVertexAttribPointer() и glEnableVertexAttribArray().

Но вызов glGetAttribLocation для каждого шейдера может быть дорогостоящим, если вы не кэшируете его. Использование glBindAttribLocation() позволяет использовать соглашение, позиция всегда равна 0, обычная — 1 и так далее.

person crazyjul    schedule 04.10.2011