2016-07-07 1 views
1

현재 VBO 데이터를 지속적으로 업데이트해야하는 프로그램을 작성 중입니다. 그러나 버퍼를 초기화 한 후 glBindBuffer(GL_ARRAY_BUFFER, 0)을 호출하면 어떻게 든 창이 닫히는 것을 알았습니다. 점은 지속적으로 업데이트됩니다 참고OpenGL - VBO가 변경되었음을 버텍스 쉐이더에 알리기

glGenBuffers(1, &vertex_buffer); 
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(pts[0]) * pts.size(), NULL, GL_DYNAMIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

vertex_shader = glCreateShader(GL_VERTEX_SHADER); 
glShaderSource(vertex_shader, 1, &vertex_shader_text, NULL); 
glCompileShader(vertex_shader); 

fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); 
glShaderSource(fragment_shader, 1, &fragment_shader_text, NULL); 
glCompileShader(fragment_shader); 

program = glCreateProgram(); 
glAttachShader(program, vertex_shader); 
glAttachShader(program, fragment_shader); 
glLinkProgram(program); 

mvp_location = glGetUniformLocation(program, "MVP"); 
vpos_location = glGetAttribLocation(program, "vPos"); 

glEnableVertexAttribArray(vpos_location); 
glVertexAttribPointer(vpos_location, 3, GL_FLOAT, GL_FALSE, 
     sizeof(float) * 3, (void*) 0); 

while(!glfwWindowShouldClose(window)) { 
    glUseProgram(program); 

    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer); 
    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(pts[0]) * pts.size(), &pts); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 

    mat4x4_mul(mvp, m, p); 

    glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat*) mvp); 

    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer); 
    glDrawArrays(GL_POINTS, 0, pts.size()); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 

    glfwSwapBuffers(window); 
    glfwPollEvents(); 
} 

: 다음은 내 코드입니다.

거기에 VBO 데이터가 업데이트되었다는 사실을 버텍스 쉐이더에게 알려주는 방법이 있습니까?

편집 : 업데이트 된 코드

편집 : 나는 정점마다의 pts.size() 수를 그릴 생각하지만, 당신이 어디에서 하나의 지점이 드로우 호출하기 전에 화면

+4

그리기 전에 왜'glBindBuffer'를 호출합니까? –

+0

방금 ​​glBindBuffer가 버퍼의 데이터를 플러시한다고 말하는 튜토리얼을 따라갔습니다. – SydC

+2

이 튜토리얼에 대한 링크를 제공합니다. 나는 그것이 당신이 말한 것과 오해하고 있거나 자습서가 어리 석다는 것을 의심합니다. 어쨌든, 당신은 여전히 ​​[mcve]를 제공 할 필요가 있습니다. 그리고 위의 스 니펫은 무슨 일이 일어나고 있는지를 알기에는 너무 많은 것들이 빠져 있습니다. –

답변

1

오른쪽에 나타났다가 있어요 glBindBuffer (GL_ARRAY_BUFFER, vertex_buffer); 실제로 attrib 포인터 (glVertexAttribPointer())를 설정해야합니다. 보조 노트는 GlVertexAttribPointer()가 GL_ARRAY_BUFFER를 지정된 속성 포인터에 바인딩한다는 것입니다. 현재 전화를 걸면 GL_ARRAY_BUFFER에 바인딩 된 것이 없습니다.

참고로 GLEnum error = glGetError()는 openGL의 오류 상태를 반환하며 강력한 디버깅 도구입니다. glew를 사용하는 경우 glewGetErrorString()은 오류를 자세히 설명하는 0이 아닌 오류 코드에 대한 문자열을 가져옵니다.

p.s. 내 가난한 작문 기술에 대해 유감스럽게 생각합니다.

+1

대부분이 잘못되었습니다. 꼭지점 속성 상태는 활성화 된 프로그램과는 완전히 독립적이므로'glUseProgram()'이 호출되는 곳은 아무 관계가 없습니다. 또한 스트라이드 값 12는 3 개의 부동 소수점 값으로 구성된 정점의 바이트 크기이므로 올바로 보입니다. 보폭은 한 정점의 ** 시작 **과 다음 정점의 시작 사이의 바이트 수입니다. 정말로이 답변의 유일한 부분은'gl_ARRAY_BUFFER' 바인딩이'glVertexAttribPointer()'가 호출 될 때 유효해야한다는 것입니다. –

+0

그럼 내가 떠날 partt입니다 – 5Volt

+0

아, 내 혼란은 당신이 0으로 걸음 걸음을 고정시킨 것입니다. 그렇다면 꼭지점은 단단히 묶여 있다고 가정합니다.하지만 0은 그냥 가정을 나타냅니다. – 5Volt

관련 문제