0

我想用 C++ 程序画一个三角形。我用g++编译了这个程序,带有'-Wall'标志,它编译时没有警告。但是,我从函数中得到一个分段错误glGenBuffers(1, &m_VertexBuffer);。我尝试将类型声明从uint32_tto替换GLuint,但问题仍然存在。

#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>

int main()
{
    if (!glfwInit())
    {
        std::cout << "Failed glfwInit()" << std::endl;
        return 1;
    }

    GLFWwindow* window = glfwCreateWindow(600,600, "triangle", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        std::cout << "Failed to create window" << std::endl;
        return 1;
    }
    glfwMakeContextCurrent(window);

    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        glfwTerminate();
        std::cout << "Failed gladLoadGLLoader(...)" << std::endl;
        return 1;
    }
    
    float vertices[] = 
    {
        -.5f, -.5f, 0.f,
        .5f, .5f, 0.f,
        0.f, -.5f, 0.f
    }; //triangle

    uint32_t m_VertexBuffer;

    std::cout << "Generating buffer object from vertex array..." << std::endl;

    glGenBuffers(1, &m_VertexBuffer);

    std::cout << "Done." << std::endl;

    glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), &vertices[0], GL_STATIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float)*3, (void *) 0);
    glEnableVertexAttribArray(0);
    glViewport(0, 0, 600, 600);

    while(!glfwWindowShouldClose(window))
    {
        glClear(GL_COLOR_BUFFER_BIT);
        glDrawArrays(GL_TRIANGLES, 0, 3);
        glfwSwapBuffers(window);
        glfwPollEvents();
    }
    glfwTerminate();
}

当我执行二进制文件时,这是终端的输出:

Generating buffer object from vertex array...
Segmentation fault

当我使用 gdb 时,这里是输出(第 40 行对应于glGenBuffers(1, &m_VertexBuffer);)行。

Starting program: /home/jiageng/tri/build/tri 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
(gdb) backtrace
#0  0x0000000000000000 in ?? ()
#1  0x0000555555557d8b in main () at /home/jiageng/tri/main.cpp:40

我看到一个名为“三角形”的黑色窗口,但此窗口上没有显示任何内容。

附加细节:我展示的代码改编自我关注的 youtube 上的教程。本教程的工作代码在这里(https://github.com/codetechandtutorials/tri/blob/main/main.cpp)。我唯一改变的是用更具描述性的术语替换单字母变量名称,并添加断点和详细语句。

我在适用于 Linux 2 的 Windows 子系统上,并且已验证 X11 端口转发工作正常,因此我可以通过 VcXSrv 运行 GUI 应用程序。

4

0 回答 0