2015-10-14 54 views
2

在我的OpenGL旅程中,当我遇到这个问题时,我试图制作一个纹理立方体: 只有部分我的立方体被渲染。应该有12个三角形,但只有3个正在渲染。我看过很多教程,但似乎无法找到我们的代码之间的问题/主要区别。这里是我的:C++ OpenGL纹理立方体缺失三角形

... 

int main(int argc, char* argv[]) { 
    if (!setupGLFW()) return 1; 
    setupApple(); 

    glfwWindowHint(GLFW_SAMPLES, 4); 

    GLFWwindow* window = glfwCreateWindow(WIN_WIDTH, WIN_HEIGHT, "Textured Cube", NULL, NULL); 
    if (!window) { 
     log_msg(LOG_ERROR, "Could not open a GLFW3 window!\n"); 

     return 1; 
    } 

    glfwMakeContextCurrent(window); 

    if (!setupGLEW()) return 1; 

    glClearColor(0.5, 0.5, 0.5, 1.0); 
    glEnable(GL_DEPTH_TEST); 
    glDepthFunc(GL_LESS); 

    static const int vertices = 12 * 3; 
    static const GLfloat points[] = { 
     -1.0, -1.0, -1.0, 
     -1.0, -1.0, 1.0, 
     -1.0, 1.0, 1.0, 
     1.0, 1.0, -1.0, 
     -1.0, -1.0, -1.0, 
     -1.0, 1.0, -1.0, 
     1.0, -1.0, 1.0, 
     -1.0, -1.0, -1.0, 
     1.0, -1.0, -1.0, 
     1.0, 1.0, -1.0, 
     1.0, -1.0, -1.0, 
     -1.0, -1.0, -1.0, 
     -1.0, -1.0, -1.0, 
     -1.0, 1.0, 1.0, 
     -1.0, 1.0, -1.0, 
     1.0, -1.0, 1.0, 
     -1.0, -1.0, 1.0, 
     -1.0, -1.0, -1.0, 
     -1.0, 1.0, 1.0, 
     -1.0, -1.0, 1.0, 
     1.0, -1.0, 1.0, 
     1.0, 1.0, 1.0, 
     1.0, -1.0, -1.0, 
     1.0, 1.0, -1.0, 
     1.0, -1.0, -1.0, 
     1.0, 1.0, 1.0, 
     1.0, -1.0, 1.0, 
     1.0, 1.0, 1.0, 
     1.0, 1.0, -1.0, 
     -1.0, 1.0, -1.0, 
     1.0, 1.0, 1.0, 
     -1.0, 1.0, -1.0, 
     -1.0, 1.0, 1.0, 
     1.0, 1.0, 1.0, 
     -1.0, 1.0, 1.0, 
     1.0, -1.0, 1.0 
    }; 


    static const GLfloat textureCoords[] = { 
     0, 0, 
     1, 0, 
     0, 1, 
     0, 1, 
     1, 0, 
     1, 1, 
     0, 0, 
     1, 0, 
     0, 1, 
     0, 1, 
     1, 0, 
     1, 1, 
     0, 0, 
     1, 0, 
     0, 1, 
     0, 1, 
     1, 0, 
     1, 1, 
     0, 0, 
     1, 0, 
     0, 1, 
     0, 1, 
     1, 0, 
     1, 1, 
     0, 0, 
     1, 0, 
     0, 1, 
     0, 1, 
     1, 0, 
     1, 1, 
     0, 0, 
     1, 0, 
     0, 1, 
     0, 1, 
     1, 0, 
     1, 1, 
    }; 

    GLuint pointBuffer; 
    glGenBuffers(1, &pointBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, pointBuffer); 
    glBufferData(GL_ARRAY_BUFFER, vertices * 3, points, GL_STATIC_DRAW); 

    GLuint textureBuffer; 
    glGenBuffers(1, &textureBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, textureBuffer); 
    glBufferData(GL_ARRAY_BUFFER, vertices * 2, textureCoords, GL_STATIC_DRAW); 

    GLuint vao; 
    glGenVertexArrays(1, &vao); 
    glBindVertexArray(vao); 
    glBindBuffer(GL_ARRAY_BUFFER, pointBuffer); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); 
    glBindBuffer(GL_ARRAY_BUFFER, textureBuffer); 
    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, NULL); 

    glEnableVertexAttribArray(0); 
    glEnableVertexAttribArray(1); 

    GLuint program = getProgramFromFiles("text_cube.vs.glsl", "text_cube.fs.glsl"); 
    glm::mat4 MVP = calculateMVP(); 
    GLuint texture = loadBMP("uvtemplate.bmp"); 

    if (!program) { 
     log_msg(LOG_ERROR, "There was a problem opening shader.\n"); 

     // clean up 
     return 1; 
    } 

    if (!texture) { 
     log_msg(LOG_ERROR, "There was a problem opening shader.\n"); 

     // clean up 
     return 1; 
    } 

    glUseProgram(program); 

    GLuint MVPID = glGetUniformLocation(program, "MVP"); 
    GLuint textureID = glGetUniformLocation(program, "cube_texture"); 

    glUniformMatrix4fv(MVPID, 1, GL_FALSE, &MVP[0][0]); 

    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glUniform1i(textureID, 0); 

    while (!glfwWindowShouldClose(window) && glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS) { 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glDrawArrays(GL_TRIANGLES, 0, vertices); 

     glfwPollEvents(); 
     glfwSwapBuffers(window); 
    } 

    // clean up 
    return 0; 
} 

只要你知道,错误的是不与setupGLFW()setupApple()setupGLEW()getProgramFromFiles()calculateMVP()loadBMP(),或者我的顶点和片段着色器,这是在不同的文件。编译没有问题,因为我有GLFWGLEWmyglutils.h这是uvtemplate.bmp,其512×512的图像:

如果你们能帮助我,那将是极大的赞赏。谢谢!

回答

1

问题是致电glBufferData()。您可以在浮点数中设置大小,但是您必须以字节为单位指定它的大小(usig sizeof(GLfloat))。这就是为什么OpenGL没有收到你所有的数据。

空隙glBufferData(GLenum目标, GLsizeiptr大小, 常量GLvoid *数据, GLenum使用);

所以你需要更换
glBufferData(GL_ARRAY_BUFFER, vertices * 3, points, GL_STATIC_DRAW);

glBufferData(GL_ARRAY_BUFFER, vertices * 2, textureCoords, GL_STATIC_DRAW);

glBufferData(GL_ARRAY_BUFFER, vertices * 3 * sizeof(GLfloat), points, GL_STATIC_DRAW);

glBufferData(GL_ARRAY_BUFFER, vertices * 2 * sizeof(GLfloat), textureCoords, GL_STATIC_DRAW);

+0

哇。我不相信我犯了这个错误!我已经为OpenGL中的所有其他程序完成了这个任务,我不知道为什么我的大脑在那里滑落。非常感谢! – Jerfov2