GLES2 Нужно ли glBindAttribLocation ()? - PullRequest
       27

GLES2 Нужно ли glBindAttribLocation ()?

11 голосов
/ 28 сентября 2011

Это может быть нубский вопрос. Насколько я понимаю, 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 ??

1 Ответ

13 голосов
/ 04 октября 2011

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

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

...