Я пытаюсь рисовать две разные ячейки с помощью 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, если они вообще есть. Спасибо, и извините за тупое!
А, ОК, я тоже попробую. Благодаря! – hobgreenson