Update 04-07 and 09 chapters

This commit is contained in:
Mouse
2019-12-27 16:44:15 +08:00
parent 9c0958eb78
commit 41f0fcf136
5 changed files with 8 additions and 51 deletions

View File

@@ -265,7 +265,7 @@ glBindVertexArray(vaoId);
vboId = glGenBuffers(); vboId = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vboId); glBindBuffer(GL_ARRAY_BUFFER, vboId);
glBufferData(GL_ARRAY_BUFFER, verticesBuffer, GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, verticesBuffer, GL_STATIC_DRAW);
memFree(verticesBuffer); glEnableVertexAttribArray(0);
``` ```
接下来是最重要的部分。我们需要定义数据结构并将其储存在VAO的属性列表中这是用下述代码完成的 接下来是最重要的部分。我们需要定义数据结构并将其储存在VAO的属性列表中这是用下述代码完成的
@@ -316,13 +316,11 @@ public void render(Window window) {
// 绑定VAO // 绑定VAO
glBindVertexArray(vaoId); glBindVertexArray(vaoId);
glEnableVertexAttribArray(0);
// 绘制顶点 // 绘制顶点
glDrawArrays(GL_TRIANGLES, 0, 3); glDrawArrays(GL_TRIANGLES, 0, 3);
// 还原状态 // 还原状态
glDisableVertexAttribArray(0);
glBindVertexArray(0); glBindVertexArray(0);
shaderProgram.unbind(); shaderProgram.unbind();

View File

@@ -30,7 +30,8 @@ public class Mesh {
vboId = glGenBuffers(); vboId = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vboId); 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); glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ARRAY_BUFFER, 0);
@@ -79,11 +80,9 @@ public void render(Mesh mesh) {
// 绘制 // 绘制
glBindVertexArray(mesh.getVaoId()); glBindVertexArray(mesh.getVaoId());
glEnableVertexAttribArray(0);
glDrawArrays(GL_TRIANGLES, 0, mesh.getVertexCount()); glDrawArrays(GL_TRIANGLES, 0, mesh.getVertexCount());
// 还原状态 // 还原状态
glDisableVertexAttribArray(0);
glBindVertexArray(0); glBindVertexArray(0);
shaderProgram.unbind(); shaderProgram.unbind();
@@ -232,11 +231,11 @@ FloatBuffer colourBuffer = memAllocFloat(colours.length);
colourBuffer.put(colours).flip(); colourBuffer.put(colours).flip();
glBindBuffer(GL_ARRAY_BUFFER, colourVboId); glBindBuffer(GL_ARRAY_BUFFER, colourVboId);
glBufferData(GL_ARRAY_BUFFER, colourBuffer, GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, colourBuffer, GL_STATIC_DRAW);
memFree(colourBuffer); glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, false, 0, 0); glVertexAttribPointer(1, 3, GL_FLOAT, false, 0, 0);
``` ```
请注意`glVertexAttribPointer`方法的调用第一个参数现在是“1”这是着色器期望数据的位置。当然因为增加了一个VBO所以我们需要在`cleanUp`方法中释放它。 请注意`glVertexAttribPointer`方法的调用第一个参数现在是“1”这是着色器期望数据的位置。当然,由于增加了一个VBO我们需要在`cleanUp`方法中释放它。可以看到我们需要在渲染期间启用位置1处的VAO属性
接下来是修改着色器。顶点着色器现在需要两个参数坐标位置0和颜色位置1。顶点着色器将只输出接收到的颜色以便片元着色器可以对其进行处理。 接下来是修改着色器。顶点着色器现在需要两个参数坐标位置0和颜色位置1。顶点着色器将只输出接收到的颜色以便片元着色器可以对其进行处理。
@@ -271,26 +270,7 @@ void main()
最后要做的是修改渲染代码以使用第二个数据数组: 最后要做的是修改渲染代码以使用第二个数据数组:
```java 我们现在可以将如下所示的颜色数组传递给`Mesh`类,为正方形添加一些颜色。
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`类,给正方形添加点颜色。
```java ```java
float[] colours = new float[]{ float[] colours = new float[]{

View File

@@ -418,14 +418,10 @@ public void render(Window window, GameItem[] gameItems) {
public void render() { public void render() {
// 绘制Mesh // 绘制Mesh
glBindVertexArray(getVaoId()); glBindVertexArray(getVaoId());
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glDrawElements(GL_TRIANGLES, getVertexCount(), GL_UNSIGNED_INT, 0); glDrawElements(GL_TRIANGLES, getVertexCount(), GL_UNSIGNED_INT, 0);
// 重置状态 // 重置状态
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glBindVertexArray(0); glBindVertexArray(0);
} }
``` ```

View File

@@ -236,6 +236,7 @@ textCoordsBuffer = MemoryUtil.memAllocFloat(textCoords.length);
textCoordsBuffer.put(textCoords).flip(); textCoordsBuffer.put(textCoords).flip();
glBindBuffer(GL_ARRAY_BUFFER, vboId); glBindBuffer(GL_ARRAY_BUFFER, vboId);
glBufferData(GL_ARRAY_BUFFER, textCoordsBuffer, GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, textCoordsBuffer, GL_STATIC_DRAW);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, false, 0, 0); glVertexAttribPointer(1, 2, GL_FLOAT, false, 0, 0);
``` ```

View File

@@ -52,26 +52,8 @@ vecNormalsBuffer = MemoryUtil.memAllocFloat(normals.length);
vecNormalsBuffer.put(normals).flip(); vecNormalsBuffer.put(normals).flip();
glBindBuffer(GL_ARRAY_BUFFER, vboId); glBindBuffer(GL_ARRAY_BUFFER, vboId);
glBufferData(GL_ARRAY_BUFFER, vecNormalsBuffer, GL_STATIC_DRAW); 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); glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 3, GL_FLOAT, false, 0, 0);
glDrawElements(GL_TRIANGLES, getVertexCount(), GL_UNSIGNED_INT, 0);
// 恢复状态
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);
glBindVertexArray(0);
glBindTexture(GL_TEXTURE_2D, 0);
``` ```
现在我们已经完成了对`Mesh`类的修改,可以修改代码来使用纹理坐标或固定的颜色。因此,我们需要像这样修改片元着色器: 现在我们已经完成了对`Mesh`类的修改,可以修改代码来使用纹理坐标或固定的颜色。因此,我们需要像这样修改片元着色器: