mirror of
https://github.com/mouse0w0/lwjglbook-CN-Translation.git
synced 2025-08-22 20:25:29 +08:00
Update 04-07 and 09 chapters
This commit is contained in:
@@ -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();
|
||||
|
@@ -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[]{
|
||||
|
@@ -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);
|
||||
}
|
||||
```
|
||||
|
@@ -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);
|
||||
```
|
||||
|
||||
|
@@ -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`类的修改,可以修改代码来使用纹理坐标或固定的颜色。因此,我们需要像这样修改片元着色器:
|
||||
|
Reference in New Issue
Block a user