Ich sollte die neueste Version von Glew und Glut haben, damit sollte nicht das Problem sein. Alles sollte verlinkt werden, und ich verwende MS Visual Studio 2010. Mein Programm kompiliert, aber wenn ich zu glCreateShader (GL_FRAGMENT_SHADER) bekomme, zeigt es einen Fehler: "0xC0000005: Zugriffsverletzung."glCreateShader stürzt ab
mein Programm:
#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();
}
Dank Ben. Es funktionierte. Allerdings habe ich eine andere Variante verwendet, die ich aus Gründen der Übersichtlichkeit hier als Antwort schreibe. – sinner