LINUX.ORG.RU

vbo, vao и шейдеры

 , , ,


0

1

Всем привет! Требуется отправить 6 вершин в GPU. А далее выводить сначала как два анимированных треугольника: (1,2,3)(3,4,1). Потом, тоже как два треугольника, но (4,1,2)(2,3,4). Как сделать так, чтобы не обновлять геометрию в основной программе, т.е. не очищать vao и создавать новый буфер (по сути из тех же самых вершин), и снова его отправлять в GPU. Может индексация тут поможет (можно ли обновлять только буфер индексов?) или в геометрическом шейдере что-то надо делать.

PS: opengl-4


Можно через атрибуты glVertexAttribPointer(); типа на вскидку, это по старинке.

  float positions[] = {позиции} /*можно разместить тут позиции 2х трукгольников*/
  int offset = 0; /*по умолчанию ноль для первого*/
  if (triag_one) 
  {
     offset = смещение_до_второго;
  }
  GLint attr = glGetAttribLocation(shader_program, "my_triangle_vpos");
  glEnableVertexAttribArray(attr);  
  glVertexAttribPointer(attr, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, positions+offset);

  glDrawArrays(GL_LINE_STRIP, 0, 3);

  glDisableVertexAttribArray(attr);  

В вершинном шейдере уже будет

attribute vec3 my_triangle_vpos;

Можно через VAO просто сунь два треугольника в VBO и переключай смещением в VAO из какой части VBO будут данные браться, тоже самое что и с массивом атрибутов только вид с боку https://eax.me/opengl-vbo-vao-shaders/

LINUX-ORG-RU ★★★★★
()

Сейчас взорву твой мозг: Для одного буфера вершин ты можешь создать сколько угодно разных буферов индексов и дальше просто их биндить. В данном случае достаточно двух:

  1. [1, 2, 3, 3, 4, 1]
  2. [4, 1, 2, 2, 3, 4]
anonymous-angler ★☆
()