提示コードですがまずコンストラクタ部のvertex.resize(100);で頂点数を設定してそれを下のif文の内部で設定してDraw関数部で頂点数を変更したりしてメモリの節約をしているのですが。困っているのがvertex.reisze(100);として100も使わないのに100分メモリを取るのが勿体なく
かつ必要があるときは100メモリを取りたいのですがその場の状況に応じて頂点数のメモリを節約する方法がはあるのでしょうか?
コンストラクタ部でvertex.resize(100);として100以上の頂点数になるとエラーコードが出て描画されません。
cpp
1#include "Ellipse.hpp" 2 3#include "Render.hpp" 4#include "VertexData.hpp" 5#include "Init.hpp" 6#include "Window.hpp" 7#include "Shader.hpp" 8#include "Camera.hpp" 9 10// ##################################### コンストラクタ ##################################### 11FrameWork::Ellipse::Ellipse(Vertex::Attribute vt,const char* vert, const char* frag) : Render_2D() 12{ 13 if (vert == NULL || frag == NULL) 14 { 15 shader->Input(FrameWork::Resource::getShader(FrameWork::Resource::Asset::shader_BasicMono_vert), 16 FrameWork::Resource::getShader(FrameWork::Resource::Asset::shader_BasicMono_frag)); 17 } 18 else 19 { 20 shader->Input((char*)vert, (char*)frag); //シェーダーロード 21 } 22 23 vertex = FrameWork::Camera_2D::getVertexAttribute(); 24 vertex->resize(100); 25 if (vt == Vertex::Attribute::Vertex) 26 { 27 //頂点 28 GLint attrib = shader->getAttribLocation("vertexPosition"); 29 glEnableVertexAttribArray(attrib); 30 glBufferData(GL_ARRAY_BUFFER, vertex->size() * sizeof(Vertex::ALL_2D), vertex->data(), GL_DYNAMIC_DRAW); 31 glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 11 * sizeof(GLfloat), (GLvoid*)0); 32 shader->setBindAttribLocation("vertexPosition"); 33 } 34} 35// ##################################### 描画 設定 ##################################### 36void FrameWork::Ellipse::Draw(glm::vec2 pos, glm::vec2 s, int num,float r) 37{ 38 vertex->resize(num); 39 float r2 = (float)((PI * 2.0) / (double)vertex->size()); 40 float rr = 0; 41 for (int i = 0; i < vertex->size(); i++) 42 { 43 vertex->at(i).position[0] = (cos(rr) * s.x); 44 vertex->at(i).position[1] = (sin(rr) * s.y); 45 rr += r2; 46 } 47 48 glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vertex::ALL_2D) * vertex->size(), vertex->data()); 49 50 //Transform 51 setPosition(pos); //座標 52 setScale(glm::vec2(1,1)); //スケール 53 setRotate(r); //回転 54 55 shader->setUniformMatrix4fv("uTranslate", getMatTranslation()); 56 shader->setUniformMatrix4fv("uRotate", getMatRotate()); 57 shader->setUniformMatrix4fv("uScale", getMatScale()); 58 shader->setUniformMatrix4fv("uViewProjection", glm::ortho(0.0f, FrameWork::windowContext->getSize().x, FrameWork::windowContext->getSize().y, 0.0f, -1.0f, 1.0f)); 59 60 glDrawArrays(GL_TRIANGLE_FAN, 0, vertex->size()); 61 62} 63 64// ##################################### デストラクタ ##################################### 65FrameWork::Ellipse::~Ellipse() 66{ 67 68}
回答2件
あなたの回答
tips
プレビュー