OpenGL 不使用 VBO 显示三角形

Posted

技术标签:

【中文标题】OpenGL 不使用 VBO 显示三角形【英文标题】:OpenGl does not display triangles using VBO 【发布时间】:2016-11-28 20:35:42 【问题描述】:

我试图在 OpenGL 中显示 2 个简单的三角形,但尽管检查了许多网站,但它们没有出现。我是不是忘记了代码中的任何内容?

#define BUFFER_OFFSET(bytes) ((GLubyte*) NULL + (bytes)) 


    // Prepare:
    GLfloat vertices[]=0,0,1,
        0.5,0,-0.5,
        0,0,0,
        0,0,1,
        0,0,0,
        -0.5,0,-0.5;
    GLushort indices[]=0,1,2,3,4,5;

    GLfloat *generatedVertices=new GLfloat[18];
    GLushort *generatedIndices=new GLushort[6];
    GLfloat *colors=new GLfloat[18];

    glGenBuffers( 3, triangleBuffers ); // triangleBuffers = Global GLuint

        for (int p=0;p<6;p++)
        
            MVector V(vertices[p*3],vertices[p*3+1],vertices[p*3+2]); // Maya type
            generatedVertices[p*3]=V.x;
            generatedVertices[p*3+1]=V.y;
            generatedVertices[p*3+2]=V.z;

            generatedIndices[p]=p;

            colors[p*3]=0.8f;
            colors[p*3+1]=0.6f;
            colors[p*3+2]=0.0f;
        


   // vertices
    glBindBuffer(GL_ARRAY_BUFFER, data->triangleBuffers[0]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*18, generatedVertices, GL_STATIC_DRAW);

    // indices
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data->triangleBuffers[1]);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLushort)*6, generatedIndices, GL_STATIC_DRAW);

    // couloirs
    glBindBuffer(GL_ARRAY_BUFFER, data->triangleBuffers[2]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*18*data->totalSize, colors, GL_STATIC_DRAW);

    // Render:
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);

    glBindBuffer(GL_ARRAY_BUFFER, data->triangleBuffers[0]);
    glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0));

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data->triangleBuffers[1]);

    glBindBuffer(GL_ARRAY_BUFFER, data->triangleBuffers[2]);
    glColorPointer(3, GL_FLOAT, 0,  BUFFER_OFFSET(0));

    glDrawElements(GL_TRIANGLES, totalSize*6, GL_UNSIGNED_INT, 0);

    glDisableClientState( GL_VERTEX_ARRAY );
    glDisableClientState( GL_COLOR_ARRAY );

【问题讨论】:

您以GLushort 格式上传索引,但在绘图调用中您说它是GL_UNSIGNED_INT 格式。 相机的位置设置在什么位置?如果它在y-axis 上的位置为0,那么这意味着,基于您的顶点。您将看不到三角形,因为您将两个三角形绘制成平面。尝试以下顶点; 0,1,0 - 0,0,0 - 0.5,-0.5,0三角一号 BDL:不错,已更正,但仍不显示任何内容 【参考方案1】:

问题来自 Maya。在 OpenGL-Legacy 模式下,网格被正确显示,在 OpenGL-Strict 模式下,它不是。我会朝这个方向调查。

【讨论】:

以上是关于OpenGL 不使用 VBO 显示三角形的主要内容,如果未能解决你的问题,请参考以下文章

为啥绘制我的 OpenGL-ES VBO 网格会阻止其他三角形显示?

OpenGL:一个 VBO 的多个 VAO

使用 VBO/IBO 的 OpenGL 纹理三角形

我的OpenGL学习进阶之旅介绍顶点缓冲区对象VBO和元素数组缓冲区对象EBO,并对比使用VBO和不使用VBO绘制三角形的效果

OpenGL不绘制三角形VBO

GL VBO 问题:第一条和最后一条三角形没有正确显示