glUniformРасположение массивов - PullRequest
0 голосов
/ 03 июня 2018

Я пытаюсь сохранить единообразные расположения массива в std :: map в моем классе шейдеров.

В моем вершинном шейдере есть униформа массива для mat4.

uniform mat4 bone_matrices[32];

В следующем коде имя костных матриц отображается как bone_matrices [0].Так что я получаю только местоположение для первого члена массива.[Я думаю, что остальные последовательны.]

class Shader
{
...
private:
    GLuint mi_program;
    std::map<std::string, GLint> m_maplocations;
};


void Shader::mapLocations()
{
  GLint numUniforms = 0;
  const GLenum properties[5] = {GL_BLOCK_INDEX, GL_TYPE, GL_NAME_LENGTH, GL_LOCATION, GL_ARRAY_SIZE};
  glGetProgramInterfaceiv(mi_program, GL_UNIFORM, GL_ACTIVE_RESOURCES, &numUniforms);

  for(int unif = 0; unif < numUniforms; ++unif)
    {
      GLint values[5];
      glGetProgramResourceiv(mi_program, GL_UNIFORM, unif, 5, properties, 5, NULL, values);

      // Skip any uniforms that are in a block.
      if(values[0] != -1)
        continue;

      std::string nameData;
      nameData.resize(values[2]);

    if(values[4] > 1)
        {
         // **have an array here**
        }

      glGetProgramResourceName(mi_program, GL_UNIFORM, unif, nameData.size(), NULL, &nameData[0]);
      std::string name(nameData.begin(), nameData.end() - 1);
      m_maplocations.insert(std::pair<std::string, GLint>(name, values[3]));
    }
}

Как я могу перебрать массив bone_matrices, получить их имена: bone_matrices [0], bone_matrices [1], ... и местоположения.Спасибо ..

1 Ответ

0 голосов
/ 03 июня 2018

Как я могу перебрать массив 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.

Да, это означает, что вам нужно разделить свое единое пространство.Но это намного лучше, чем проходить через каждый шейдер для запроса данных.Вам не нужно иметь карту из строки в местоположение;у вас просто есть место, где он его ожидает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...