0

我有一个显示一些 3D 渲染的应用程序。在将我的应用程序集成到不同用户的笔记本电脑上时,我遇到了 VBO 的一些图形问题。顶点缓冲区对象在开发站中工作得非常好

第一台笔记本电脑嵌入了 AMD Radeon HD 6470M -> OpenGL 4.1

在这台笔记本电脑上,我有一些:老式方式 opengl 代码,工作正常。vbo 实现:不显示 VBO 的数据

这里是负责绘制我的 VBO 的代码:

    // Compute this on the client side to attempt compute it for each vertex
    Matrix4 modelview = view * model;

    // Links matrix values to entry shader matrices for the specified shader
    glUniformMatrix4fv(glGetUniformLocation(shaderID, "projection"), 1, GL_TRUE, projection.getValues());
    glUniformMatrix4fv(glGetUniformLocation(shaderID, "modelview"), 1, GL_TRUE, modelview.getValues());
    GLfloat color[4] = {material_->getDiffuse()[0], material_->getDiffuse()[1], material_->getDiffuse()[2], lgc3d::alphaFromSelection(selected)};
    glUniform4fv(glGetUniformLocation(shaderID, "color"), 1, color);


    // Get the positions in the shader for data
    glEnableVertexAttribArray(VPos_index);
    glEnableVertexAttribArray(VNor_index);
    glEnableVertexAttribArray(VTex_index);

    // Bind the buffers we want access
    glBindBuffer(GL_ARRAY_BUFFER, VBO_index_vertices);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VBO_index_indices3);
    glBindTexture(GL_TEXTURE_2D, material_->getTexture().getID());
    {
        // Precise how the data have to be read by OpenGL (defining offset), for triangles
        glVertexAttribPointer(VPos_index, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(0));
        glVertexAttribPointer(VNor_index, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(offsetof(Vertex, normals)));
        glVertexAttribPointer(VTex_index, 2, GL_FLOAT, GL_TRUE, sizeof(Vertex), BUFFER_OFFSET(offsetof(Vertex, textcoords)));
        glDrawElements(GL_TRIANGLES, nb_tri_ * 3, GL_UNSIGNED_INT, 0);
    }

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VBO_index_indices4);
    {
        // Precise how the data have to be read by OpenGL (defining offset), for quads
        glVertexAttribPointer(VPos_index, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(0));
        glVertexAttribPointer(VNor_index, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(offsetof(Vertex, normals)));
        glVertexAttribPointer(VTex_index, 2, GL_FLOAT, GL_TRUE, sizeof(Vertex), BUFFER_OFFSET(offsetof(Vertex, textcoords)));
        glDrawElements(GL_QUADS, nb_qua_ * 4, GL_UNSIGNED_INT, 0);
    }

    // Unbind everything
    glDisableVertexAttribArray(VPos_index);
    glDisableVertexAttribArray(VNor_index);
    glDisableVertexAttribArray(VTex_index);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    glBindTexture(GL_TEXTURE_2D, 0);

我是否使用了任何最近的功能?我真的没有这种感觉。

非 VBO 对象完美显示:

    {
    // defines an array of generic vertex attribute data, of index 0
    glEnableVertexAttribArray(0);

        // Get eye position
        Vector3D eyev(cam->getEyePosition());
        float eyet[3] = {(float)eyev.X, (float)eyev.Y, (float)eyev.Z};

        // Specify data location for OpenGL
        glVertexAttribPointer(0, 3, GL_DOUBLE, GL_FALSE, 0, vertices_);

        // Links matrix values to entry shader matrices for the specified shader
        glUniformMatrix4fv(glGetUniformLocation(shaderID, "projection"), 1, GL_TRUE, projection.getValues());
        glUniformMatrix4fv(glGetUniformLocation(shaderID, "modelview"), 1, GL_TRUE, modelview.getValues());
        glUniform3fv(glGetUniformLocation(shaderID, "cameraEye"), 1, eyet);

        glLineWidth(1);

        // Order OpenGL to draw
        glDrawArrays(GL_LINES, 0, nb_coord_ / 3);

    // Inactivates the generic vertex attribute data of index 0
    glDisableVertexAttribArray(0);
}

第二台笔记本电脑嵌入了 Intel Graphic 3000 -> OpenGL 3.0

在这里,如果我只将鼠标放在 OpenGL 画布上,它就会崩溃。什么都不会显示......甚至背景清除颜色。

我注意不要使用已弃用的功能,我真的认为一切都可以与一大堆计算机/笔记本电脑兼容。有人有什么主意吗 ?

使用 Qt5.8,一切都显示在 QGLWidget 中。问题发生在 64 位平台上,在 Windows 7 Professional 上测试。

4

0 回答 0