OpenGL 应用程序崩溃
OpenGL application crashing
这个 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 上下文。导致程序崩溃。
好的,首先你应该提供更多的细节,但我自己想出来的。在这里:
错过了headers:
#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() returns NULL,所以错误已经出现在第一条指令中。你可以找出为什么会这样发生这个错误:
static void error_callback(int error, const char *description)
{
puts(description);
}
int main(void)
{
glfwSetErrorCallback(error_callback);
...
}
也值得修改 window 创建代码,使其成为这样:
// 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:
好的,看来首先你需要在 main() 开头做下一个:
if (!glfwInit()) {
fprintf(stderr, "Error on GLWF init\n");
return EXIT_FAILURE;
}
它解决了之前的错误,但我仍然遇到分段错误错误。
编辑 2:
第二个错误是 GLEW 没有初始化。似乎 GLEW init 必须在 window 已经创建时放置,如下所示:
// 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;
}
现在我没有任何运行时错误,window 出现了,但它只有黑色背景,上面什么也没有。不管怎样,我相信原来的错误是固定的。
编辑 3:
如果你想看到你的三角形,只需删除 glClear() 函数调用。
这是我看到的:
.
这是对我有用的修改代码(main.c 文件):
http://pastebin.com/sx5nMQHc
这个 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 上下文。导致程序崩溃。
好的,首先你应该提供更多的细节,但我自己想出来的。在这里:
错过了headers:
#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() returns NULL,所以错误已经出现在第一条指令中。你可以找出为什么会这样发生这个错误:
static void error_callback(int error, const char *description)
{
puts(description);
}
int main(void)
{
glfwSetErrorCallback(error_callback);
...
}
也值得修改 window 创建代码,使其成为这样:
// 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:
好的,看来首先你需要在 main() 开头做下一个:
if (!glfwInit()) {
fprintf(stderr, "Error on GLWF init\n");
return EXIT_FAILURE;
}
它解决了之前的错误,但我仍然遇到分段错误错误。
编辑 2:
第二个错误是 GLEW 没有初始化。似乎 GLEW init 必须在 window 已经创建时放置,如下所示:
// 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;
}
现在我没有任何运行时错误,window 出现了,但它只有黑色背景,上面什么也没有。不管怎样,我相信原来的错误是固定的。
编辑 3:
如果你想看到你的三角形,只需删除 glClear() 函数调用。
这是我看到的:
这是对我有用的修改代码(main.c 文件): http://pastebin.com/sx5nMQHc