glDrawElements只绘制由indices指定的第一个三角形

 手机用户2502876173 发布于 2023-01-11 20:19

我刚刚开始学习OpenGL,我在使用glDrawElements时遇到了一些麻烦.我试图使用带有GL_TRIANGLE的glDrawElements绘制两个三角形,但只出现一个三角形.

预期结果:glDrawElements绘制两个带顶点的三角形

(0,0)(1,1)(-1,1)和(0,0)( - 1,-1)(1,-1)

会发生什么:glDrawElements绘制一个带顶点的三角形(0,0)(1,1)( - 1,1)

短,自包含,正确(可编译),示例:

#include 
#include 

int main(int argc, char *argv[])
{
    glfwInit();
    GLFWwindow* window = glfwCreateWindow(640, 480, "Sample code does not display two triangles", NULL, NULL);
    glfwMakeContextCurrent(window);

    glewInit();

    GLfloat vertices[] {
        +0.0f, +0.0f, //0
        +1.0f, +1.0f, //1
        -1.0f, +1.0f, //2
        -1.0f, -1.0f  //3
        +1.0f, -1.0f  //4
    };

    GLuint vertexBufferID;
    glGenBuffers(1, &vertexBufferID);
    glBindBuffer(GL_ARRAY_BUFFER, vertexBufferID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);

    GLuint indexBufferID;
    GLushort indices[] {0,1,2, 0,3,4};
    glGenBuffers(1, &indexBufferID);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferID);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

    while (!glfwWindowShouldClose(window))
    {
        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0);
        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    glfwTerminate();
    return 0;
}

此示例打开一个640x480 GLFW窗口,显示一个三角形,其顶角和顶部位于窗口中间的第三个顶点.缺少另一个三角形,其中两个底角中的顶点和中间的第三个顶点.这是为什么?

规格:
操作系统:Linux Mint 17
GPU:nVidia GTX 275
GPU驱动程序:331.67
GLEW版本:1.10.0
GLFW版本:3.0.4

1 个回答
  • 逗号很重要.这个:

    GLfloat vertices[] =
    {
        +0.0f, +0.0f, //0
        +1.0f, +1.0f, //1
        -1.0f, +1.0f, //2
        -1.0f, -1.0f  //3
        +1.0f, -1.0f  //4
    };
    size_t elements = sizeof( vertices ) / sizeof( GLfloat ) = 9(!)
    

    与此不一样:

    GLfloat vertices[] =
    {
        +0.0f, +0.0f, //0
        +1.0f, +1.0f, //1
        -1.0f, +1.0f, //2
        -1.0f, -1.0f, //3
        +1.0f, -1.0f  //4
    };
    size_t elements = sizeof( vertices ) / sizeof( GLfloat ) = 10
    

    请注意行尾添加的逗号3.

    如果vertices只有9元素,那么当glDrawElements()试图读取第五个顶点时,只有X坐标才有效.如果你幸运的话,Y坐标将包含垃圾,如果你不幸,则会出现段错误.

    此外,如果不指定某些着色器,则不应使用通用顶点属性函数.

    全部一起:

    #include <GL/glew.h>
    #include <GLFW/glfw3.h>
    
    int main(int argc, char *argv[])
    {
        glfwInit();
        GLFWwindow* window = glfwCreateWindow(640, 480, "Sample code does not display two triangles", NULL, NULL);
        glfwMakeContextCurrent(window);
    
        glewInit();
    
        GLfloat vertices[] =
        {
            +0.0f, +0.0f, //0
            +1.0f, +1.0f, //1
            -1.0f, +1.0f, //2
            -1.0f, -1.0f, //3
            +1.0f, -1.0f, //4
        };
    
        GLuint vertexBufferID;
        glGenBuffers(1, &vertexBufferID);
        glBindBuffer(GL_ARRAY_BUFFER, vertexBufferID);
        glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
        glEnableClientState( GL_VERTEX_ARRAY );
        glVertexPointer( 2, GL_FLOAT, 0, 0 );
    
        GLuint indexBufferID;
        GLushort indices[] = { 0,1,2, 0,3,4 };
        glGenBuffers(1, &indexBufferID);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferID);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
    
        while (!glfwWindowShouldClose(window))
        {
            glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
            glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0);
            glfwSwapBuffers(window);
            glfwPollEvents();
        }
    
        glfwTerminate();
        return 0;
    }
    

    2023-01-11 20:24 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有