Как работают VASO в OpenGL

Я пытался найти множество учебных пособий и онлайн-документации о ВАО, потому что мне трудно их понять, но это кажется невозможным.

Из того, что я понимаю, предполагается, что если вы вызовете glBindVertexArray, то при вызове метода glBindBuffer связанный буфер будет сохранен в VAO. Поэтому, если вы сделаете это:

glBindVertexArray(VAOs[0]);
glBindBuffer(GL_ARRAY_BUFFER, VBOs[0]);
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_DYNAMIC_DRAW);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,2*sizeof(GLfloat),(void*)0);

Тогда отсюда каждый раз, когда вы делаете это: code glBindVertexArray (VAOs [0]);

Автоматически это будет так, как если бы вы делали это: (Хотя вы не «делаете это», потому что это уже сделано, вы только восстанавливаете буфер, который уже «сделан»)

glBindBuffer(GL_ARRAY_BUFFER, VBOs[0]);
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_DYNAMIC_DRAW);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,2*sizeof(GLfloat),(void*)0);

Но когда я делаю несколько VAO и каждый VAO, я ставлю VBO, по некоторым причинам, когда я ставлю первый, второй или третий VAO, и я проверяю, какой текущий VBO, он остается в последнем VBO, с которым я вызываю метод glBindBuffer. Почему? Я говорю что-то вроде этого:

glBindVertexArray(VAOs[0]);
glBindBuffer(GL_ARRAY_BUFFER, VBOs[0]);
glBindVertexArray(VAOs[1]);
glBindBuffer(GL_ARRAY_BUFFER, VBOs[1]);
glBindVertexArray(VAOs[2]);
glBindBuffer(GL_ARRAY_BUFFER, VBOs[2]);

glBindVertexArray(VAOs[0]);
GLint n;
glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &n);
std::cout << "VBO ACTUAL: " << n << std::endl;//Imprime VBOs[2] pero deberia imprimir VBOs[0]
0
задан 28.01.2017, 20:35
0 ответов

Adivinando un poco sobre la estructura de tus tablas, yo lo haría de la siguiente manera:

UPDATE table.a AS a, 
     (
        SELECT
            id,xcampo
        FROM
            B
        INNER JOIN
            C
        USING (xcampo)
    ) AS b
set a.xcampo = b.xcampo 
WHERE
        a.id = b.id
--- ------121--------27391----

OpenGL es una maquina de estados, esto quiere decir que para utilisar un objeto, en tu caso un VAO, primer debes activarlo, para активист в использовании glBindVertexArray (vao_id) , в настоящее время он выступает за активную деятельность, стремление к свободе и свободе действий (11) ) , когда он является активным, в то время как он заканчивается, cuando завершает работу с утилитой glBindVertexArray (0) .

Puedes ver más tutoriales [11]: http://acodigo.blogspot.com/p/opengl.html

GLuint VAOs[3], VBOs[3];

glGenVertexArrays(3, VAOs);
glGenBuffers(3, VBOs);

glBindVertexArray(VAOs[0]);
glBindBuffer(GL_ARRAY_BUFFER, VBOs[0]);
glBindVertexArray(0);

glBindVertexArray(VAOs[1]);
glBindBuffer(GL_ARRAY_BUFFER, VBOs[1]);
glBindVertexArray(0);

glBindVertexArray(VAOs[2]);
glBindBuffer(GL_ARRAY_BUFFER, VBOs[2]);
glBindVertexArray(0);

glBindVertexArray(VAOs[2]);

GLint n;
glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &n);
std::cout << "VBO ACTUAL: " << n << std::endl;     
0
ответ дан 03.12.2019, 17:23