簡體   English   中英

VBO和VAO沒有繪制opengl和LWJGL3

[英]VBO and VAO not drawing opengl and LWJGL3

我已經在開放式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();
    }
}

順便說一句用glBegin繪制它,所以可以工作,但是對於我想做的事情效率不高。

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

如果不使用着色器程序,則必須使用glVertexPointer所期望的方式來定義頂點數據的數組,並且必須通過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);

還要注意,客戶端功能(或頂點屬性數組)的狀態以及對索引(元素)緩沖區的引用存儲在“ 頂點數組對象”的狀態向量中。 因此,當指定了頂點數組對象時啟用頂點坐標並在綁定頂點數組對象時對索引緩沖區進行出價就足夠了。 在繪制幾何圖形時,可以省略啟用和禁用頂點坐標以及綁定索引緩沖區的操作:

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);    // <--------------
glEnableClientState( GL_VERTEX_ARRAY );     // <--------------
glBindBuffer(GL_ARRAY_BUFFER, 0);

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

glBindVertexArray(vao);

glDrawElements(GL_TRIANGLES, size, GL_UNSIGNED_INT, 0);

glBindVertexArray(0);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM