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

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

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

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

C++

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

Q&A

0回答

1026閲覧

全ての描画物で共有する頂点コードで頂点とカメラクラスをstatic にする行為は正しいのかどうか?

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

C++

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

0グッド

0クリップ

投稿2021/07/06 08:53

編集2021/07/07 03:16

提示コードですが頂点情報を全ての描画物で共有してメモリを節約したいのでカメラクラスのstatic 変数で定義しているのですがこれは実装としてありなのでしょうか?正解なのでしょうか?

またスプライトクラスのコンストラクタ引数で頂点属性のタイプを取得して法線がるときない時で処理を分ける必要があるので引数に取っているんのですがこれは正しいのでしょうか?

プログラミングに正解はないとよく聞きますがこの実装は回りくどいのかどうか知りたいです。

cpp

1#include "Sprite.hpp" 2 3 4 5// ##################################### コンストラクタ ##################################### 6FrameWork::Sprite::Sprite(FrameWork::Vertex::Attribute type, const char* vert, const char* frag) : Render_2D() 7{ 8 shader = std::make_shared<FrameWork::Shader>(); //シェーダー 9 10 if (vert == NULL || frag == NULL) 11 { 12 shader->Input(FrameWork::Resource::getShader(FrameWork::Resource::Asset::shader_BasicTexture_vert), FrameWork::Resource::getShader(FrameWork::Resource::Asset::shader_BasicTexture_frag)); 13 } 14 else 15 { 16 shader->Input((char*)vert,(char*)frag); 17 } 18 19 vertex = FrameWork::Camera_2D::getVertexAttribute(); //頂点属性を取得 20 vertex->resize(6); 21 if (type == FrameWork::Vertex::Attribute::UV) 22 { 23 //頂点 24 GLint attrib = shader->getAttribLocation("vertexPosition"); 25 glEnableVertexAttribArray(attrib); 26 glBufferData(GL_ARRAY_BUFFER, vertex->size() * sizeof(Vertex::ALL_2D), vertex->data(), GL_DYNAMIC_DRAW); 27 glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 11 * sizeof(GLfloat), (GLvoid*)0); 28 shader->setBindAttribLocation("vertexPosition"); 29 30 //UV 31 attrib = shader->getAttribLocation("vertexUV"); 32 glEnableVertexAttribArray(attrib); 33 glBufferData(GL_ARRAY_BUFFER, vertex->size() * sizeof(Vertex::ALL_2D), vertex->data(), GL_DYNAMIC_DRAW); 34 glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 11 * sizeof(GLfloat), (GLvoid*)(sizeof(GLfloat) * 2)); 35 shader->setBindAttribLocation("vertexUV"); 36 37 } 38 else if (type == FrameWork::Vertex::Attribute::Normal) 39 { 40 //頂点 41 GLint attrib = shader->getAttribLocation("vertexPosition"); 42 glEnableVertexAttribArray(attrib); 43 glBufferData(GL_ARRAY_BUFFER, vertex->size() * sizeof(Vertex::ALL_2D), vertex->data(), GL_DYNAMIC_DRAW); 44 glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 11 * sizeof(GLfloat), (GLvoid*)0); 45 shader->setBindAttribLocation("vertexPosition"); 46 47 //UV 48 attrib = shader->getAttribLocation("vertexUV"); 49 glEnableVertexAttribArray(attrib); 50 glBufferData(GL_ARRAY_BUFFER, vertex->size() * sizeof(Vertex::ALL_2D), vertex->data(), GL_DYNAMIC_DRAW); 51 glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 11 * sizeof(GLfloat), (GLvoid*)(sizeof(GLfloat) * 2)); 52 shader->setBindAttribLocation("vertexUV"); 53 54 //Normal 55 attrib = shader->getAttribLocation("vertexNormal"); 56 glEnableVertexAttribArray(attrib); 57 glBufferData(GL_ARRAY_BUFFER, vertex->size() * sizeof(Vertex::ALL_2D), vertex->data(), GL_DYNAMIC_DRAW); 58 glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 11 * sizeof(GLfloat), (GLvoid*)(sizeof(GLfloat) * 4)); 59 shader->setBindAttribLocation("vertexNormal"); 60 61 62 } 63 64 texture.resize(0); //テクスチャデータ 65} 66 67// ##################################### テクスチャ 設定 ##################################### 68void FrameWork::Sprite::InputTexture(std::shared_ptr<FrameWork::Resource::Texture> tex) 69{ 70 //文字数の関係 71} 72 73 74// ##################################### 頂点属性 ##################################### 75 76void FrameWork::Sprite::setAttribute() 77{ 78 79 // 頂点座標 80 vertex->at(0).position[0] = -0.5f; 81 vertex->at(0).position[1] = 0.5f; 82 83 vertex->at(1).position[0] = -0.5f; 84 vertex->at(1).position[1] = -0.5f; 85 86 vertex->at(2).position[0] = 0.5f; 87 vertex->at(2).position[1] = 0.5f; 88 89 vertex->at(3).position[0] = 0.5f; 90 vertex->at(3).position[1] = 0.5f; 91 92 vertex->at(4).position[0] = -0.5f; 93 vertex->at(4).position[1] = -0.5f; 94 95 vertex->at(5).position[0] = 0.5f; 96 vertex->at(5).position[1] = -0.5f; 97 98 //UV座標 99 float sizeX = 1.0f / (float)texture.at(textureNumber).size.x; 100 float sizeY = 1.0f / (float)texture.at(textureNumber).size.y; 101 102 vertex->at(0).uv[0] = sizeX * startSize.x; 103 vertex->at(0).uv[1] = sizeY * endSize.y; 104 105 vertex->at(1).uv[0] = sizeX * startSize.x; 106 107 vertex->at(1).uv[1] = sizeY * startSize.y; 108 109 vertex->at(4).uv[0] = sizeX * startSize.x; 110 vertex->at(4).uv[1] = sizeY * startSize.y; 111 112 vertex->at(2).uv[0] = sizeX * endSize.x; 113 vertex->at(2).uv[1] = sizeY * endSize.y; 114 115 vertex->at(3).uv[0] = sizeX * endSize.x; 116 vertex->at(3).uv[1] = sizeY * endSize.y; 117 118 vertex->at(5).uv[0] = sizeX * endSize.x; 119 vertex->at(5).uv[1] = sizeY * startSize.y; 120 121} 122 123 124// ##################################### 法線 設定 ##################################### 125void FrameWork::Sprite::setNormal(std::shared_ptr<std::array<glm::vec3, 6>> n) 126{ 127 if (n != nullptr) 128 { 129 vertex->at(0).normal[0] = n->at(0).x; 130 vertex->at(0).normal[1] = n->at(0).y; 131 vertex->at(0).normal[2] = n->at(0).z; 132 133 vertex->at(1).normal[0] = n->at(1).x; 134 vertex->at(1).normal[1] = n->at(1).y; 135 vertex->at(1).normal[2] = n->at(1).z; 136 137 vertex->at(2).normal[0] = n->at(2).x; 138 vertex->at(2).normal[1] = n->at(2).y; 139 vertex->at(2).normal[2] = n->at(2).z; 140 141 vertex->at(3).normal[0] = n->at(3).x; 142 vertex->at(3).normal[1] = n->at(3).y; 143 vertex->at(3).normal[2] = n->at(3).z; 144 145 vertex->at(4).normal[0] = n->at(4).x; 146 vertex->at(4).normal[1] = n->at(4).y; 147 vertex->at(4).normal[2] = n->at(4).z; 148 149 vertex->at(5).normal[0] = n->at(5).x; 150 vertex->at(5).normal[1] = n->at(5).y; 151 vertex->at(5).normal[2] = n->at(5).z; 152 } 153} 154 155// ##################################### 描画指定 ##################################### 156void FrameWork::Sprite::Draw(glm::vec2 pos, int texNum, float r, glm::vec2 s, glm::vec2 start, glm::vec2 end,std::shared_ptr<std::array<glm::vec3,6>> n) 157{ 158 159 vertex->resize(6); 160 161 startSize = start; //テクスチャ始点 162 endSize = end; //テクスチャ終点 163 textureNumber = texNum; //テクスチャを指定 164 setAttribute(); //頂点属性 設定 165 setNormal(n); //法線 設定 166 167 glBufferSubData(GL_ARRAY_BUFFER,0,sizeof(Vertex::ALL_2D) * vertex->size(),vertex->data()); 168 169 170 glBindTexture(GL_TEXTURE_2D, texture.at(textureNumber).ID); //テクスチャをバインド 171 //glActiveTexture(texture.at(textureNumber).unitNumber); //テクスチャを有効にする 172 173 //Transform 174 setPosition(pos); //座標 175 setScale(s + glm::vec2(end - start)); //スケール 176 setRotate(r); //回転 177 178 //描画行列 179 shader->setUniformMatrix4fv("uTranslate", getMatTranslation()); 180 shader->setUniformMatrix4fv("uRotate", getMatRotate()); 181 shader->setUniformMatrix4fv("uScale", getMatScale()); 182 shader->setUniformMatrix4fv("uViewProjection", glm::ortho(0.0f, FrameWork::windowContext->getSize().x, FrameWork::windowContext->getSize().y, 0.0f, -1.0f, 1.0f)); 183 184 185 186 glDrawArrays(GL_TRIANGLES, 0, 6); 187 188 189 glBindTexture(GL_TEXTURE_2D, 0); 190} 191 192// ##################################### デストラクタ ##################################### 193FrameWork::Sprite::~Sprite() 194{ 195 196} 197

cpp

1 2 3std::shared_ptr<std::vector<FrameWork::Vertex::ALL_2D>> FrameWork::Camera_2D::vertex = std::make_shared<std::vector<FrameWork::Vertex::ALL_2D>>(0); //頂点配列 4 5GLuint FrameWork::Camera_2D::vao = 0; //vao 6GLuint FrameWork::Camera_2D::vbo = 0; //vbo 7 8glm::mat4 FrameWork::Camera_2D::scale = glm::mat4(); //拡大縮小 9glm::mat4 FrameWork::Camera_2D::rotate = glm::mat4(); //回転 10glm::mat4 FrameWork::Camera_2D::translate = glm::mat4(); //平行移動 11 12//描画行列 13glm::vec2 FrameWork::Camera_2D::vecPosition = glm::vec2(0,0); //座標 14glm::vec3 FrameWork::Camera_2D::vecLook = glm::vec3(0,0,-1); //向き(視線) 15glm::mat4 FrameWork::Camera_2D::view = glm::lookAt(glm::vec3(vecPosition.x, vecPosition.y, 0.0f), vecLook, glm::vec3(0, 1, 0)); //ビュー行列 16glm::mat4 FrameWork::Camera_2D::projection = glm::perspective(glm::radians(90.0f), 4.0f / 3.0f, 0.1f, 100.0f); //透視射形行列 17 18 19// ##################################### 初期化 ##################################### 20void FrameWork::Camera_2D::Init() 21{ 22 glGenVertexArrays(1, &vao); 23 glGenBuffers(1, &vbo); 24 25 glBindVertexArray(vao); 26 glBindBuffer(GL_ARRAY_BUFFER, vbo); 27 28 vertex->resize(6); 29} 30 31// ##################################### 頂点属性を取得 ##################################### 32std::shared_ptr<std::vector<FrameWork::Vertex::ALL_2D>> FrameWork::Camera_2D::getVertexAttribute() 33{ 34 return vertex; 35} 36 37// ##################################### 座標を設定 ##################################### 38void FrameWork::Camera_2D::setPosition(glm::vec2 p) 39{ 40 vecPosition = p; //座標 41 view = glm::lookAt(glm::vec3(vecPosition.x,vecPosition.y,0), vecLook, glm::vec3(0, 1, 0)); 42} 43 44// ##################################### 視線を設定 ##################################### 45void FrameWork::Camera_2D::setLook(glm::vec3 l) 46{ 47 vecLook = l; //向き 48 view = glm::lookAt(glm::vec3(vecPosition.x, vecPosition.y, 0.0f), vecLook, glm::vec3(0, 1, 0)); 49} 50 51// ##################################### 座標を取得 ##################################### 52glm::vec2 FrameWork::Camera_2D::getPosition() 53{ 54 return vecPosition; 55} 56// ##################################### 視線を取得 ##################################### 57glm::vec3 FrameWork::Camera_2D::getLook() 58{ 59 return vecLook; 60} 61 62// ##################################### 3D ビュー行列を取得 透視射形行列 ##################################### 63glm::mat4 FrameWork::Camera_2D::getViewProjection() 64{ 65 return projection * view; 66} 67 68// ##################################### 2D ビュー行列を取得 正射形 ##################################### 69glm::mat4 FrameWork::Camera_2D::getProjection_2D() 70{ 71 return glm::ortho(0.0f, FrameWork::windowContext->getSize().x, FrameWork::windowContext->getSize().y, 0.0f, -1.0f, 1.0f); 72} 73 74// ###################### デストラクタ ###################### 75FrameWork::Camera_2D::~Camera_2D() 76{ 77 78}

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問