2016-10-22 140 views
0

下面的LWJGL 3代码设置了渲染三角形的缓冲区等。我能看到三角形。现在我正试图了解到底发生了什么。顶点缓冲区数据到数组顶点数据流

以下是我对以下代码的理解。我们首先创建一个顶点缓冲对象,它只是一个数组数组的容器。 glBindBuffer()和glBufferData()用顶点数组填充顶点缓冲区对象。我们再次为第二个顶点数组执行此操作。然后,我们编译顶点和片段着色器并将它们添加到着色器程序中。不知何故,该程序访问第二个顶点缓冲区对象中的数据。

那么我们绑定一个顶点数组对象。我们使用着色器程序的输出来填充它,该程序处理来自第二个顶点缓冲区对象的顶点数据。

问题

它看起来像这样设置是为了让顶点数据的多块由相同的命令集进行处理。我会在代码的最后放置什么命令来传递第一个顶点数据,而不是第二个。我是否必须为每个顶点缓冲区对象创建一个单独的顶点数组对象,或者可以向管道发送不同的缓冲区并保持相同的顶点数组对象?

代码

这是我在上文引用的代码: 首先,变量是:

//The vertices of a triangle 
float[] vertices = new float[] { 
     0.0f, 0.5f, 
     0.5f, -0.5f, 
     -0.5f, -0.5f 
}; 

//Vertices of the second triangle 
float[] vertices2 = new float[] { 
     0.0f, 0.9f, 
     0.5f, -0.5f, 
     -0.5f, -0.5f 
}; 

//The source for the vertex shader 
String vertexShaderSrc = 
     "#version 300 es\n\n" + 
     "precision mediump float;\n" + 
     "in vec2 position;\n\n" + 
     "void main()\n" + 
     "{\n" + 
      "gl_Position = vec4(position, 0.0, 1.0);\n" + 
     "}"; 

int vertexShader; 

//The source for the fragment shader 
String fragmentShaderSrc = 
     "#version 300 es\n\n" + 
     "precision mediump float;\n" + 
     "out vec4 outColor;\n\n" + 
     "void main()\n" + 
     "{\n" + 
      "outColor = vec4(1.0, 1.0, 1.0, 1.0);\n" + 
     "}"; 
int fragmentShader; 
int shaderProgram; 
//The position attribute 
int posAttrib; 

//A vertex buffer object handle. 
int vbo; 

//A second vertex buffer object handle. 
int vbo2; 

//A vertex array object handle. 
int vao; 

使用它们的代码段:

vbo = glGenBuffers(); 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glBufferData(GL_ARRAY_BUFFER, vertices, GL_STATIC_DRAW); 

vbo2 = glGenBuffers(); 
glBindBuffer(GL_ARRAY_BUFFER, vbo2); 
glBufferData(GL_ARRAY_BUFFER, vertices2, GL_STATIC_DRAW); 


vertexShader = glCreateShader(GL_VERTEX_SHADER); 
glShaderSource(vertexShader, vertexShaderSrc); 
glCompileShader(vertexShader); 

System.out.println(glGetShaderInfoLog(vertexShader)); 

fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); 
glShaderSource(fragmentShader, fragmentShaderSrc); 
glCompileShader(fragmentShader); 

System.out.println(glGetShaderInfoLog(fragmentShader)); 

shaderProgram = glCreateProgram(); 
glAttachShader(shaderProgram, vertexShader); 
glAttachShader(shaderProgram, fragmentShader); 
glBindFragDataLocation(shaderProgram, 0, "outColor"); 
glLinkProgram(shaderProgram); 
glUseProgram(shaderProgram); 

vao = glGenVertexArrays(); 
glBindVertexArray(vao); 

posAttrib = glGetAttribLocation(shaderProgram, "position"); 
glVertexAttribPointer(posAttrib, 2, GL_FLOAT, false, 0, 0); 
glEnableVertexAttribArray(posAttrib); 

回答

0

“这看起来像这样的设置是允许多块顶点数据被同一组命令处理“ - 是的,你可以传递机智h通过添加更多包含顶点位置,纹理坐标,顶点颜色等数据的顶点缓冲区对象来渲染顶点数组对象的调用。如果要更改发送到着色器位置的顶点数据,可以使用以统一方式传递的transformation matrix来移动,缩放和旋转对象。但是,如果对象是不同的模型,那么你应该使用不同的vaos。