Я пытаюсь изучить LWJGL (OpenGL), и я должен сказать, что мне тяжело.OpenGL Vertex Array Buffer
Я пытался нарисовать треугольник и квадрат на окне, и я, наконец, смог это сделать.
Но у меня все еще есть вопрос.
Извините, если вопрос звучит глупо для вас, но я не смог найти очень подробный учебник в Интернете, поэтому его трудно понять, так как это первый раз, когда я использую OpenGL.
Это, как говорится, это соответствующая часть кода:
public void init() {
vertexCount = indices.length;
vaoId = GL30.glGenVertexArrays();
GL30.glBindVertexArray(vaoId);
vboId = GL15.glGenBuffers();
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboId);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, coords, GL15.GL_STATIC_DRAW);
GL20.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 0, 0);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
idxVboId = GL15.glGenBuffers();
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, idxVboId);
GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_STATIC_DRAW);
GL30.glBindVertexArray(0);
}
public void render() {
GL30.glBindVertexArray(vaoId);
GL20.glEnableVertexAttribArray(0);
GL11.glDrawElements(GL11.GL_TRIANGLES, vertexCount, GL11.GL_UNSIGNED_INT, 0);
GL20.glDisableVertexAttribArray(0);
GL30.glBindVertexArray(0);
}
Допустим, что программа работает на 60 кадров в секунду.
Это означает, что метод визуализации вызывается игровым циклом 60 раз в секунду.
рендер этапы способа являются:
glBindVertexArray(vaoId)
glEnableVertexAttribArray(0)
- Нарисуйте четырехугольник
glDisableVertexAttribArray(0)
glBindVertexArray(0)
Мой вопрос: Необходимо ли каждый раз вызывать шаги 1, 2, 4 и 5? Если да, то почему?
И тот же вопрос относится к последней строке метода init()
(glBindVertexArray(0)
).
Извините за мой английский, это не мой родной язык.
Спасибо заранее.
Должно быть много предыдущих вопросов, которые охватывают работу VAO. Например, здесь: http://stackoverflow.com/questions/26552642/when-is-what-bound-to-a-vao. Короче говоря: нет, вам это не нужно. Вам нужно всего лишь связать VAO в начале метода рендеринга. И если вы используете только один VAO, вы можете просто привязать его. Состояние не изменяется спонтанно, поэтому, если вы никогда не связываете другое VAO (включая 0), нет необходимости связывать его снова. –