2016-11-17 1 views
0

OpenGL 3.3의 창에 두 개의 삼각형을 그리려합니다. 나는 윈도우 시스템에 GLFW 라이브러리를 사용하고 있습니다.두 개의 VBO가 포함 된 하나의 VAO 렌더링

내가 이해, 나는이 두 VBOs를 포함 이 VBOs (각 삼각형 하나)하나 VAO가 있어야에서. 그게 내가 한 짓이야.

그러나이 두 VBO를 렌더링하기 위해 어떤 호출을해야하는지 알 수 없습니다. 사실, 내가하는 일은 첫 번째 VBO (첫 번째 삼각형) 만 그려집니다.. 두 번째는 결코 나타나지 않습니다.

int main() 
{ 
    GLFWwindow *window = setupWindow(); 
    GLfloat triangle1Vertices[] = { 
     -0.5f, -0.5f, 0.0f, 
     0.5f, -0.5f, 0.0f, 
     0.0f, 0.5f, 0.0f 
    }; 
    GLfloat triangle2Vertices[] = { 
     0.f, -0.5f, 0.0f, 
     0.8f, -0.5f, 0.0f, 
     0.0f, 0.5f, 0.0f 
    }; 
    GLuint vao, vbo[2]; 

    glGenVertexArrays(1, &vao); 
    glGenBuffers(2, vbo); 

    glBindVertexArray(vao); 

    glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(triangle1Vertices), triangle1Vertices, GL_STATIC_DRAW); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); 
    glEnableVertexAttribArray(0); 

    glBindBuffer(GL_ARRAY_BUFFER, vbo[1]); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(triangle2Vertices), triangle2Vertices, GL_STATIC_DRAW); 
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); 
    glEnableVertexAttribArray(1); 

    glBindBuffer(GL_ARRAY_BUFFER, 0); 
    glBindVertexArray(0); 

    while (!glfwWindowShouldClose(window)) 
    { 
     glfwPollEvents(); 

     glClearColor(0.3f, 0.3f, 0.5f, 1.0f); 
     glClear(GL_COLOR_BUFFER_BIT); 


     glBindVertexArray(vao); 

     glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); 
     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); 
     glDrawArrays(GL_TRIANGLES, 0, 3); 

     glBindBuffer(GL_ARRAY_BUFFER, vbo[1]); 
     glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); 
     glDrawArrays(GL_TRIANGLES, 0, 3); 

     glBindVertexArray(0); 


     glfwSwapBuffers(window); 
    } 

    glDeleteVertexArrays(1, &vao); 
    glDeleteBuffers(2, vbo); 

    glfwTerminate(); 

    return 0; 
} 

분명히 뭔가가 빠졌습니다.

+0

은'glVertexAttribPointer' 렌더링 루프에서 매우 의심스러운. VAO 사용의 요점은 파이프 라인의 입력을 한 번만 설정 한 다음'bind vao;를 수행하는 것입니다. 무승부; 다른 바오와 묶으 라. 그려라. 그럼에도 불구하고 속성을 다시 설정하는 이유는 무엇입니까 (그럼에도 불구하고 동일한 버퍼/형식으로)? – peppe

+0

둘째, 버텍스 쉐이더는 어떻게 생겼습니까? 어떤 위치에 입력이 필요합니까? 그리고 쉐이더는 그리기를 원하는 삼각형에 따라 다른 위치가 아닌 한 위치에서 오는 속성을 처리해야한다는 것을 어떻게 알 수 있습니까? – peppe

답변

2

내가 알기로는 두 개의 VBO (각 삼각형에 하나씩)와 두 개의 VBO가 들어있는 하나의 VAO가 있어야합니다.

귀하의 이해가 잘못되었습니다.

두 개의 서로 다른 삼각형이있는 두 개의 서로 다른 버퍼를 갖고 싶다면 두 개의 다른 VAO가 필요하거나 VAO가 각 개체를 렌더링 할 때 사용할 버퍼를 바꿔야합니다.

귀하의 렌더링 코드 수정에 가까운,하지만 꽤 :

두 번째 glVertexAttribPointer 전화뿐만 아니라 속성 0을 사용하는
glBindVertexArray(vao); 

    glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 

    glBindBuffer(GL_ARRAY_BUFFER, vbo[1]); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 

Notive. glVertexAttribPointer에 전달하는 속성 인덱스는 해당 배열에서 제공되는 셰이더 입력 변수를 지정합니다. 당신이하려고하는 것은 동일한 셰이더를 사용하여 두 번째 객체를 렌더링하고, 꼭지점 배열의 출처 만 변경하는 것입니다. 그리고 그것은 동일한 속성 색인을 사용해야합니다.

그러나 OpenGL 4.3/ARB_vertex_attrib_binding을 사용할 수있는 경우 I would highly encourage you to just use those APIs. 루프에서, 그리고

//vertex setup 
glGenVertexArrays(1, &vao); 

glBindVertexArray(vao); 
//Sets up the format, *without* a buffer object. 
glVertexAttribFormat(0, 3, GL_FLOAT, GL_FALSE, 0); 
//Sets up where the buffer object comes from 
glVertexAttribBinding(0, 0); 
//Done with VAO 
glBindVertexArray(0); 

//Set up buffer object data storage. 
glGenBuffers(2, vbo); 
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); 
glBufferData(GL_ARRAY_BUFFER, sizeof(triangle1Vertices), triangle1Vertices, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, vbo[1]); 
glBufferData(GL_ARRAY_BUFFER, sizeof(triangle2Vertices), triangle2Vertices, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

: 그것은 훨씬 더 간단한 코드를 만드는

glBindVertexArray(vao); 

//Use buffer 0 to render. 
glBindVertexBuffer(0, vbo[0], 0, 3 * sizeof(float)); 
glDrawArrays(GL_TRIANGLES, 0, 3); 
//Use buffer 1 to render. 
glBindVertexBuffer(0, vbo[1], 0, 3 * sizeof(float)); 
glDrawArrays(GL_TRIANGLES, 0, 3); 

glBindVertexArray(0); 
관련 문제