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

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

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

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

解決済

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

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

1回答

0グッド

0クリップ

1208閲覧

投稿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); //リサイズ }

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2021/11/09 13:25

こちらの質問が複数のユーザーから「過去の低評価」という指摘を受けました。

int32_t

2021/11/09 05:40

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

退会済みユーザー

2021/11/09 05:44

0で初期化しています。

回答1

0

ベストアンサー

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

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

投稿2021/11/09 06:50

退会済みユーザー

退会済みユーザー

総合スコア0

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C++

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