提示コードですが頂点情報を全ての描画物で共有してメモリを節約したいのでカメラクラスの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}
あなたの回答
tips
プレビュー