2017-01-31 11 views
1

내 gl 화면에는 아무 것도 그릴 수 없습니다. 그냥 화면을 지 웁니다. 다음은 Main, Display 및 Cube 클래스입니다.OpenGL 3.3은 무언가를 그릴 수 없습니다

MAIN.CPP 생성자 glfw 및 glew를 초기화

Display d(800, 600, "Hi"); 
while (!d.IsClosed()) { 
    d.Clear(); 
    d.Update(); 
} 
return 0; 

display.cpp.

void Display::Update() { 
    glfwPollEvents(); 
    m_shader->UseProgram(); 
    m_renderer->Render(*m_cube); 
    glfwSwapBuffers(m_window); 
} 

UseProgram 함수는 Shader 클래스에서 제공되며 단지 glUseProgram(m_programID);입니다.

또한 m_renderer->Render()은 매개 변수의 개체에서 Render 함수를 호출하기 만합니다.

cube.cpp

void Cube::Init() { 
//cube vertices - colors 
GLfloat data[] = { 
    -0.5f, 0.5f, 0.0f, m_color.r, m_color.g, m_color.b, m_color.a, 
    -0.5f, -0.5f, 0.0f, m_color.r, m_color.g, m_color.b, m_color.a, 
    0.5f, -0.5f, 0.0f, m_color.r, m_color.g, m_color.b, m_color.a, 
    0.5f, 0.5f, 0.0f, m_color.r, m_color.g, m_color.b, m_color.a, 

    -0.5f, 0.5f, -0.5f, m_color.r, m_color.g, m_color.b, m_color.a, 
    -0.5f, -0.5f, -0.5f, m_color.r, m_color.g, m_color.b, m_color.a, 
    0.5f, -0.5f, -0.5f, m_color.r, m_color.g, m_color.b, m_color.a, 
    0.5f, 0.5f, -0.5f, m_color.r, m_color.g, m_color.b, m_color.a 
}; 

//cube indices 
GLuint indices[] = { 
    //front 
    0, 1, 2, 
    0, 2, 3, 

    //top 
    4, 0, 3, 
    4, 3, 7, 

    //bottom 
    1, 3, 6, 
    1, 6, 2, 

    //left 
    4, 3, 1, 
    4, 1, 0, 

    //right 
    3, 2, 6, 
    3, 6, 7, 

    //back 
    4, 5, 6, 
    4, 6, 7, 
}; 

m_vertexCount = sizeof(indices)/sizeof(GLuint); 

//Generate buffers 
glGenVertexArrays(1, &m_vaoID); 
glGenBuffers(1, &m_vboID); 
glGenBuffers(1, &m_eboID); 

//Bind vertex array object 
glBindVertexArray(m_vaoID); 

//Bind vertex buffer object 
glBindBuffer(GL_ARRAY_BUFFER, m_vboID); 
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW); 
glEnableVertexAttribArray(0); 
glEnableVertexAttribArray(1); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GL_FLOAT), (GLvoid*)0); 
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(GL_FLOAT), (GLvoid*)(3 * sizeof(GL_FLOAT))); 

//Unbind vertex buffer object 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

//Bind Element buffer object 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_eboID); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); 
//Unbind Element buffer object 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

//Unbind vertex array object 
glBindVertexArray(0); 
} 

Init() 함수 생성자에서 호출된다. 이것은 모든 큐브 초기화 코드입니다. 배열 바인딩 및 바인딩 해제.

void Cube::Render() { 
glBindVertexArray(m_vaoID); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_eboID); 
glDrawElements(GL_TRIANGLES, m_vertexCount, GL_UNSIGNED_INT, 0); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 
glBindVertexArray(0); 
} 

어떤 문제인지 알 수 없습니다. 화면에 아무 것도 표시하지 않습니다. 원하는 경우 Shader 클래스도 게시 할 수 있습니다.

+0

쉐이더 클래스와 소스를 표시 할 수 있습니까? 또한 VAO가 바인드 된 인덱스 버퍼를 저장하기 때문에'Init()'의'glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0);'와'Render()'의 다른 호출을 제거 할 수 있습니다. – Nazar554

답변

2

스트라이드 매개 변수가 잘못되었습니다. 각 연속 위치 시작은 마지막 위치의 시작에서 7 떠 있습니다. 색상도 마찬가지입니다. 올바른 코드는

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(GL_FLOAT), (GLvoid*)0); 
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 7 * sizeof(GL_FLOAT), (GLvoid*)(3 * sizeof(GL_FLOAT))); 

입니다. 또 다른 한 가지는 인덱스 버퍼를 바인드 해제하기 전에 VAO 바인딩을 해제하여 바인딩을 효과적으로 제거하는 것입니다. VAO 설정의 마지막 라인이 있어야 :

//Bind Element buffer object 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_eboID); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); 

//Unbind vertex array object 
glBindVertexArray(0); 

//Unbind Element buffer object 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

또한 Render() 함수에서의 결합 해제 GL_ELEMENT_ARRAY_BUFFER/바인딩이 제거되어야한다.

+0

감사합니다. stride 값을 변경하면 올바르게 실행됩니다. – Stradivarius