Войти
OpenGL communityФорумВопросы по программированию

GLSL передача attribute данных в шейдер.

#0
18:35, 2 окт. 2015

В общем  разбираюсь с шейдерами недавно,  использую  OpenGL 3.x  и C++.    Подскажите будет ли такой метод передачи данных плохим тоном программирования ?

Суть в том что для передачи  координат  и  нормалей я  создаю ВСЕ отдельно друг от друга ,нормально ли это в целом ?

Вообще,мне больше нравиться создать структуру которая содержит все 6 чисел,и потом "расшифровать" ее на координаты и нормали,но как это сделать я не понял, как с одного массива  передать по 3 числа в одну переменную и по 3 в другую ?

Открываю :

GLint  Attrib_vertex;
GLint  Attrib_vertex_2;

GLuint VBO1;
GLuint VBO2;
Далее конектчусь к  переменнім из шейдера.
 // /! Вытягиваем ID атрибута из собранной программы 
  const char* attr_name = "coord";
  Attrib_vertex = glGetAttribLocation(Program, attr_name);
  if(Attrib_vertex == -1)
  {
    std::cout << "could not bind attrib " << attr_name << std::endl;
    return;
  }

    attr_name = "normal";
  Attrib_vertex_2 = glGetAttribLocation(Program, attr_name);
  if(Attrib_vertex_2 == -1)
  {
    std::cout << "could not bind attrib " << attr_name << std::endl;
    return;
  }


Далее заполняю данные:

  glGenBuffers(1, &VBO1);
  glBindBuffer(GL_ARRAY_BUFFER, VBO1);

   vertex triangle[3] = { 
    {0,-1.0f, 1.0f},
    { 0.0f, 1.0f, 1.0f},
    { 1.0f,-1.0f, 1.0f}

  };

  glBufferData(GL_ARRAY_BUFFER, sizeof(triangle), triangle, GL_STATIC_DRAW);

  /////////////////////////

  glGenBuffers(1, &VBO2);
  glBindBuffer(GL_ARRAY_BUFFER, VBO2);


   vertex normals[3] = { 
    {0,-1.0f, 1.0f},
    { 0.0f, 1.0f, 1.0f},
    { 10.0f,-1.0f, 1.0f}

  };


  //! Передаем вершины в буфер
  glBufferData(GL_ARRAY_BUFFER, sizeof(normals), normals, GL_STATIC_DRAW);

И  Передаю Вот так :    (а хотелось бы обойтись без VBO2, просто передавать по 3 числа туда и туда)

   // ! Подключаем VBO
    glBindBuffer(GL_ARRAY_BUFFER, VBO1);
      // ! Указывая pointer 0 при подключенном буфере, мы указываем, что данные представлены в VBO
      glVertexAttribPointer(Attrib_vertex, 3, GL_FLOAT, GL_FALSE, 0, 0);
    // ! Отключаем VBO
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    // ! Включаем массив атрибутов
  glEnableVertexAttribArray(Attrib_vertex_2);

     // ! Подключаем VBO
    glBindBuffer(GL_ARRAY_BUFFER, VBO2);
      // ! Указывая pointer 0 при подключенном буфере, мы указываем, что данные представлены в VBO
      glVertexAttribPointer(Attrib_vertex_2, 3, GL_FLOAT, GL_FALSE, 0, 0);
    // ! Отключаем VBO
    glBindBuffer(GL_ARRAY_BUFFER, 0);

#1
18:39, 2 окт. 2015

Начни вот отсюда, например
Tutorial2
Также полезно будет почитать оттуда по ссылке: VBO

#2
18:43, 2 окт. 2015

Да прямо тут уровнем выше лежит урок как делать интерлейсед данные вершин http://www.gamedev.ru/community/ogl/articles/lesson02

Edit: Подсказка: glVertexAttribPointer принимает на вход не только размер атрибута, но и смещение его в буфере.

OpenGL communityФорумВопросы по программированию

Тема в архиве.