2012-09-08 46 views
13

को क्रैश कर रहा है मेरे पास ग्लेव और ग्लूट का नवीनतम संस्करण होना चाहिए ताकि समस्या न हो। सबकुछ जोड़ा जाना चाहिए, और मैं एमएस विजुअल स्टूडियो 2010 का उपयोग कर रहा हूं। मेरा प्रोग्राम संकलित करता है लेकिन जब मैं glCreateShader (GL_FRAGMENT_SHADER) पर जाता हूं तो यह एक त्रुटि दिखाता है: "0xC0000005: एक्सेस उल्लंघन।"glCreateShader

मेरा कार्यक्रम:

#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(); 
} 

उत्तर

37

आप Glew प्रारंभ करने से पहले आप इसे उपयोग कर सकते हैं:

GLenum err = glewInit();

+0

धन्यवाद बेन। इसने काम कर दिया। हालांकि मैंने एक और संस्करण का उपयोग किया जिसे मैं स्पष्टता के लिए नीचे दिए गए उत्तर के रूप में पोस्ट कर रहा हूं। – sinner

2

एक और स्थिति है जब यह भी हो सकता है और शर्तों स्पष्ट से दूर हैं नहीं है। आप अपने आवेदन में glfw और Glew उपयोग करने का निर्णय, तो आप भी, glCreateShader() ACCESS_VIOLATION में खत्म हो सकता है अगर आप ने लिखा है:

आप

glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE); 

कारण ACCESS_VIOLATION को यह लाइन को बदलते हैं नल फ़ंक्शन पॉइंटर glCreateShader() पर चला गया है।

मुझसे मत पूछो, कैसे दो पुस्तकालयों को एक दूसरे के साथ हस्तक्षेप और glfw हस्तक्षेप ... voodoo अलर्ट!

+2

मैंने glfwMakeContextCurrent() के बाद glewInit() को कॉल करके उस समस्या को हल किया। – jimvonmoon

+0

@ जिमवोनमून के सुझाव के अलावा, जिस छायादार को शेडर का संबंध है, उसे शेडर निर्माण के उस समय वर्तमान होना चाहिए। यह मेरी गलती थी। – scones

+0

धन्यवाद, आपने मुझे 10 दिनों के डिबगिंग से बचाया – Matth

0

यहां मेरा संस्करण है जो उपरोक्त @ बेनरुजिल के उत्तर से अनुवर्ती है।

glewExperimental = GL_TRUE; 
    if(glewInit() != GLEW_OK) 
     throw std::runtime_error("glewInit failed"); 
0

आप GLFW और उपयोग कर रहे हैं Glew/GLXW, पता 0 के लिए एक पहुँच उल्लंघन हो रही हो सकता है GLFW के साथ एक मान्य ओपन संदर्भ बनाने से पहले यदि आप Glew/GLXW प्रारंभ करने की कोशिश कर रहे:

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() लेने करेगा जो डिफ़ॉल्ट संदर्भ सेट किया गया है और (रनटाइम पर उठाया जा करना पड़ सकता है) पहुँच उल्लंघन को गति प्रदान कर सकते हैं।