Chcę obiektu tablicy wierzchołków w OpenGL ES 2.0 trzymania dwóch atrybutów z różnych buforów, drugi bufor są odczytywane z pamięci klienta (glBindBuffer(GL_ARRAY_BUFFER, 0)
), ale pojawia się błąd środowiska wykonawczego:OES_vertex_array_object i klient stan
GLuint my_vao;
GLuint my_buffer_attrib0;
GLfloat attrib0_data[] = { 0, 0, 0, 0 };
GLfloat attrib1_data[] = { 1, 1, 1, 1 };
void init()
{
// setup vao
glGenVertexArraysOES(1, &my_vao);
glBindVertexArrayOES(my_vao);
// setup attrib0 as a vbo
glGenBuffers(1, &my_buffer_attrib0);
glBindBuffer(GL_ARRAY_BUFFER, my_buffer_attrib0);
glBufferData(GL_ARRAY_BUFFER, sizeof(attrib0_data), attrib0_data, GL_STATIC_DRAW);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
// "end" vao
glBindVertexArrayOES(0);
}
void draw()
{
glBindVertexArrayOES(my_vao);
// (now I assume attrib0 is bound to my_buffer_attrib0,
// and attrib1 is not bound. but is this assumption true?)
// setup attrib1
glBindBuffer(GL_ARRAY_BUFFER, 0);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, attrib1_data);
// draw using attrib0 and attrib1
glDrawArrays(GL_POINTS, 0, 1); // runtime error: Thread1: EXC_BAD_ACCESS (code=2, address=0x0)
}
Co chcę osiągnąć jest owinąć wiązanie dwóch atrybutów jako bufor tablicy wierzchołek:
void draw_ok()
{
glBindVertexArrayOES(0);
// setup attrib0
glBindBuffer(GL_ARRAY_BUFFER, my_buffer_attrib0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
// setup attrib1
glBindBuffer(GL_ARRAY_BUFFER, 0);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, attrib1_data);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
// draw using attrib0 and attrib1
glDrawArrays(GL_POINTS, 0, 1); // ok
}
Czy jest możliwe aby związać dwa różne bufory w obiekcie tablicy wierzchołek? Czy obiekty OES_vertex_array_object różnią się od (zwykłych) obiektów tablicy wierzchołków OpenGL? Zauważ też, że dostaję ten błąd w XCode z symulatorem iOS. Są powiązane linki:
- Use of VAO around VBO in Open ES iPhone app Causes EXC_BAD_ACCESS When Call to glDrawElements
- OES_vertex_array_object
Otrzymujesz zaakceptowaną odpowiedź, ponieważ nie jesteś mną, a także odpowiedziałeś, jeśli OES-VAO są takie same jak na komputerach stacjonarnych VAO :) dziękuję. – telephone