Как перейти от glGetAttribLocation к индексу glGetActiveAttrib? - PullRequest
0 голосов
/ 21 февраля 2019

Я хочу запросить метаданные для данного атрибута.Надеюсь, я неправильно понял, как работает glGetActiveAttrib.Вот что я думаю о том, как это работает:

Атрибут location можно получить , используя glGetAttribLocation(programId, attributeName).Метаданные можно получить , используя glGetActiveAttrib(programId, index, ...).

Как видите, glGetActiveAttrib ожидает index вместо местоположения.Это не то же самое.

Пример:

В шейдере:

attribute vec3 position;
attribute vec3 textureCoordinate; // <-- this attribute is not used
attribute vec3 normal;

В этом примере атрибут location будет

locations = [
    position: 0,
    textureCoordinate: -1, // optimized away
    normal: 2, // continues counting the attributes
]

Однако активный атрибут indexes будет

active_attribute_indices = [
    position: 0,
    // skips texture coordinate because it is not active
    normal: 1, 
]

Как видите, следующее не будет работать:

// get attribute location by name
int attrib_location = glGetAttribLocation(programId, "normal"); // = 2

// get attribute metadata
// Error: attrib_location being 2 is not a valid active attribute index.
glGetActiveAttrib(programId, attrib_location, ...) 

Поэтому мой вопрос таков:

Как я могу получить индекс активного атрибута, а не местоположение?

Нужно ли циклически просматривать все атрибуты и проверять,имя соответствует имени моего атрибута?

1 Ответ

0 голосов
/ 21 февраля 2019

В старом API самоанализа невозможно получить индекс атрибута по имени.Таким образом, вам придется перебрать список атрибутов, чтобы найти его.

В более современном API самоанализа (доступно для GL 4.3 и через расширение ), вы можете запросить любой именованный индекс ресурса по имени (при условии, что ваш шейдер не является шейдером SPIR-V ) через glGetProgramResourceIndex.Для ввода вершинного шейдера вы передаете интерфейс GL_PROGRAM_INPUT.

...