質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2342閲覧

Opengl glGenFramebuffers()関数を使うとクラッシュする原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/11/09 05:36

編集2021/11/09 06:47

提示コードですがフレームバッファを作成するために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); //リサイズ }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

int32_t

2021/11/09 05:40

変数 framebuffer をどう初期化していますか。
退会済みユーザー

退会済みユーザー

2021/11/09 05:44

0で初期化しています。
guest

回答1

0

ベストアンサー

glGenFramebuffers() の前に下記のコードで必要で初期化する必要がありました。

if (glewInit() != GLEW_OK) { std::cerr << "GLFW 初期化失敗" << std::endl; exit(1); }

投稿2021/11/09 06:50

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問