VBO和VAO没有绘制opengl和LWJGL3

时间:2018-07-26 23:03:38

标签: java opengl lwjgl

我已经在使用开放式GL了一段时间,现在我可以绘制3d形状了。我的形状,顶点和索引绝对正确,并且形状变得混乱。我现在要重做我的绘图。我曾经只使用不带VAO的VBO,而只是绑定并绘制它们。这可行,但是我怀疑这是我的错误。因此,我开始使用VAO,但我看不到任何代码错误,而且仍然无法绘制出我的白色正方形(没有像wiki教程那样的着色器)。

我用于初始化窗口的代码在这里:

private void initWindow() {
    //Makes sure window can work
    if (!glfwInit()) {
        throw new IllegalStateException("Failed to Initialize GLFW!");
    }

    //Create window object and set its hints
    glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);

    this.windowRef = glfwCreateWindow(width, height, name, NULL, NULL);

    if (windowRef == 0) {
        throw new IllegalStateException("Failed to create Window!");
    }

    GLFWVidMode videoMode = glfwGetVideoMode(glfwGetPrimaryMonitor());
    glfwSetWindowPos(windowRef, (videoMode.width() - width) / 2, (videoMode.height() - height) / 2);

    // Make the OpenGL context current
    glfwMakeContextCurrent(windowRef);
    // Enable v-sync
    glfwSwapInterval(1);

    //Make GL capabilites for window
    GL.createCapabilities();
    glfwShowWindow(windowRef);
}

我用于初始化缓冲区和对象的代码在这里

public void loadGL() {
    float[] vertex = {
        0f, 0f, 0f, //0
        0.5f, 0, 0, //1
        0.5f, 0, 0.5f, //2
        0f, 0f, 0.5f, //3
        0f, 0.5f, 0f, //4
        0.5f, 0.5f, 0, //5
        0.5f, 0.5f, 0.5f,//6
        0f, 0.5f, 0.5f//7
    };

    int[] index = {
        0, 1, 2, //0
        0, 2, 3, //1
        0, 3, 4, //2
        3, 7, 4,//3
        0, 4, 1,//4
        1, 5, 4,//5
        1, 5, 2,//6
        2, 6, 5,//7
        2, 3, 6,//8
        3, 7, 6,//9
        4, 5, 7,//10
        5, 6, 7//11
    };
    size = 12*3;

    indicesBuff = BufferUtils.createIntBuffer(index.length);
    vertBuff = BufferUtils.createFloatBuffer(vertex.length);
    indicesBuff.put(index);
    vertBuff.put(vertex);
    indicesBuff.flip();
    vertBuff.flip();

    vao = glGenVertexArrays();
    glBindVertexArray(vao);

    vboID = glGenBuffers();
    glBindBuffer(GL_ARRAY_BUFFER, vboID);
    glBufferData(GL_ARRAY_BUFFER, vertBuff, GL_STATIC_DRAW);
    GL20.glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    ibo = glGenBuffers();
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicesBuff, GL_STATIC_DRAW);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    glBindVertexArray(0);

}

最后我的主循环在这里,在窗口初始化之后调用:

    private void mainLoop() {
    loadGL();
    glClearColor(0.5f, 0.5f, 0.5f, 1);
    while (!glfwWindowShouldClose(windowRef)) {

        //Render Stuff here
        //TODO: later skip this block if nothing has changed
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear 
the framebuffer

        glBindVertexArray(vao);
        glEnableVertexAttribArray(0);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);

        glDrawElements(GL_TRIANGLES, size, GL_UNSIGNED_INT, 0);

//            glBegin(GL_QUADS);
//            glVertex3f(-0.5f, -0.5f, 0);
//            glVertex3f(-0.5f, 0.5f, 0);
//            glVertex3f(0.5f, -0.5f, 0);
//            glVertex3f(0.5f, 0.5f, 0);
//            glEnd();

        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
        glDisableVertexAttribArray(0);
        glBindVertexArray(0);

        glfwSwapBuffers(windowRef);
        glfwPollEvents();
    }
}

btw用glBegin绘制它,因此可以工作,但是对于我想做的事情效率不高。

1 个答案:

答案 0 :(得分:0)

在OpenGL中进行渲染的现代方法是使用Shader程序。

如果您不使用着色器程序,则必须使用glVertexPointer所期望的方式来定义顶点数据的数组,并且必须通过{{3 }}:

git push -u origin master

Note 1 : f(n) "grows the same rate as" (or O minus) g(n) and g(n) "grows the same rate as" (or O minus) h(n). therefore h(n) grows the same rate as f(n)
Note 2:f(n) = O(g(n)) and g(n) = O(x(n)) => f(n) = O(x(n)) or x(n) = omega(f(n)
Note 3: f(X*nlog(n)) = O(n(logXn))

还要注意,客户端功能(或顶点属性数组)的状态和对索引(元素)缓冲区的引用存储在glEnableClientState( GL_VERTEX_ARRAY )的状态向量中。 因此,当指定了顶点数组对象时启用顶点坐标并在绑定顶点数组对象时对索引缓冲区进行出价就足够了。在绘制几何图形时,可以省略启用和禁用顶点坐标以及绑定索引缓冲区的操作:

vao = glGenVertexArrays();
glBindVertexArray(vao);

vboID = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glBufferData(GL_ARRAY_BUFFER, vertBuff, GL_STATIC_DRAW);
GL20.glVertexPointer(3, GL_FLOAT, 0, 0);  // <--------------
glBindBuffer(GL_ARRAY_BUFFER, 0);

 glBindVertexArray(vao);
 glEnableClientState( GL_VERTEX_ARRAY );   // <--------------
 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);

 glDrawElements(GL_TRIANGLES, size, GL_UNSIGNED_INT, 0);

 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
 glDisableClientState( GL_VERTEX_ARRAY ); // <---------------
 glBindVertexArray(0);