Как я могу перебрать массив bone_matrices, получить их имена: bone_matrices [0], bone_matrices 1 , ... и местоположения.
Существует одинуниформа: bone_matrices
.Эта униформа представляет собой массив базовых типов , поэтому она считается единственным ресурсом .У каждого элемента массива есть местоположение, но все еще есть только одна униформа.
Если вы хотите проверить, является ли униформа массивом, получите размер униформы, используя свойство GL_ARRAY_SIZE
.Если это значение больше 1, тогда вы можете запросить местоположение каждого элемента массива с помощью цикла.
Все это сказано:
Я пытаюсь сохранить униформуместоположения массива, в std :: map в моем классе шейдеров.
Пожалуйста, не делайте этого.Во-первых, ваш std::map
код будет не быстрее, чем glGetUniformLocation
или glGetProgramResourceLocation
.Поэтому, если вы собираетесь постоянно запрашивать униформу по строковому имени, вы также можете просто использовать существующий API.
Во-вторых, поскольку вы используете программные ресурсы, функцию GL 4.3, я должен предположить, что выиметь доступ к явным равномерным местоположениям .Поэтому вы должны назначать униформу для определенных мест в вашем шейдере, тогда вам вообще не нужно ничего запрашивать.
Даже если вы пишете программу, которая должна работать с тем, что дает вам пользователь, этоеще лучше, чтобы они указали конкретные места.
Я имею в виду следующее.Допустим, у вас есть ожидание, что пользователь предоставит массив матриц с именем bone_matrices
.Поэтому измените свое ожидание на то, что пользователь предоставит массив матриц в каком-то определенном однородном месте X.
Да, это означает, что вам нужно разделить свое единое пространство.Но это намного лучше, чем проходить через каждый шейдер для запроса данных.Вам не нужно иметь карту из строки в местоположение;у вас просто есть место, где он его ожидает.