2017-12-10 38 views
2

저는 Chernov @ sparky engine의 튜토리얼에서 openGL 프로그래밍을 배우고 있습니다. 현재 저는 꼭지점 &을 윈도우, 셰이더 (shader) 관리에 필요한 클래스들을 가진 조각 셰이더 (fragment shader)를 가지고 있습니다. 단일 정점 배열 객체를 사용하여 화면에 그리지 만 vertexArray 클래스를 만들어 동일한 작업을 수행하면 오류가 발생합니다. 버텍스 배열 클래스 :클래스의 정점 배열 문제

#include"vertexArray.h" 
namespace graphics{ 
VertexArray::VertexArray(){ 
    glGenVertexArrays(1,&arrayID); 

} 
void VertexArray::addBuffer(Buffer* buffer, GLint index){ 
    bind(); 

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, arrayID); 
    glEnableVertexAttribArray(index); 
    glVertexAttribPointer(index, buffer->getComCount(), GL_FLOAT, GL_FALSE, 0, 0); 


} 
void VertexArray::bind() const{ 
    glBindVertexArray(arrayID); 
} 
void VertexArray::unbind() const{ 
    glBindVertexArray(0); 
} 
VertexArray::~VertexArray(){ 
} 
} 

내 MAIN.CPP 파일

#include"graphics\window.h" 
    #include"utils\reader.h" 
    #include"graphics\shader.h" 
    #include"math\vec.h" 
    #include"math\mat4.h" 
    #include"graphics\buffers\buffer.h" 
    #include"graphics\buffers\indexbuffer.h" 
    #include"graphics\buffers\vertexArray.h" 
    using namespace graphics; 
    using namespace utils; 
    using namespace math; 
    int main(){ 
     Window window; 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glClearColor(0, 0, 0, 1); 
     Reader read1("src/shaders/test.vert"); 
     Reader read2("src/shaders/test.frag"); 
     char * r1 = read1.getData(); 
     char * r2 = read2.getData(); 

     GLfloat vert[] = { 
      0, 0, 0, 
      0, 3, 0, 
      8, 0, 0, 
      8, 3, 0, 
     }; 
     Buffer* vbo = new Buffer(vert,4*3,3); 

     GLushort indices[] = { 
      0,1,2, 
      1,3,2 
     }; 
     indexBuffer ibo(indices,6); 

     Shader shader(r1, r2); 
     shader.enable(); 
    #if 0 
     GLuint sprite1; 
     glGenVertexArrays(1, &sprite1); 
     glBindVertexArray(sprite1); 
     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, sprite1); 
     vbo->bind(); 
     glVertexAttribPointer(0, vbo->getComCount(), GL_FLOAT, 0, 0, 0); 
     shader.setUniformMat4("pr_matrix", mat4::orthographic(0.0f, 16.0f, 0.0f, 9.0f, -1.0f, 1.0f)); 
     shader.setUniformMat4("ml_matrix", mat4::translation(vec3(0, 0, 0))); 
     shader.setUniform2f("light_pos", vec2(8.0f, 4.5f)); 
     shader.setUniform4f("colour", vec4(0.2, 0.0, 0.4, 1)); 
     glEnableVertexAttribArray(0); 
     glBindVertexArray(0); 

     GLuint sprite2; 
     glGenVertexArrays(1, &sprite2); 
     glBindVertexArray(sprite2); 
     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, sprite2); 
     vbo->bind(); 
     glVertexAttribPointer(5, vbo->getComCount(), GL_FLOAT, 0, 0, 0); 
     shader.setUniformMat4("pr_matrix", mat4::orthographic(0.0f, 16.0f, 0.0f, 9.0f, -1.0f, 1.0f)); 
     shader.setUniformMat4("ml_matrix", mat4::translation(vec3(4, 3, 0))); 
     shader.setUniform2f("light_pos", vec2(8.0f, 4.5f)); 
     shader.setUniform4f("colour", vec4(0.3, 0.0, 0.2, 1)); 
     glEnableVertexAttribArray(0); 
     glBindVertexArray(0); 
    #endif 
     VertexArray vao; 
     vao.addBuffer(vbo, 0); 

     while (!window.closed()){ 

    #if 0 
      window.clear(); 

      glDrawArrays(GL_TRIANGLES, 0,6); 
    #endif 
      double x, y; 
      x = window.getX(); 
      y = window.getY(); 

      vao.bind(); 
      ibo.bind(); 
      shader.setUniform2f("light_pos", vec2((float) (x*16.0f/960.0f) , (float) (9- 9*y/540.0f))); 

      glDrawElements(GL_TRIANGLES, ibo.getCount(), GL_UNSIGNED_SHORT, 0); 
      window.update(); 

      vao.unbind(); 
      ibo.unbind(); 
     } 
     return 0; 
    } 

난 그냥 그것을 사용하는 주요 &에 GLuint 변수에 정점 배열을 만들 경우 모든 작동 있습니다. 여기에서 문제를 찾을 수 없습니다. 도움이 매우 감사드립니다.

+0

Rabbid76 우 @ 세상에! 감사합니다. sooo so much ... 나는 이것을 모른 채 하루 종일 내 머리를 때리고 있습니다. 나는 일할 때 기쁨에 거의 울었다 !! 감사합니다. so so much <3 – pragi23

답변

1

데이터를 버퍼에 바인딩해야합니다 (glBufferData 참조).

버텍스 속성 버퍼는 다음과 같이 작성 될 수있다 :

GLfloat vert[] = { 
    0, 0, 0, 
    0, 3, 0, 
    8, 0, 0, 
    8, 3, 0, 
}; 

GLuint vbo; 
glGenBuffers(1, &vbo); 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*3*4, vert, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

요소 버퍼는 다음과 같이 작성 될 수하십시오 Vertex Array Object 및 정점 포인터 속성

GLushort indices[] = { 
    0,1,2, 
    1,3,2 
}; 

GLuint ibo; 
glGenBuffers(1, &ibo); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLushort)*3*2, indices, GL_STATIC_DRAW); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

이렇게 지정된 :

GLuint attr_index = 0; // attribute index according to the shader program 

GLuint vao; 
glGenVertexArrays(1, &vao); 
glBindVertexArray(vao); 

glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glVertexAttribPointer(attr_index , 3, GL_FLOAT, GL_FALSE, 0, 0); 
glEnableVertexAttribArray(attr_index); 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); 

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

참고 : Vertex Array Object 버텍스 속성 (형식, 크기, 속성 인덱스 ...)에 대해 지정한 모든 정보를 저장하며 요소 배열 버퍼를 참조합니다.


마지막으로이 같은 메쉬를 그릴 수 있습니다 :

glBindVertexArray(vao); 
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); 
glBindVertexArray(0); 
+1

정말 감사합니다. 매우 유익하고 유용한 정보였습니다. – pragi23

+0

@ Rabbid76 : "* 버퍼에 적절한 대상을 사용해야합니다. *"[buffer 객체] (https://www.khronos.org/opengl/wiki/Buffer_Object)는 * 입력 *되어 있습니다. 그들은 그렇지 않습니다. * 버퍼 객체의 용도 *가 입력되지만 버퍼 객체는 유형과 직접 연관되지 않습니다. 저장소를 만들 때'GL_COPY_READ_BUFFER'를 사용하는 것을 막을 수있는 방법은 없습니다. –

+0

@NicolBolas 나는 당신이 무엇을 의미하는지 정확히 모르겠다 고 생각합니다. 대답이 나쁘다고 생각되면 삭제하십시오. 내 대답이 받아 들여지지 않기 때문에 할 수 없다. – Rabbid76