OpenGL 应用程序崩溃

Posted

技术标签:

【中文标题】OpenGL 应用程序崩溃【英文标题】:OpenGL application crashing 【发布时间】:2015-02-18 17:10:29 【问题描述】:

这个 OpenGL 程序是为了绘制一个三角形而写的,结果崩溃了。

基本上将一组三角形顶点定义为名为坐标的数组,然后将此数组传递给缓冲区,glDrawArrays方法将根据GL_TRIANGLES模式从顶点0开始绘制三角形,总共3个顶点。

我说的对吗?有人可以告诉我错误在哪里吗?代码如下:

// Open an OpenGL window
GLFWwindow* window;
int k = 0;

/****Step 1: define vertices in (x, y, z) form****/
const GLfloat coordinates[] = 
    -1.0f, -1.0f, 0.0f,
    1.0f, -1.0f, 0.0f,
    0.0f, 1.0f, 0.0f
;
/************************/

/**Step 2: send this triangle vertices to OpenGL through a buffer**/
GLuint vertexBuffer; // identify vertex buffer

void Render(void)
    /************************/
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
    glVertexAttribPointer(0, 3 /*size*/, GL_FLOAT /*type*/, GL_FALSE, 0, (void*)0);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    //glDisableVertexAttribArray(0);
    /************************/

//    glClearColor(0., 1., 1., 1.); // blue colour
    glClear( GL_COLOR_BUFFER_BIT );
    // Swap front and back rendering buffers
    glfwSwapBuffers(window);
    //Poll for and process events
    glfwPollEvents();


int main( void ) 
    /*Initializing steps here*/


    // Create a windowed mode window and its OpenGL context
    window = glfwCreateWindow(700, 500, "Hello World", NULL, NULL);

    // Make the window's context current
    glfwMakeContextCurrent(window);

    /**Step 2: send this triangle vertices to OpenGL through a buffer**/
    glGenBuffers(1, &vertexBuffer); // generating 1 buffer, put resulting identifier in this buffer
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(coordinates), coordinates, GL_STATIC_DRAW);
    /************************/

    // Main loop
    while( glfwWindowShouldClose(window) == 0) 
            // OpenGL rendering goes here...
        Render();
    
    // Close window and terminate GLFW
    glfwDestroyWindow(window);
    glfwTerminate();
    // Exit program
    exit( EXIT_SUCCESS );
    

编辑 这是输出的截图:

更新 我发现了错误,这是因为我在初始化 GLEW 后创建了 OpenGL 上下文。它会导致程序崩溃。

【问题讨论】:

它在哪里崩溃?你检查过调试器吗? 【参考方案1】:

好的,首先你应该提供更多细节,但我自己想出来的。就是这样:

错过的标题:

#include <stdlib.h>
#include <stdio.h>
#include <GL/glew.h>
#include <GLFW/glfw3.h>

生成文件:

CFLAGS = -Wall -O2
CFLAGS += $(shell pkg-config --cflags glfw3)
CFLAGS += $(shell pkg-config --cflags glew)
LDFLAGS += $(shell pkg-config --libs glfw3)
LDFLAGS += $(shell pkg-config --libs glew)
SOURCES = main.c
OUT = gl-test
CC = gcc

default: $(SOURCES)
    $(CC) $(CFLAGS) $(LDFLAGS) $(SOURCES) -o $(OUT)

clean:
    -rm -f $(OUT)

.PHONY: default clean

发生错误:分段错误,在下一个命令中:

glGenBuffers(1, &vertexBuffer);

但我看到的是 glfwCreateWindow() 返回 NULL,所以错误已经出现在第一条指令中。你可以弄清楚为什么会出现这个错误:

static void error_callback(int error, const char *description)

    puts(description);


int main(void)

    glfwSetErrorCallback(error_callback);
    ...

还有值得修改的窗口创建代码是这样的:

// Create a windowed mode window and its OpenGL context
window = glfwCreateWindow(700, 500, "Hello World", NULL, NULL);
if (window == NULL) 
    fprintf(stderr, "Error in glfwCreateWindow\n");
    return EXIT_FAILURE;

在此之后,您可以在我的终端中看到下一个输出:

The GLFW library is not initialized
Error in glfwCreateWindow

请尝试做同样的事情并确认您有同样的问题。如果没有,请提供终端的输出。

编辑 1

好吧,看来首先你需要在 ma​​in() 开头做下一个:

if (!glfwInit()) 
    fprintf(stderr, "Error on GLWF init\n");
    return EXIT_FAILURE;

它解决了以前的错误,但我仍然有分段错误错误。

编辑 2

第二个错误是 GLEW 没有初始化。似乎必须在创建窗口时放置 GLEW init,如下所示:

// Make the window's context current
glfwMakeContextCurrent(window);

glewinit_res = glewInit();
if (glewinit_res != GLEW_OK) 
    fprintf(stderr, "Glew init error: %s\n",
            glewGetErrorString(glewinit_res));
    return EXIT_FAILURE;

现在我没有任何运行时错误,窗口出现了,但它只有黑色背景,上面什么都没有。无论如何,我相信原始错误已修复。

编辑 3

如果您想查看三角形,只需删除 glClear() 函数调用即可。

这是我看到的: .

这是适用于我的修改代码(main.c 文件): http://pastebin.com/sx5nMQHc

【讨论】:

您不能在 C++ 中使用 &lt;stdlib.h&gt; &lt;stdio.h&gt;。请改用&lt;cstdlib&gt;&lt;cstdio&gt; @HolyBlackCat:我在这里没有使用 C++,只有旧的好 C :) 你可以从我的 Makefile 中看到它。这个项目没有使用 C++ 中的任何东西,那么为什么要使用 C++ 来构建它呢? 我删除了那些标题内容并初始化代码,并在我放置它们的地方添加了 cmets。太多不必要的代码。 Anw,感谢您的帮助。 请查看我刚刚在答案末尾添加的编辑。如果他们解决了您的问题 - 请验证我的回答是否正确。 @SamProtsenko 好的。他们在回答 C++ 问题时看起来很奇怪。 :)

以上是关于OpenGL 应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL程序不断崩溃?

内存警告后在 iOS 上运行 OpenGL 崩溃

不使用 VBO 时 OpenGL 应用程序崩溃

OpenGL:随机调用 OpenGL 函数时崩溃

带有 GLFW 和 GLEW 的 OpenGL 应用程序崩溃

SDL OpenGL 应用程序在发布模式下崩溃 [重复]