instalar - opengl ejemplos c++
glCreateShader está fallando (4)
Debería tener la versión más reciente de Glew y Glut para que no sea el problema. Todo debería estar vinculado, y estoy usando MS Visual Studio 2010. Mi programa se compila, pero cuando llego a glCreateShader (GL_FRAGMENT_SHADER) muestra un error: "0xC0000005: infracción de acceso".
mi programa:
#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();
}
Aquí está mi variante que es un seguimiento de la respuesta de @BenRujil arriba.
glewExperimental = GL_TRUE;
if(glewInit() != GLEW_OK)
throw std::runtime_error("glewInit failed");
Hay otra situación en la que esto puede suceder y las condiciones distan mucho de ser obvias. Si decides usar glfw AND glew en tu aplicación, también puedes terminar en glCreateShader () ACCESS_VIOLATION, si escribiste:
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
Si cambia esta línea a
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE);
el ACCESS_VIOLATION debido al puntero de la función NULL glCreateShader () se ha ido.
No me preguntes, cómo las dos bibliotecas brillan y glfw interfieren entre sí ... ¡alerta vudú!
Si está utilizando GLFW y GLEW / GLXW, puede producirse una infracción de acceso para la dirección 0 si está intentando inicializar GLEW / GLXW antes de crear un contexto de OpenGL válido con GLFW:
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;
}
Llamar a glxwInit()
antes de la creación del contexto detectará cualquier contexto predeterminado que se establezca y puede desencadenar la infracción de acceso (es posible que deba detectarse en tiempo de ejecución).
Tienes que inicializar GLEW antes de poder usarlo:
GLenum err = glewInit();