【发布时间】:2016-05-08 15:39:45
【问题描述】:
我正在尝试学习 LWJGL (OpenGL),我不得不说我很难。
我试图在窗口上画一个三角形和一个四边形,我终于成功了。
但我还有一个问题。
如果这个问题对你来说听起来很愚蠢,请提前抱歉,但我无法在网上找到非常详细的教程,所以很难理解,因为这是我第一次使用 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 fps 运行。
这意味着游戏循环每秒调用渲染方法 60 次。
渲染方法步骤为:
glBindVertexArray(vaoId)glEnableVertexAttribArray(0)- 画四边形
glDisableVertexAttribArray(0)glBindVertexArray(0)
我的问题是:是否需要每次都调用步骤 1、2、4 和 5?如果是,为什么?
同样的问题也适用于 init() 方法的最后一行 (glBindVertexArray(0))。
对不起,我的英语不是我的母语。
提前致谢。
【问题讨论】:
-
应该有很多以前的问题涵盖了 VAO 的工作原理。例如这里:stackoverflow.com/questions/26552642/…。简而言之:不,你不需要这些。您只需要在 render 方法的开头绑定 VAO。如果你只使用一个 VAO,你可以保持绑定。状态不会自发改变,所以如果你从不绑定不同的 VAO(包括 0),就不需要再次绑定。