我想用 C++ 程序画一个三角形。我用g++编译了这个程序,带有'-Wall'标志,它编译时没有警告。但是,我从函数中得到一个分段错误glGenBuffers(1, &m_VertexBuffer);
。我尝试将类型声明从uint32_t
to替换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 应用程序。