2014-11-27 4 views
1

OpenGL 및 C++을 사용하여 큐브를 렌더링하는 데 문제가 있습니다. 여분의 정점을 추가 한 후 화면에 간단한 정사각형을 얻을 수 있었지만 약간 기울어 진 삼각형이 대신 표시되었습니다 ... 이제 요소 버퍼를 사용하려고했습니다. element_buffer []에 여분의 값 (필자는 자습서에서 찾은 바 있음)을 채우고 아무것도 표시하지 않았습니다. 어떤 도움이라도 좋을 것입니다.C++의 OpenGL 큐브

#include "CubeAsset.h"  
     CubeAsset::CubeAsset() { 
      // model coordinates, origin at centre. 
      GLfloat vertex_buffer [] { 
      -0.5f,-0.5f,-0.5f, // triangle 0 : begin 
      -0.5f,-0.5f, 0.5f, 
      -0.5f, 0.5f, 0.5f, // triangle 0 : end 
     0.5f, 0.5f,-0.5f, // triangle 2 : begin 
     -0.5f,-0.5f,-0.5f, 
     -0.5f, 0.5f,-0.5f, // triangle 2 : end 
     0.5f,-0.5f, 0.5f, 
     -0.5f,-0.5f,-0.5f, 
     0.5f,-0.5f,-0.5f, 
     0.5f, 0.5f,-0.5f, 
     0.5f,-0.5f,-0.5f, 
     -0.5f,-0.5f,-0.5f, 
     -0.5f,-0.5f,-0.5f, 
     -0.5f, 0.5f, 0.5f, 
     -0.5f, 0.5f,-0.5f, 
     0.5f,-0.5f, 0.5f, 
     -0.5f,-0.5f, 0.5f, 
     -0.5f,-0.5f,-0.5f, 
     -0.5f, 0.5f, 0.5f, 
     -0.5f,-0.5f, 0.5f, 
     0.5f,-0.5f, 0.5f, 
     0.5f, 0.5f, 0.5f, 
     0.5f,-0.5f,-0.5f, 
     0.5f, 0.5f,-0.5f, 
     0.5f,-0.5f,-0.5f, 
     0.5f, 0.5f, 0.5f, 
     0.5f,-0.5f, 0.5f, 
     0.5f, 0.5f, 0.5f, 
     0.5f, 0.5f,-0.5f, 
     -0.5f, 0.5f,-0.5f, 
     0.5f, 0.5f, 0.5f, 
     -0.5f, 0.5f,-0.5f, 
     -0.5f, 0.5f, 0.5f, 
     0.5f, 0.5f, 0.5f, 
     -0.5f, 0.5f, 0.5f, 
     0.5f,-0.5f, 0.5f 
     }; 

     element_buffer_length = 36; 
     GLubyte element_buffer [] { 
      0, 1, 2, 2, 3, 0, 
      0, 3, 4, 4, 5, 0, 
      0, 5, 6, 6, 1, 0, 
      1, 6, 7, 7, 2, 1, 
      7, 4, 3, 3, 2, 7, 
      4, 7, 6, 6, 5, 4 

     }; 

     // Transfer buffers to the GPU 
     // 

     // create buffer 
     glGenBuffers(1, &vertex_buffer_token); 

     // immediately bind the buffer and transfer the data 
     glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_token); 
     glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 12, vertex_buffer, GL_STATIC_DRAW); 

     glGenBuffers(1, &element_buffer_token); 
     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, element_buffer_token); 
     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * element_buffer_length, element_buffer, GL_STATIC_DRAW); 
    } 

    CubeAsset::~CubeAsset() { 
    } 

    #ifdef DEBUG 
    #define checkGLError() checkError(__FILE__, __LINE__) 
    #else 
    // define symbol to be nothing 
    #define checkGLError() 
    #endif 

    void checkError(std::string file, int line) { 
     GLenum gl_error = glGetError(); 
     if(GL_NO_ERROR != gl_error) { 
     std::cerr << "GL error in " << file << " at line " << line << " error: " << gl_error << std::endl; 
     exit(-1); 
     } 
    } 

    void CubeAsset::Draw(GLuint program_token) { 
     if(!glIsProgram(program_token)) { 
     std::cerr << "Drawing Cube with invalid program" << std::endl; 
     return; 
     } 
     GLint validation_ok; 
     glValidateProgram(program_token); 
     glGetProgramiv(program_token, GL_VALIDATE_STATUS, &validation_ok); 
     if(!validation_ok) { 
     GLint maxLength = 0; 
     glGetProgramiv(program_token, GL_INFO_LOG_LENGTH, &maxLength); 

     //The maxLength includes the NULL character 
     std::vector<char> errorLog(maxLength); 
     glGetProgramInfoLog(program_token, maxLength, &maxLength, &errorLog[0]); 

     std::cerr << "Invalid program " << program_token << " with error code " << validation_ok << std::endl; 
     for(auto c: errorLog) { 
      std::cerr << c; 
     } 
     exit(-1); 
     } 

     GLuint position_attrib = glGetAttribLocation(program_token, "position"); 
     checkGLError(); 

     glUseProgram(program_token); 
     checkGLError(); 

     // use the previously transferred buffer as the vertex array. This way 
     // we transfer the buffer once -- at construction -- not on every frame. 
     glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_token); 
     glVertexAttribPointer(
          position_attrib,    /* attribute */ 
          3,        /* size */ 
          GL_FLOAT,      /* type */ 
          GL_FALSE,      /* normalized? */ 
          0,        /* stride */ 
          (void*)0      /* array buffer offset */ 
          ); 
     glEnableVertexAttribArray(position_attrib); 

     checkGLError(); 

     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, element_buffer_token); 
     glDrawElements(
        GL_TRIANGLES, 
        element_buffer_length, 
        GL_UNSIGNED_INT, 
        (GLvoid*) 0 
        ); 

     checkGLError(); 

     glDisableVertexAttribArray(position_attrib); 
    } 

헤더 파일 :

#ifndef CUBEASSET_H 
#define CUBEASSET_H 

#include <vector> 

#include <GL/gl.h> 
#include <glm/glm.hpp> 
#include <glm/ext.hpp> 

#include "GameAsset.h" 

class CubeAsset : public GameAsset { 
public: 
    CubeAsset(); 
    ~CubeAsset(); 
    virtual void Draw(GLuint); 

private: 
    GLuint element_buffer_length; 
    GLuint vertex_buffer_token, element_buffer_token; 
}; 

#endif // CUBEASSET_H 

답변

1

당신은 형식이 일치하지 있습니다. 코드에서 당신 인덱스 유형 GLubyte의 위치 :

GLubyte element_buffer [] { 
    0, 1, 2, 2, 3, 0, 
    ... 

그러나 나머지 코드는이 GLuint로 취급 :

glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * element_buffer_length, ...); 
... 
glDrawElements(GL_TRIANGLES, element_buffer_length, GL_UNSIGNED_INT, ...); 

당신은 일관된 형식을 사용하여 해결해야 하나 GLubyte 어디서나, 또는 GLuint 어디서나.

+0

감사합니다. 나는 내가 삼각형을 다시 보아서 기뻐할 줄 몰랐다. 그러나 나는 이제 삼각형으로 돌아 간다. – mada360