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

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

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

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

C++

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

受付中

[OpenGL] 画面サイズを変えると描画位置がおかしくなる原因が知りたい

samidare_chan
samidare_chan

総合スコア142

OpenGL

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

C++

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

1回答

-3評価

0クリップ

382閲覧

投稿2022/04/23 10:28

編集2022/04/29 07:30

提示画像ですが一枚目は実行時で二枚目は画面を横伸ばしした時の画像ですが画面サイズが変わっても同じように画面の中央に表示させるにはどうすればいいのでしょうか?画面サイズがリサイズされた際に ビューポートのサイズを変更して透視投影行列の行列を画面サイズのアスペクト比に毎フレーム変更を適用しているのですがこれはなぜでしょうか?カスタムフレームバッファを利用しています。

ソースファイル全文:https://29.gigafile.nu/0501-d7dcf96b048a4eb8c01e1935fd44736de

現状

1,リサイズイベントを実装しています。
2,ビューポートで画面サイズを変更した際に再設定しています。
3,画面サイズがリサイズされた際に ビューポートのサイズを変更して透視投影行列の行列を画面サイズのアスペクト比に毎フレーム変更を適用
4,カスタムフレームバッファを利用しています。

参考サイト

https://tatsy.github.io/OpenGLCourseJP/window_resize/

イメージ説明
イメージ説明

Window.cpp

cpp

glfwSetWindowSizeCallback(window, Resize_Event); //ウインドウサイズ // ##################################### イベント処理 画面サイズ変更 ##################################### void FrameWork::Window::Resize_Event(GLFWwindow* const win, int width, int height) { int fbWidth, fbHeight; glfwGetFramebufferSize(win, &fbWidth, &fbHeight); glViewport(0, 0, fbWidth, fbHeight); Window* const instance = (Window*)glfwGetWindowUserPointer(win); if (instance != NULL) { instance->size.x = (GLfloat)fbWidth; instance->size.y = (GLfloat)fbHeight; } }
Camera.cpp

cpp

//一部抜粋 // ##################################### 透視投影行列 ##################################### glm::mat4 FrameWork::Camera::getViewPerspective() { return glm::perspective(glm::radians(90.0f), ((float)currentWindow->getSize().x / (float)currentWindow->getSize().y), 0.1f, 1000.0f) * view; }
Sprite.cpp

cpp

// ##################################### テクスチャ描画 公開 ##################################### void FrameWork::RenderGraph(const glm::mat4 view,const glm::vec3 position,const FrameWork::Texture texture) { FrameWork::sprite->Render(view,position,texture); } // ##################################### コンストラクタ ##################################### FrameWork::Sprite::Sprite() : FrameWork::Transform() { vao = 0; vbo = 0; glGenVertexArrays(1, &vao); glGenBuffers(1, &vbo); glBindVertexArray(vao); glBindBuffer(GL_ARRAY_BUFFER, vbo); shader = std::make_unique<Shader>(); shader->Load("Asset/shader/2D/BasicTexture_2D.vert","Asset/shader/2D/BasicTexture_2D.frag"); shader->setEnable(); glBufferData(GL_ARRAY_BUFFER, vertex.size() * sizeof(VertexAttribute), (float*)vertex.data(), GL_DYNAMIC_DRAW); GLuint attrib = shader->getAttribLocation("vertexPosition"); glEnableVertexAttribArray(attrib); glVertexAttribPointer(attrib, 3, GL_FLOAT, GL_FALSE, (sizeof(VertexAttribute) / sizeof(float)) * sizeof(float), (GLvoid*)(sizeof(GLfloat) * 0)); shader->setBindAttribLocation("vertexPosition"); attrib = shader->getAttribLocation("vertexUV"); glEnableVertexAttribArray(attrib); glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, (sizeof(VertexAttribute) / sizeof(float)) * sizeof(float), (GLvoid*)(sizeof(GLfloat) * 3)); shader->setBindAttribLocation("vertexUV"); shader->setDisable(); glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); } // ##################################### テクスチャ描画 ##################################### void FrameWork::Sprite::Render(const glm::mat4 view,const glm::vec3 position,const FrameWork::Texture texture) { shader->setEnable(); glm::vec2 screenSize = glm::vec2(1.0f / FrameWork::currentWindow->getSize().x,1.0f / FrameWork::currentWindow->getSize().y); glBindVertexArray(vao); glBindBuffer(GL_ARRAY_BUFFER, vbo); setSize(glm::ivec2(0,0),texture.size); setUV(glm::ivec2(0,0),texture.size,texture.size); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VertexAttribute) * vertex.size(), vertex.data()); Transform::setPosition(glm::vec3(screenSize.x * position.x,screenSize.y * position.y,0)); Transform::setPosition(glm::vec3(position.x,position.y,0)); Transform::setRotate(glm::vec3(0, 0, 1), 0); Transform::setScale(glm::vec3(texture.size,1)); shader->setUniformSampler2D("uImage",0,texture.ID); shader->setUniformMatrix4fv("uTranslate", Transform::getMatTranslation()); shader->setUniformMatrix4fv("uRotate", Transform::getMatRotate()); shader->setUniformMatrix4fv("uScale", Transform::getMatScale()); shader->setUniformMatrix4fv("uViewProjection", view); glDrawArrays(GL_TRIANGLES,0,vertex.size()); glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); shader->setDisable(); } // ##################################### 頂点 ##################################### void FrameWork::Sprite::setSize(const glm::vec2 startSize,const glm::vec2 endSize) { glm::vec2 scr = glm::ivec2(1,1); scr.x = 1.0f/ 2.0f; scr.y = 1.0f/ 2.0f; // 頂点座標 vertex[0].position.x = -scr.x; vertex[0].position.y = scr.y; vertex[0].position.z = 0; vertex[1].position.x = -scr.x; vertex[1].position.y = -scr.y; vertex[1].position.z = 0; vertex[2].position.x = scr.x; vertex[2].position.y = scr.y; vertex[2].position.z = 0; vertex[3].position.x = scr.x; vertex[3].position.y = scr.y; vertex[3].position.z = 0; vertex[4].position.x = -scr.x; vertex[4].position.y = -scr.y; vertex[4].position.z = 0; vertex[5].position.x = scr.x; vertex[5].position.y = -scr.y; vertex[5].position.z = 0; } // ##################################### 頂点 ##################################### void FrameWork::Sprite::setUV(const glm::vec2 startSize, const glm::vec2 endSize,const glm::ivec2 textureSize) { glm::vec2 size = endSize - startSize; //UV座標 float sizeX = 1.0f / (float)textureSize.x; float sizeY = 1.0f / (float)textureSize.y; FrameWork::Sprite::vertex[0].uv.x = sizeX * startSize.x; FrameWork::Sprite::vertex[0].uv.y = sizeY * startSize.y; FrameWork::Sprite::vertex[1].uv.x = sizeX * startSize.x; FrameWork::Sprite::vertex[1].uv.y = sizeY * endSize.y; FrameWork::Sprite::vertex[2].uv.x = sizeX * endSize.x; FrameWork::Sprite::vertex[2].uv.y = sizeY * startSize.y; FrameWork::Sprite::vertex[3].uv.x = sizeX * endSize.x; FrameWork::Sprite::vertex[3].uv.y = sizeY * startSize.y; FrameWork::Sprite::vertex[4].uv.x = sizeX * startSize.x; FrameWork::Sprite::vertex[4].uv.y = sizeY * endSize.y; FrameWork::Sprite::vertex[5].uv.x = sizeX * endSize.x; FrameWork::Sprite::vertex[5].uv.y = sizeY * endSize.y; } FrameWork::Sprite::~Sprite() { }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

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

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

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

OpenGL

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

C++

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