提示コードですがフレームバッファを作成するためにglGenFramebuffers()関数をコールしていいるのですがこれを使うとクラッシュします。何が原因なのでしょうか?
#####試したこと
ウインドウコンテキストを先に初期化
「EXT」バージョンの関数を利用
Openglのバージョンを下げる
参考サイト
1: https://stackoverflow.com/questions/15165863/glgenframebuffers-access-violation-when-using-glfw-glew
2: https://learnopengl.com/Advanced-OpenGL/Framebuffers
端末
$ make g++ -std=c++2a -I/usr/local/include/freetype2 -I/usr/local/include/glm -I/usr/include/libpng16 -I/usr/local/include -pthread -c -MMD -MP FrameWork/source/Window.cpp -o FrameWork/obj/Window.o ar rc FrameWork.a FrameWork/obj/Render.o FrameWork/obj/Shape.o FrameWork/obj/Sprite.o FrameWork/obj/Transform.o FrameWork/obj/Camera.o FrameWork/obj/Init.o FrameWork/obj/Resource.o FrameWork/obj/Text.o FrameWork/obj/Shader.o FrameWork/obj/Model.o FrameWork/obj/Simple.o FrameWork/obj/Help.o FrameWork/obj/Window.o ranlib FrameWork.a g++ Game/obj/Control.o Game/obj/Scene.o Game/obj/Entry.o Game/obj/Game.o Game/obj/Main.o Game/obj/LightCube.o Game/obj/Player.o Game/obj/Actor.o Game/obj/Ground.o Game/obj/Cube.o -o program -ldl -lGLESv2 -lassimp -L -l FrameWork.a -L/usr/local/lib -lGLU -lGL -lglfw3 -pthread -lGL -lGLEW -lfreetype -lX11 [shigurechan@localhost TopViewGame]$ ./program あああああ Segmentation fault (コアダンプ) [shigurechan@localhost TopViewGame]$
#####Window.cpp
// ##################################### コンストラクタ ##################################### FrameWork::Window::Window(glm::ivec2 size, const char* title) { window = std::make_shared<GLFWwindow*>(glfwCreateWindow(size.x, size.y, title, NULL, NULL)); // window = glfwCreateWindow(size.x, size.y, title, NULL, NULL); glfwMakeContextCurrent(*window); //コンテキストを作成 glfwSwapInterval(1); //垂直同期 printf("あああああ\n"); glGenFramebuffers(1, &framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); printf("いいいいいい\n"); // create a color attachment texture glGenTextures(1, &textureColorbuffer); glBindTexture(GL_TEXTURE_2D, textureColorbuffer); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, size.x, size.y, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureColorbuffer, 0); // create a renderbuffer object for depth and stencil attachment (we won't be sampling these) glGenRenderbuffers(1, &rbo); glBindRenderbuffer(GL_RENDERBUFFER, rbo); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, size.x, size.y); // use a single renderbuffer object for both a depth AND stencil buffer. glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo); // now actually attach it // now that we actually created the framebuffer and added all attachments we want to check if it is actually complete now if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { std::cerr<< "ERROR::FRAMEBUFFER:: Framebuffer is not complete!" << std::endl; } glBindFramebuffer(GL_FRAMEBUFFER, 0); //フレーム shader = std::make_unique<Shader>(); shader->Load("../../FrameWork/Shader/FrameBuffer.vert","../../FrameWork/Shader/FrameBuffer.frag"); glGenVertexArrays(1, &quadVAO); glGenBuffers(1, &quadVBO); glBindVertexArray(quadVAO); glBindBuffer(GL_ARRAY_BUFFER, quadVBO); glBufferData(GL_ARRAY_BUFFER, sizeof(quadVertices), &quadVertices, GL_STATIC_DRAW); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0); glEnableVertexAttribArray(1); glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(2 * sizeof(float))); shader->setUniform1i("screenTexture", 0); //変数を初期化 std::fill(std::begin(keyBoard), std::end(keyBoard), 0); //キーボード入力配列を初期化 std::fill(std::begin(key), std::end(key), 0); //キーボード入力配列を初期化 std::fill(std::begin(mouseButton), std::end(mouseButton), 0); //マウス入力配列を初期化 mouseWheel = 0; //マウスホイール inputKey = 0; //文字入力 //フレーム管理 count = 0; //現在のフレーム startCount = 0; //最初の時間 //コンテキストの作成に失敗 if (*window == NULL) { std::cerr << "ウインドウ生成失敗" << std::endl; exit(1); //異常終了 } else { //std::cout << "ウインドウコンテキスト初期化" << std::endl; } if (glewInit() != GLEW_OK) { std::cerr << "GLFW 初期化失敗" << std::endl; exit(1); } atexit(glfwTerminate); //プログラム終了時の処理を登録 glfwSwapInterval(1); //垂直同期 //イベント処理 glfwSetWindowUserPointer(*window, this); //このインスタンスのthis glfwSetWindowSizeCallback(*window, Resize); //ウインドウサイズを変更する時に呼び出す処理 glfwSetDropCallback(*window,DragAndDrop); //ドラック&ドロップ glfwSetScrollCallback(*window,MouseScroll); //マウスのホイール glfwSetCharCallback(*window,KeyInputChar); //テキスト入力 glfwSetKeyCallback(*window,KeyInput); //キー入力 glfwSetInputMode(*window, GLFW_RAW_MOUSE_MOTION, GLFW_TRUE); Resize(*window, size.x, size.y); //リサイズ }
変数 framebuffer をどう初期化していますか。
0で初期化しています。
回答1件
あなたの回答
tips
プレビュー