glCreateShader 崩溃了
Posted
技术标签:
【中文标题】glCreateShader 崩溃了【英文标题】:glCreateShader is crashing 【发布时间】:2012-09-08 08:00:26 【问题描述】:我应该有最新版本的 Glew 和 Glut,所以这不应该是问题。一切都应该链接,我正在使用 MS Visual Studio 2010。 我的程序可以编译,但是当我到达 glCreateShader(GL_FRAGMENT_SHADER) 时,它显示错误:“0xC0000005:访问冲突。”
我的程序:
#include <GL\glew.h>
#include <GL\glut.h>
#include <stdio.h>
#include <stdlib.h>
GLuint program;
static char* readShaderSource(const char * shaderFile)
FILE* fp = fopen(shaderFile, "r");
char* buf;
long size;
if (fp == NULL) return NULL;
fseek(fp, 0L, SEEK_END);//go to end
size = ftell(fp); //get size
fseek(fp, 0L, SEEK_SET);//go to begining
buf = (char*) malloc((size +1) * sizeof(char));
fread(buf, 1, size, fp);
buf[size] = NULL;
fclose(fp);
return buf;
static void initShader(const GLchar * fsFile)
GLint status;
GLchar * fSource;
GLuint fShader;
GLuint fShader2;
//read file
fSource = readShaderSource(fsFile);
if (fSource == NULL)
printf("Fail to load file");
exit(EXIT_FAILURE);
//Create program and shader object
fShader2 = glCreateShader(GL_VERTEX_SHADER);
fShader = glCreateShader(GL_FRAGMENT_SHADER);
program = glCreateProgram();
//Attach shaders to program
glAttachShader(program, fShader);
//read shaders
glShaderSource(fShader, 1, (const GLchar**) &fSource, NULL);
//compile fragment shader
glCompileShader(fShader);
//error check
glGetShaderiv(fShader, GL_COMPILE_STATUS, &status);
if (status == GL_FALSE)
printf("Failed to compile the fragment shader.");
exit(EXIT_FAILURE);
//link and error check
glLinkProgram(program);
glGetProgramiv(program, GL_LINK_STATUS, &status);
if (status == GL_FALSE)
printf("program error");
exit(EXIT_FAILURE);
//use program object
glUseProgram(program);
//set up uniform parameter
//skipped for now
int main(int argc, char ** argv)
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500,500);
glutCreateWindow("Matrix Fractal");
glClearColor(1.0, 1.0, 1.0, 1.0);
gluOrtho2D(0.0,0.0,(GLfloat) 500, (GLfloat) 500);
glutDisplayFunc(draw);
glutReshapeFunc(reshape);
initShader("fsFractal.glsl");
glutMainLoop();
【问题讨论】:
【参考方案1】:您必须先初始化 GLEW,然后才能使用它:
GLenum err = glewInit();
【讨论】:
谢谢本。有效。但是,为了清楚起见,我使用了另一个变体,我将其作为答案发布在下面。【参考方案2】:还有另一种情况可能发生这种情况,而且条件远非显而易见。 如果你决定在你的应用程序中使用 glfw 和 glew,你也可以在 glCreateShader() ACCESS_VIOLATION 结束,如果你写了:
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
如果您将此行更改为
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE);
由于 NULL 函数指针 glCreateShader() 导致的 ACCESS_VIOLATION 消失了。
别问我,glew和glfw这两个库是怎么相互干扰的……voodoo alert!
【讨论】:
我通过在 glfwMakeContextCurrent() 之后调用 glewInit() 解决了这个问题。 除了@jimvonmoon 的建议之外,着色器所属的窗口在创建着色器时必须是当前的。这是我的错误。 谢谢,你让我免于调试 10 天【参考方案3】:这是我的变体,是上面@BenRujil 回答的后续。
glewExperimental = GL_TRUE;
if(glewInit() != GLEW_OK)
throw std::runtime_error("glewInit failed");
【讨论】:
【参考方案4】:如果您使用 GLFW 和 GLEW/GLXW,如果您尝试在在创建一个带有 GLFW 的有效 OpenGL 上下文:
if (!glfwInit())
std::cerr << "GL initialization failed" << std::endl;
return 1;
// Setup the openGL profile you need - we're going with a 4.3 core profile
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
// Context creation happens in the line below
GLFWwindow *window = glfwCreateWindow(800, 600, "text", NULL, NULL);
if (!window)
std::cerr << "Window or GL initialization failed";
glfwTerminate();
return 1;
glfwMakeContextCurrent(window);
if (glxwInit()) // Now it's a good time to initialize Xtension wranglers
std::cerr << "Failed to initialize GLXW" << std::endl;
return 1;
在创建上下文之前调用glxwInit()
将获取任何设置的默认上下文并可能触发访问冲突(可能需要在运行时获取)。
【讨论】:
【参考方案5】:如果 GLFW 有问题,您可以在他们使您的程序崩溃之前向他们询问错误消息。
Windows 示例:
创建回调函数:
#include <windows.h>
void glfw_onError(int error, const char* description)
// print message in Windows popup dialog box
MessageBox(NULL, description, "GLFW error", MB_OK);
并将其设置在代码的最开头。
glfwSetErrorCallback(glfw_onError);
我这样做并得到“The GLFW library is not initialized.
”结果我的 GLFW 库没有初始化。事实证明Ben's answer 是对的。我刚刚在这样的断言中添加了glfwInit()
:assert(glfwInit());
,所以当我为 Release 编译我的程序时它被剥离了。
【讨论】:
以上是关于glCreateShader 崩溃了的主要内容,如果未能解决你的问题,请参考以下文章