22

問題にならないように、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();
}
4

5 に答える 5

55

GLEWを使用する前に、GLEWを初期化する必要があります。

GLenum err = glewInit();

于 2012-09-08T08:09:44.203 に答える
6

これが発生する可能性があり、状況が明らかとはほど遠い場合は、別の状況があります。アプリケーションでglfwANDglewを使用することにした場合、次のように記述した場合は、glCreateShader()ACCESS_VIOLATIONで終了することもできます。

glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

この行をに変更すると

glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE);

NULL関数ポインタglCreateShader()によるACCESS_VIOLATIONはなくなりました。

2つのライブラリがどのように光り、glfwが互いに干渉するのか、私に聞かないでください...ブードゥーアラート!

于 2014-05-08T12:31:04.377 に答える
4

これが私の変種で、上記の@BenRujilの回答からのフォローアップです。

   glewExperimental = GL_TRUE;
    if(glewInit() != GLEW_OK)
        throw std::runtime_error("glewInit failed");
于 2014-11-05T20:24:17.203 に答える
3

GLFWGLEW/GLXWを使用している場合、GLFWで有効なopenGLコンテキストを作成する前にGLEW / GLXWを初期化しようとすると、アドレス0のアクセス違反が発生する可能性があります。

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()と、設定されているデフォルトのコンテキストがすべて取得され、アクセス違反がトリガーされる可能性があります(実行時に取得する必要がある場合があります)。

于 2016-11-28T10:28:36.803 に答える
2

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ライブラリが初期化されていないことがわかりました。ベンの答えは正しかったことがわかりました。私はちょうどglfwInit()このような主張をしていました:assert(glfwInit());それで私がリリースのために私のプログラムをコンパイルしたときにそれは取り除かれていました。

于 2019-11-25T12:43:02.847 に答える