glCreateShader plante
Je devrais avoir la version la plus récente de Glew et Surabondance de sorte que ne devrait pas être le problème. Tout doit être lié, et je suis à l'aide de MS visual studio 2010.
Mon programme compile mais quand j'arrive à glCreateShader(GL_FRAGMENT_SHADER) ça affiche une erreur: "0xC0000005: violation d'Accès."
mon programme:
#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();
}
source d'informationauteur Parker Olson
Vous devez vous connecter pour publier un commentaire.
Vous devez les initialiser GLEW avant de pouvoir l'utiliser:
GLenum err = glewInit();
Il y a une autre situation, quand cela peut se produire et les conditions sont loin d'être évidentes.
Si vous décidez d'utiliser glfw ET glew dans votre application, vous pouvez également mettre fin à glCreateShader() ACCESS_VIOLATION, si vous avez écrit:
Si vous modifiez cette ligne pour
la ACCESS_VIOLATION en raison de la fonction NULL le pointeur de glCreateShader() est parti.
Ne me demandez pas, comment les deux bibliothèques glew et glfw interfèrent les uns avec les autres... le vaudou alerte!
Si vous utilisez GLFW et GLEW/GLXW, l'obtention d'une violation d'accès de l'adresse 0 peut se produire si vous essayez d'initialiser GLEW/GLXW avant la création d'un contexte openGL valide avec GLFW:
Appel
glxwInit()
avant la création du contexte va ramasser tout ce contexte par défaut est définie et peut déclencher la violation d'accès (peut-être besoin d'être repris au moment de l'exécution).Voici ma variante, qui est un suivi de @BenRujil la réponse ci-dessus.