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

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

新規登録して質問してみよう
ただいま回答率
85.50%
OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

C++

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

Q&A

1回答

1297閲覧

glGetError: 0x502が発生する原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

C++

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

0グッド

0クリップ

投稿2022/01/31 06:08

編集2022/02/01 01:27

提示コードですがcamera->RendererBuffer()部で下記のエラー出ますこれは何が原因なのでしょうか?

現状

Camera->RendererBuffer()をコメントアウトすると普通に動くのですが他のクラスでこの関数を使うとエラーにはなりません。
これは何が影響しているのでしょうか?

glGetError: https://qiita.com/_ydah/items/da56763e94ba58af3d91

0x502: 現在のステートで無効な操作をしている場合、もしくは廃止された関数を呼び出した場合(*1)

利用ライブラリ:
opengl
freetype
glew
glfw
stbi

ソースコード全文: https://github.com/Shigurechan/AAEditor/tree/e0db42df3945fc1e1ea9879e2746ffe5eeedf9f2

Camera

cpp

1 2// ##################################### 初期化 ##################################### 3FrameWork::Camera::Camera() 4{ 5 6 // レンダリングポリゴン 7 glGenVertexArrays(1, &quadVAO); 8 glGenBuffers(1, &quadVBO); 9 10 shader = std::make_shared<FrameWork::Shader>(); 11 12 shader->Load("Asset/shader/FrameBuffer.vert", "Asset/shader/FrameBuffer.frag"); 13 14 shader->setEnable(); 15 glBindVertexArray(quadVAO); 16 glBindBuffer(GL_ARRAY_BUFFER, quadVBO); 17 18 glBufferData(GL_ARRAY_BUFFER, 24 * sizeof(float), &quad, GL_STATIC_DRAW); 19 20 GLuint attrib = shader->getAttribLocation("vertexPosition"); 21 glEnableVertexAttribArray(attrib); 22 glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0); 23 shader->setBindAttribLocation("vertexPosition"); 24 25 attrib = shader->getAttribLocation("vertexUV"); 26 glEnableVertexAttribArray(attrib); 27 glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(2 * sizeof(float))); 28 shader->setBindAttribLocation("vertexUV"); 29 30 shader->setDisable(); 31 glBindVertexArray(0); 32 glBindBuffer(GL_ARRAY_BUFFER, 0); 33 34 35 36 //MSAA バッファ 37 glGenFramebuffers(1, &frameBufferFBO); 38 glBindFramebuffer(GL_FRAMEBUFFER, frameBufferFBO); 39 glGenTextures(1, &frameBuffer); 40 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, frameBuffer); 41 glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 8, GL_RGB, windowContext->getSize().x, windowContext->getSize().y, GL_TRUE); 42 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, frameBuffer, 0); 43 44 45 //レンダリングバッファ 46 glGenRenderbuffers(1, &rbo); 47 glBindRenderbuffer(GL_RENDERBUFFER, rbo); 48 glRenderbufferStorageMultisample(GL_RENDERBUFFER, 8, GL_DEPTH24_STENCIL8, windowContext->getSize().x, windowContext->getSize().y); 49 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo); 50 51 //MSAA アタッチ 52 GLuint attachment = GL_COLOR_ATTACHMENT0; 53 glDrawBuffers(1,&attachment); 54 55 56 if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) 57 { 58 std::cerr << "Framebuffer is not complete: 0x" << glCheckFramebufferStatus(GL_FRAMEBUFFER) << std::endl; 59 assert(0); 60 } 61 glBindFramebuffer(GL_FRAMEBUFFER,0); 62 63 64 //深度マップ 65 glGenFramebuffers(1, &depthMapFBO); 66 glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO); 67 glGenTextures(1, &depthMap); 68 glBindTexture(GL_TEXTURE_2D, depthMap); 69 glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, windowContext->getSize().x, windowContext->getSize().y, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); 70 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 71 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 72 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 73 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 74 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthMap, 0); 75 76 //カラーバッファ 77 glGenFramebuffers(1, &colorBufferFBO); 78 glBindFramebuffer(GL_FRAMEBUFFER, colorBufferFBO); 79 glGenTextures(1, &colorBuffer); 80 glBindTexture(GL_TEXTURE_2D, colorBuffer); 81 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, windowContext->getSize().x, windowContext->getSize().y, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); 82 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 83 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 84 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorBuffer, 0); // we only need a color buffer 85 86 87 88 89 position = glm::vec3(0,0,0.5); //座標 90 vecLook = glm::vec3(0,0,-1); //向き 91 92 setPosition(position); 93 setLook(vecLook); 94 95} 96 97 98// ##################################### スカイボックスを設定 ##################################### 99void FrameWork::Camera::setSkyBox(GLuint tex) 100{ 101 102} 103 104 105// ##################################### 描画 ##################################### 106void FrameWork::Camera::View(std::shared_ptr<Actor> actor) 107{ 108 109 glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO); 110 glViewport(0, 0, windowContext->getSize().x, windowContext->getSize().y); 111 112 //actor->Renderer_Depth(getViewPerspective()); 113 114 glBindFramebuffer(GL_FRAMEBUFFER, frameBufferFBO); 115 glViewport(0, 0, windowContext->getSize().x, windowContext->getSize().y); 116 117 glEnable(GL_DEPTH_TEST); 118// actor->Renderer(getViewPerspective()); 119 120 glDepthFunc(GL_LEQUAL); 121 122 actor->Renderer(getViewOrthographic()); 123 124 125// actor->Renderer(getViewPerspective()); 126 glDepthFunc(GL_LESS); 127 128 glBindFramebuffer(GL_FRAMEBUFFER,0); 129} 130 131// ##################################### フレームバッファ クリア ##################################### 132void FrameWork::Camera::ClearBuffer() 133{ 134 glEnable(GL_DEPTH_TEST); 135 glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 136 glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO); 137 glClear(GL_DEPTH_BUFFER_BIT); 138 glBindFramebuffer(GL_FRAMEBUFFER, frameBufferFBO); 139 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 140 //glBindFramebuffer(GL_FRAMEBUFFER, 0); 141} 142 143// ##################################### フレームバッファ 描画 ##################################### 144void FrameWork::Camera::RendererBuffer() 145{ 146 147 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 148 149 glBindVertexArray(quadVAO); 150 glBindBuffer(GL_ARRAY_BUFFER, quadVBO); 151 shader->setEnable(); 152 153 glBindFramebuffer(GL_READ_FRAMEBUFFER, frameBuffer); 154 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, colorBufferFBO); 155 glBlitFramebuffer(0, 0, windowContext->getSize().x, windowContext->getSize().y, 0, 0, windowContext->getSize().x, windowContext->getSize().y, GL_COLOR_BUFFER_BIT, GL_NEAREST); 156 157 158 glBindFramebuffer(GL_FRAMEBUFFER, 0); 159 shader->setUniformSampler2D("screenTexture", 0,colorBufferFBO); 160 glDrawArrays(GL_TRIANGLES,0,6); 161 162 shader->setDisable(); 163 glBindVertexArray(0); 164 glBindBuffer(GL_ARRAY_BUFFER, 0); 165 166} 167
Title.hpp
#include "Title.hpp" #include <FrameWork.hpp> #include "Title_Menu.hpp" Title::Title() : Scene(Scene::SceneType::Title) { title = std::make_shared<Title_Menu>(); camera = std::make_unique<FrameWork::Camera>(); } void Title::Update() { //title->Update(); } void Title::Renderer() { camera->ClearBuffer(); camera->View(title); camera->RendererBuffer(); } void Title::Loop() { Update(); Renderer(); }
Title_menu

cpp

1#include "Title_Menu.hpp" 2#include "Layer.hpp" 3 4#include <FrameWork.hpp> 5 6Title_Menu::Title_Menu() : Actor() 7{ 8 renderer = std::make_shared<FrameWork::Text>(); 9 layer = std::make_shared<Layer>(glm::ivec2(18,32),25); 10 11 //layer->setCharacter(glm::ivec2(0,0),'A'); 12 13} 14 15 16 17void Title_Menu::Update() 18{ 19 20 21 22 23 24 25 26 27} 28 29void Title_Menu::Renderer(const glm::mat4 view)const 30{ 31 /* 32 for (int y = 0; y < layer->getSize().y; y++) 33 { 34 for (int x = 0; x < layer->getSize().x; x++) 35 { 36 renderer->Renderer(view,glm::ivec2(x * 25, y * 25),layer->getCharacter(glm::ivec2(x,y)).getTexture()); 37 } 38 } 39 40 */ 41} 42
Layer

cpp

1#include "Layer.hpp" 2#include <FrameWork.hpp> 3 4Layer::Layer(glm::ivec2 s,int ps) 5{ 6 position = glm::ivec2(0,ps); //座標 7 pixelSize = ps; //ピクセルサイズ 8 size = glm::vec2(0,0); //サイズ 9 10 11 character.resize(0); 12 13 Resize(s); //リサイズ 14} 15 16 17void Layer::setCharacter(glm::ivec2 pos, const char ch) 18{ 19 character.at(pos.y).at(pos.x).setCharacter(ch); 20} 21 22void Layer::Resize(glm::ivec2 s) 23{ 24 if ((s.x > size.x) && (s.y > size.y)) 25 { 26 for (int y = 0; y < s.y - size.y; y++) 27 { 28 std::vector<Character> ch; 29 for (int x = 0; x < s.x - size.x; x++) 30 { 31 ch.push_back(Character(glm::ivec2(size.x + x, size.y + y),pixelSize)); 32 } 33 character.push_back(ch); 34 } 35 36 for (int y = size.y; y < s.y; y++) 37 { 38 for (int x = size.x; x < s.x; x++) 39 { 40 character.at(y).at(x).setCharacter(' '); 41 } 42 } 43 } 44 45 46 47 size = s; 48} 49 50void Layer::setPixelSize(int s) 51{ 52 for (int y = 0; y < size.y; y++) 53 { 54 for (int x = 0; x < size.x; x++) 55 { 56 character.at(y).at(x).Resize(s); 57 } 58 } 59} 60 61Character Layer::getCharacter(glm::ivec2 pos) 62{ 63 return character.at(pos.y).at(pos.x); 64} 65 66glm::ivec2 Layer::getSize() 67{ 68 return size; 69} 70 71 72void Layer::Update() 73{ 74 75} 76
Chracter

cpp

1#include "Character.hpp" 2 3Character::Character(glm::vec2 pos,int pixel) 4{ 5 position = pos; 6 character = '\0'; 7 pixelSize = pixel; 8} 9 10void Character::setCharacter(const char ch) 11{ 12 character = ch; 13 DeleteCharacterTexture(texture); 14 texture = FrameWork::GenCharacterTexture("Asset/font/PressStart2P.ttf", pixelSize, FrameWork::GetRGBAColor(glm::vec4(0, 255, 0, 255)), "%c",ch); 15} 16 17void Character::Resize(int pixel) 18{ 19 pixelSize = pixel; 20 DeleteCharacterTexture(texture); 21 texture = FrameWork::GenCharacterTexture("Asset/font/PressStart2P.ttf", pixelSize, FrameWork::GetRGBAColor(glm::vec4(0, 255, 0, 255)), "%c", character); 22} 23 24 25 26glm::ivec2 Character::getPosition() 27{ 28 return position; 29} 30 31FrameWork::CharacterTexture* Character::getTexture() 32{ 33 return &texture; 34} 35 36void Character::Update() 37{ 38 39} 40 41void Character::Renderer(const glm::ivec2 pos,const glm::mat4 view)const 42{ 43 switch(character) 44 { 45 46 case 0x28: // ( 47 { 48 49 } 50 break; 51 52 case 0x29: // ) 53 { 54 55 } 56 break; 57 58 59 default: 60 { 61 62 } 63 break; 64 65 } 66}

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

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

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

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

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

guest

回答1

0

c++

1std::vector<Character> ch; 2for (int x = 0; x < s.x - size.x; x++) 3{ 4 ch.push_back(Character(glm::ivec2(size.x + x, size.y + y),pixelSize));

Character はコピー・ムーブに正しく対応できている必要があります。Characterクラス内で何かしらのリソースの確保・開放処理がある場合はかなり注意深く実装する必要があります。
対処方法はこれまで4回ぐらい書いた気がします。

投稿2022/01/31 06:45

int32_t

総合スコア20659

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

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

退会済みユーザー

退会済みユーザー

2022/01/31 07:00 編集

すいません。よく考えましたが対処法がわかりません。このクラスにはアドレス変数を等は入っていないので 一時的変数のアドレスがコピーされて無効なアドレスが変数に入っているとは思えないのですが
退会済みユーザー

退会済みユーザー

2022/01/31 07:17 編集

textureは構造体です。またアドレス変数は持っていないのですが texture変数はテクスチャの札のようなものなので コピーされても大丈夫だと思うのですが何がおかしいのでしょうか? もう少し詳細によろしいでしょうか?
int32_t

2022/01/31 07:18

アドレスは関係ありません。 Character がコピーされると Character::texture::textureID の開放処理が複数回走ってしまってまずくないですか、ということです。
退会済みユーザー

退会済みユーザー

2022/01/31 07:31 編集

なるほど。ベクター配列に要素を確保するfor文と初期値を設定するfor文とで分けたのですが同じエラー出ます。 これはなぜでしょうか? またtextureIDの解放処理が毎回走るとありますがデストラクタは書いていません。これはどいう意味なのでしょうか? 追記提示コードを追加しました。
int32_t

2022/01/31 07:35

完全なコードなしで推測で問題になりそうなことを指摘しているだけなので、この回答が的外れである可能性はもちろんあります。頑張ってデバッグしてくださいね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問