2014-11-25 5 views
0

Я пытаюсь рисовать две разные ячейки с помощью OpenGL 4.1. В любой момент времени будет только одна из сеток, и моя цель - переключиться между ними. Я храню данные вершин и индексов для сеток в объекте, который ниже, называется g_obj. Таким образом, данные для первой сетки получают через g_obj-> vertices_ и g_obj-> индексы, а данные для второй сетки получают из g_obj-> vertices_linear_ и g_obj-> indices_linear_.Несколько сеток, несколько VBO, несколько VAO, OpenGL 4.1

Моя ужасная идея состоит в том, чтобы иметь различные VBO и VAO для каждой сетки. Затем в вызове рисования я просто привяжу соответствующее VAO, а затем сделаю glDraw *. Тем не менее, мой код segfaults при первом обратном вызове (см. Ниже).

enum VAO_ID 
{ 
    VAO, 
    VAO_LINEAR, 
    NUM_VAOS 
}; 

enum BUFFER_ID 
{ 
    VERTEX_BUFFER, 
    VERTEX_BUFFER_LINEAR, 
    INDEX_BUFFER, 
    INDEX_BUFFER_LINEAR, 
    NUM_BUFFERS 
}; 

enum ATTRIBUTE_ID 
{ 
    VERTEX_POSITION, 
    VERTEX_COLOR 
}; 

GLuint g_vaos[NUM_VAOS]; 
GLuint g_buffers[NUM_BUFFERS]; 

дальше вниз, я создаю вершина/индексных буферов и массив объектов вершинных:

void bufferGeometry() 
{ 

    // create vertex buffers and vertex array object 
    glGenVertexArrays(NUM_VAOS, g_vaos); 
    glGenBuffers(NUM_BUFFERS, g_buffers); 

    // rotational grating 
    glBindBuffer(GL_ARRAY_BUFFER, g_buffers[VERTEX_BUFFER]); 
    glBufferData(GL_ARRAY_BUFFER, 
       g_obj->num_vertices_ * sizeof(vertex2D), 
       g_obj->vertices_, 
       GL_STATIC_DRAW); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_buffers[INDEX_BUFFER]); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, 
       g_obj->num_indices_ * sizeof(GLushort), 
       g_obj->indices_, 
       GL_STATIC_DRAW); 
    glBindVertexArray(g_vaos[VAO]); 
    glEnableVertexAttribArray(VERTEX_POSITION); 
    glVertexAttribPointer(VERTEX_POSITION, 2, GL_FLOAT, GL_FALSE, 
          sizeof(vertex2D), 
          (const GLvoid *)offsetof(vertex2D, position)); 
    glEnableVertexAttribArray(VERTEX_COLOR); 
    glVertexAttribPointer(VERTEX_COLOR, 4, GL_UNSIGNED_BYTE, GL_FALSE, 
          sizeof(vertex2D), 
          (const GLvoid *)offsetof(vertex2D, color)); 
    glBindVertexArray(0); 

    // linear grating 
    glBindBuffer(GL_ARRAY_BUFFER, g_buffers[VERTEX_BUFFER_LINEAR]); 
    glBufferData(GL_ARRAY_BUFFER, 
       g_obj->num_vertices_linear_ * sizeof(vertex2D), 
       g_obj->vertices_linear_, 
       GL_STATIC_DRAW); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_buffers[INDEX_BUFFER_LINEAR]); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, 
       g_obj->num_indices_linear_ * sizeof(GLushort), 
       g_obj->indices_linear_, 
       GL_STATIC_DRAW); 

    glBindVertexArray(g_vaos[VAO_LINEAR]); 
    glEnableVertexAttribArray(VERTEX_POSITION); 
    glVertexAttribPointer(VERTEX_POSITION, 2, GL_FLOAT, GL_FALSE, 
          sizeof(vertex2D), 
          (const GLvoid *)offsetof(vertex2D, position)); 

    glEnableVertexAttribArray(VERTEX_COLOR); 
    glVertexAttribPointer(VERTEX_COLOR, 4, GL_UNSIGNED_BYTE, GL_FALSE, 
          sizeof(vertex2D), 
          (const GLvoid *)offsetof(vertex2D, color)); 

    glBindVertexArray(0); 

} 

тогда, вот вызов отрисовки:

glBindVertexArray(g_vaos[VAO]); 
g_obj = &g_grating_uno; 
glUseProgram(g_program); 
glUniform3fv(g_trans_scale_location, 1, g_obj->trans_scale_); 
glDrawElements(GL_TRIANGLES, g_obj->num_indices_, 
       GL_UNSIGNED_SHORT, (const GLvoid *)0); 

Какие ошибки сегментации на линии glDrawElements.

Я знаю, что общая стратегия «исполнителя» заключается в том, чтобы собирать данные из обеих сеток в одиночных VBO, а так как формат данных одинаковый между двумя сетками, тогда мне нужен только один VAO. Но, поскольку я ленив, мне было интересно, может ли кто-нибудь понять, почему моя существующая стратегия не работает или не может работать, или если вы считаете, что проблема кроется в другом месте. Я предполагаю, что это связано с моей функцией bufferGeometry(). Я немного слаб в своем понимании того, как VAO связаны с конкретными VBO, если они вообще есть. Спасибо, и извините за тупое!

ответ

0

вы должны повторить вызов, чтобы связать элемент буфера между glBindVertexArray:

glBindVertexArray(g_vaos[VAO]); 
glEnableVertexAttribArray(VERTEX_POSITION); 
glVertexAttribPointer(VERTEX_POSITION, 2, GL_FLOAT, GL_FALSE, 
         sizeof(vertex2D), 
         (const GLvoid *)offsetof(vertex2D, position)); 
glEnableVertexAttribArray(VERTEX_COLOR); 
glVertexAttribPointer(VERTEX_COLOR, 4, GL_UNSIGNED_BYTE, GL_FALSE, 
         sizeof(vertex2D), 
         (const GLvoid *)offsetof(vertex2D, color)); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_buffers[INDEX_BUFFER]); 
glBindVertexArray(0); 

привязка буфера элемента является частью состояния VAO и сбрасывается при присоединении нового VAO.

+0

А, ОК, я тоже попробую. Благодаря! – hobgreenson

0

Ах, установил его (я думаю) путем связывания ВАО перед тем привязки ВБО-х:

void bufferGeometry() 
{ 

    // create vertex buffers and vertex array object 
    glGenVertexArrays(NUM_VAOS, g_vaos); 
    glGenBuffers(NUM_BUFFERS, g_buffers); 

    // rotational grating 
    glBindVertexArray(g_vaos[VAO]); 
    glBindBuffer(GL_ARRAY_BUFFER, g_buffers[VERTEX_BUFFER]); 
    glBufferData(GL_ARRAY_BUFFER, 
       g_obj->num_vertices_ * sizeof(vertex2D), 
       g_obj->vertices_, 
       GL_STATIC_DRAW); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_buffers[INDEX_BUFFER]); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, 
       g_obj->num_indices_ * sizeof(GLushort), 
       g_obj->indices_, 
       GL_STATIC_DRAW); 
    glEnableVertexAttribArray(VERTEX_POSITION); 
    glVertexAttribPointer(VERTEX_POSITION, 2, GL_FLOAT, GL_FALSE, 
          sizeof(vertex2D), 
          (const GLvoid *)offsetof(vertex2D, position)); 
    glEnableVertexAttribArray(VERTEX_COLOR); 
    glVertexAttribPointer(VERTEX_COLOR, 4, GL_UNSIGNED_BYTE, GL_FALSE, 
          sizeof(vertex2D), 
          (const GLvoid *)offsetof(vertex2D, color)); 
    glBindVertexArray(0); 

    // linear grating 
    glBindVertexArray(g_vaos[VAO_LINEAR]); 
    glBindBuffer(GL_ARRAY_BUFFER, g_buffers[VERTEX_BUFFER_LINEAR]); 
    glBufferData(GL_ARRAY_BUFFER, 
       g_obj->num_vertices_linear_ * sizeof(vertex2D), 
       g_obj->vertices_linear_, 
       GL_STATIC_DRAW); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_buffers[INDEX_BUFFER_LINEAR]); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, 
       g_obj->num_indices_linear_ * sizeof(GLushort), 
       g_obj->indices_linear_, 
       GL_STATIC_DRAW); 

    glEnableVertexAttribArray(VERTEX_POSITION); 
    glVertexAttribPointer(VERTEX_POSITION, 2, GL_FLOAT, GL_FALSE, 
          sizeof(vertex2D), 
          (const GLvoid *)offsetof(vertex2D, position)); 

    glEnableVertexAttribArray(VERTEX_COLOR); 
    glVertexAttribPointer(VERTEX_COLOR, 4, GL_UNSIGNED_BYTE, GL_FALSE, 
          sizeof(vertex2D), 
         (const GLvoid *)offsetof(vertex2D, color)); 

    glBindVertexArray(0); 

} 
Смежные вопросы