diff --git a/docs/04-rendering.md b/docs/04-rendering.md index c6dd343..92804de 100644 --- a/docs/04-rendering.md +++ b/docs/04-rendering.md @@ -265,7 +265,7 @@ glBindVertexArray(vaoId); vboId = glGenBuffers(); glBindBuffer(GL_ARRAY_BUFFER, vboId); glBufferData(GL_ARRAY_BUFFER, verticesBuffer, GL_STATIC_DRAW); -memFree(verticesBuffer); +glEnableVertexAttribArray(0); ``` 接下来是最重要的部分。我们需要定义数据结构,并将其储存在VAO的属性列表中,这是用下述代码完成的: @@ -316,13 +316,11 @@ public void render(Window window) { // 绑定VAO glBindVertexArray(vaoId); - glEnableVertexAttribArray(0); // 绘制顶点 glDrawArrays(GL_TRIANGLES, 0, 3); // 还原状态 - glDisableVertexAttribArray(0); glBindVertexArray(0); shaderProgram.unbind(); diff --git a/docs/05-more-on-rendering.md b/docs/05-more-on-rendering.md index ab4c66d..59ce7a0 100644 --- a/docs/05-more-on-rendering.md +++ b/docs/05-more-on-rendering.md @@ -30,7 +30,8 @@ public class Mesh { vboId = glGenBuffers(); glBindBuffer(GL_ARRAY_BUFFER, vboId); - glBufferData(GL_ARRAY_BUFFER, verticesBuffer, GL_STATIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, verticesBuffer, GL_STATIC_DRAW); + glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0); glBindBuffer(GL_ARRAY_BUFFER, 0); @@ -79,11 +80,9 @@ public void render(Mesh mesh) { // 绘制 glBindVertexArray(mesh.getVaoId()); - glEnableVertexAttribArray(0); glDrawArrays(GL_TRIANGLES, 0, mesh.getVertexCount()); // 还原状态 - glDisableVertexAttribArray(0); glBindVertexArray(0); shaderProgram.unbind(); @@ -232,11 +231,11 @@ FloatBuffer colourBuffer = memAllocFloat(colours.length); colourBuffer.put(colours).flip(); glBindBuffer(GL_ARRAY_BUFFER, colourVboId); glBufferData(GL_ARRAY_BUFFER, colourBuffer, GL_STATIC_DRAW); -memFree(colourBuffer); +glEnableVertexAttribArray(1); glVertexAttribPointer(1, 3, GL_FLOAT, false, 0, 0); ``` -请注意`glVertexAttribPointer`方法的调用,第一个参数现在是“1”,这是着色器期望数据的位置。当然,因为增加了一个VBO,所以我们需要在`cleanUp`方法中释放它。 +请注意`glVertexAttribPointer`方法的调用,第一个参数现在是“1”,这是着色器期望数据的位置。(当然,由于增加了一个VBO,我们需要在`cleanUp`方法中释放它)。可以看到,我们需要在渲染期间启用位置1处的VAO属性。 接下来是修改着色器。顶点着色器现在需要两个参数,坐标(位置0)和颜色(位置1)。顶点着色器将只输出接收到的颜色,以便片元着色器可以对其进行处理。 @@ -271,26 +270,7 @@ void main() 最后要做的是修改渲染代码以使用第二个数据数组: -```java -public void render(Window window, Mesh mesh) { - clear(); - - if ( window.isResized() ) { - glViewport(0, 0, window.getWidth(), window.getHeight()); - window.setResized(false); - } - - shaderProgram.bind(); - - // 绘制网格 - glBindVertexArray(mesh.getVaoId()); - glEnableVertexAttribArray(0); - glEnableVertexAttribArray(1); - glDrawElements(GL_TRIANGLES, mesh.getVertexCount(), GL_UNSIGNED_INT, 0); - // ... -``` - -在渲染过程中,你可以看到我们需要启用位于位置1的VAO属性。现在可以将如下所示颜色数组传给`Mesh`类,给正方形添加点颜色。 +我们现在可以将如下所示的颜色数组传递给`Mesh`类,为正方形添加一些颜色。 ```java float[] colours = new float[]{ diff --git a/docs/06-transformations.md b/docs/06-transformations.md index c2670af..e6f7f8d 100644 --- a/docs/06-transformations.md +++ b/docs/06-transformations.md @@ -418,14 +418,10 @@ public void render(Window window, GameItem[] gameItems) { public void render() { // 绘制Mesh glBindVertexArray(getVaoId()); - glEnableVertexAttribArray(0); - glEnableVertexAttribArray(1); glDrawElements(GL_TRIANGLES, getVertexCount(), GL_UNSIGNED_INT, 0); // 重置状态 - glDisableVertexAttribArray(0); - glDisableVertexAttribArray(1); glBindVertexArray(0); } ``` diff --git a/docs/07-textures.md b/docs/07-textures.md index 9e65c6a..d59aabc 100644 --- a/docs/07-textures.md +++ b/docs/07-textures.md @@ -236,6 +236,7 @@ textCoordsBuffer = MemoryUtil.memAllocFloat(textCoords.length); textCoordsBuffer.put(textCoords).flip(); glBindBuffer(GL_ARRAY_BUFFER, vboId); glBufferData(GL_ARRAY_BUFFER, textCoordsBuffer, GL_STATIC_DRAW); +glEnableVertexAttribArray(1); glVertexAttribPointer(1, 2, GL_FLOAT, false, 0, 0); ``` diff --git a/docs/09-loading-more-complex-models.md b/docs/09-loading-more-complex-models.md index 2a60cdd..d8ec57c 100644 --- a/docs/09-loading-more-complex-models.md +++ b/docs/09-loading-more-complex-models.md @@ -52,26 +52,8 @@ vecNormalsBuffer = MemoryUtil.memAllocFloat(normals.length); vecNormalsBuffer.put(normals).flip(); glBindBuffer(GL_ARRAY_BUFFER, vboId); glBufferData(GL_ARRAY_BUFFER, vecNormalsBuffer, GL_STATIC_DRAW); -glVertexAttribPointer(2, 3, GL_FLOAT, false, 0, 0); -``` - -在`render`方法中,我们必须在渲染之前启用此VBO并在完成后禁用它。 - -```java - // 绘制网格 -glBindVertexArray(getVaoId()); -glEnableVertexAttribArray(0); -glEnableVertexAttribArray(1); glEnableVertexAttribArray(2); - -glDrawElements(GL_TRIANGLES, getVertexCount(), GL_UNSIGNED_INT, 0); - -// 恢复状态 -glDisableVertexAttribArray(0); -glDisableVertexAttribArray(1); -glDisableVertexAttribArray(2); -glBindVertexArray(0); -glBindTexture(GL_TEXTURE_2D, 0); +glVertexAttribPointer(2, 3, GL_FLOAT, false, 0, 0); ``` 现在我们已经完成了对`Mesh`类的修改,可以修改代码来使用纹理坐标或固定的颜色。因此,我们需要像这样修改片元着色器: