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

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

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

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

C++

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

解決済

OpenGL ウインドウコンテキストをextern化することは正解なのかどうか知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

2回答

0リアクション

0クリップ

481閲覧

投稿2022/08/29 12:11

タイトル通りですがOpenGLでいろいろな場所で使うウインドウコンテキスト変数をextern化する行為は正解なのでしょうか?
参考サイトのextern宣言が不要なシステム設計を目指せ!項目のグローバル変数をファイル間で共有する設計は危険の文章を読んだのですがそれを踏まえて下記のコード設計はどうなのでしょうか?
extern変数 Data.hpp部のextern std::shared_ptr<FrameWork::Window> windowContext;Main.cppで定義されていて
Player.cpp,Enemy.cppでテクスチャサイズに合わせて画像を拡大縮小させるためにウインドウサイズの情報が必要なのでいちいち引数に取っては面倒なのでextern化したいのですがこれはどうなのでしょうか?ちなみにこのプロジェクトではウインドウは一つの予定なのです。またゲーム制作です。

参考サイト:https://monozukuri-c.com/langc-funclist-extern/

Data.hpp

cpp

#ifndef ___DATA_HPP___ #define ___DATA_HPP___ #include "Window.hpp" #include <memory> extern std::shared_ptr<FrameWork::Window> windowContext; #endif
Main.cpp

cpp

#include "Window.hpp" #include "Init.hpp" #include "Sprite.hpp" #include "Camera.hpp" #include "Shader.hpp" #include <memory> #include <iostream> #include "Data.hpp" #include "Player.hpp" #include "Enemy.hpp" std::shared_ptr<FrameWork::Window> windowContext =nullptr; int main() { if(glfwInit() != GLFW_TRUE) { assert(0 && "glfw 初期化失敗"); } windowContext = std::make_shared<FrameWork::Window>(glm::ivec2(800,600),"Hello World"); windowContext->setCurrentContext(); // OpenGL Verison 4.5 Core Profile glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); if(glewInit() != GLEW_OK) { assert(0 && "glew 初期化失敗"); } std::shared_ptr<FrameWork::Camera> camera = std::make_shared<FrameWork::Camera>(windowContext); //camera->shader->Load("ast/sdr/FrameBuffer.vert", "ast/sdr/FrameBuffer.frag"); camera->setPosition(glm::vec3(0,0,1)); camera->setLook(glm::vec3(0,0,-1)); std::shared_ptr<Player> player = std::make_shared<Player>(); std::shared_ptr<Enemy> enemy = std::make_shared<Enemy>(); while(*windowContext) { // camera->ClearBuffer(); player->Update(); enemy->Update(); camera->View(player); camera->View(enemy); camera->RendererBuffer(); windowContext->SwapBuffers(); } return 0; }
Player.cpp

cpp

#include "Player.hpp" #include "Shader.hpp" #include "Data.hpp" #include <iostream> #include <glm/glm.hpp> #define SPRITE_NUMBER ((int)(1)) Player::Player() { sprite = std::make_shared<FrameWork::Sprite>(); sprite->shader = std::make_shared<FrameWork::Shader>(); sprite->shader->Load("ast/sdr/3D/texture/BasicTexture.vert","ast/sdr/3D/texture/BasicTexture.frag"); texture = FrameWork::LoadTexture("ast/tex/debug.png",glm::vec2(8,8)); // std::cout<<texture.at(1).position.start.x<<std::endl; // std::cout<<texture.at(1).position.start.y<<std::endl; } void Player::Update() { transform.setPosition(glm::vec3(-0.3,0,-1)); //座標 transform.setSizeScale(texture.at(SPRITE_NUMBER).position.start,texture.at(SPRITE_NUMBER).position.end); //画像サイズスケール transform.setRotate(glm::vec3(1,0,0),glm::vec3(1,0,0)); //回転 } void Player::Render(glm::mat4 view)const { sprite->setAttributePosition("vertexPosition"); sprite->setAttributeUV("vertexUV"); sprite->setTexture(0,texture.at(SPRITE_NUMBER)); sprite->shader->setEnable(); sprite->shader->setUniformSampler2D("uImage",0,texture.at(SPRITE_NUMBER).id); sprite->shader->setUniformMatrix4x4fv("uViewProjection", view); sprite->shader->setUniformMatrix4x4fv("uScale", transform.getMatSizeScale(windowContext)); sprite->shader->setUniformMatrix4x4fv("uTranslate",transform.getMatTranslation()); sprite->shader->setUniformMatrix4x4fv("uRotate", transform.getMatRotate()); sprite->Render(view); sprite->shader->setDisable(); } Player::~Player() { }
Enemy.cpp

cpp

#include "Enemy.hpp" #include "Shader.hpp" #include "Data.hpp" #include <iostream> #include <glm/glm.hpp> #define SPRITE_NUMBER ((int)(3)) Enemy::Enemy() { sprite = std::make_shared<FrameWork::Sprite>(); sprite->shader = std::make_shared<FrameWork::Shader>(); sprite->shader->Load("ast/sdr/3D/texture/BasicTexture.vert","ast/sdr/3D/texture/BasicTexture.frag"); texture = FrameWork::LoadTexture("ast/tex/debug.png",glm::vec2(8,8)); // std::cout<<texture.at(1).position.start.x<<std::endl; // std::cout<<texture.at(1).position.start.y<<std::endl; } void Enemy::Update() { transform.setPosition(glm::vec3(0.3,0,-1)); //座標 transform.setSizeScale(texture.at(SPRITE_NUMBER).position.start,texture.at(SPRITE_NUMBER).position.end); //画像サイズスケール transform.setRotate(glm::vec3(1,0,0),glm::vec3(1,0,0)); //回転 } void Enemy::Render(glm::mat4 view)const { sprite->setAttributePosition("vertexPosition"); sprite->setAttributeUV("vertexUV"); sprite->setTexture(0,texture.at(SPRITE_NUMBER)); sprite->shader->setEnable(); sprite->shader->setUniformSampler2D("uImage",0,texture.at(SPRITE_NUMBER).id); sprite->shader->setUniformMatrix4x4fv("uViewProjection", view); sprite->shader->setUniformMatrix4x4fv("uScale", transform.getMatSizeScale(windowContext)); sprite->shader->setUniformMatrix4x4fv("uTranslate",transform.getMatTranslation()); sprite->shader->setUniformMatrix4x4fv("uRotate", transform.getMatRotate()); sprite->Render(view); sprite->shader->setDisable(); } Enemy::~Enemy() { }

以下のような質問にはリアクションをつけましょう

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

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

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

2022/08/29 12:19

こちらの質問が他のユーザーから「問題・課題が含まれていない質問」という指摘を受けました。

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

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

OpenGL

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

C++

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