顶点缓冲区数据到数组顶点数据流

时间:2016-10-22 20:15:15

标签: java opengl-es lwjgl

下面的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);

1 个答案:

答案 0 :(得分:0)

"看起来这个设置是允许多个顶点数据由同一组命令处理" - 是的,您可以通过添加更多包含顶点位置,纹理坐标,顶点颜色等数据的顶点缓冲区对象来传递顶点阵列对象的一次渲染调用。如果要更改发送到着色器的顶点数据(如位置),可以使用作为制服传递的transformation matrix来移动,缩放和旋转对象。但是,如果对象是不同的模型,那么您应该使用不同的vaos。