[C ++ OpenGL纹理多维数据集缺少三角形

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[C ++ OpenGL纹理多维数据集缺少三角形相关的知识,希望对你有一定的参考价值。

在获得OpenGL能力的过程中,遇到这个问题时,我试图制作一个纹理立方体:仅渲染了我的多维数据集的一部分。应该有12个三角形,但仅渲染3个。我看过许多教程,但似乎找不到我们的代码之间的问题/主要区别。这是我的:

...

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()或我的顶点和片段着色器不在同一个文件中无关。编译良好,因为我从GLFW中包含了GLEWmyglutils.h。这是uvtemplate.bmp,它是512x512的图片:如果你们能帮助我,将不胜感激。谢谢!

答案

问题是对glBufferData()的调用。您以浮点数设置大小,但必须使用usig sizeof(GLfloat)以字节为单位指定大小。这就是OpenGL无法接收您所有数据的原因。

void glBufferData(GLenum目标,GLsizeiptr大小,const 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);

以上是关于[C ++ OpenGL纹理多维数据集缺少三角形的主要内容,如果未能解决你的问题,请参考以下文章

着色器斜切多维数据集的边缘?

OpenGL 2D纹理无法正确显示c ++

C ++ OpenGL大网格缺少三角形

OpenGL - 用纹理绘制正方形的最简单方法

iOS OpenGL ES简单绘制纹理

OpenGL进阶02.为三角形添加纹理贴图