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

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

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

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

C++

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

Q&A

解決済

2回答

937閲覧

頂点数を一度決めた量より多くする関数が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

0グッド

0クリップ

投稿2021/07/07 03:05

提示コードですがまずコンストラクタ部の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}

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

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

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

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

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

int32_t

2021/07/07 03:26

変数 vertex の型はなんですか?
退会済みユーザー

退会済みユーザー

2021/07/07 03:35

全ての頂点属性です。 座標、法線、UV、頂点色 です。
int32_t

2021/07/07 03:42

C++の型の話です。std::vector ですか?
guest

回答2

0

ベストアンサー

glBufferSubData は既存の data store 内のデータを部分的に書き換えるためのものですから,
data store のサイズ以上のものを突っ込もうとすれば,そりゃ問題を起こすでしょう.

つまり,サイズが増えてしまうのであれば,glBufferSubData ではどうしようもないわけで,
増える場合には glBufferData をやり直す形にする必要があるんじゃないですか?

投稿2021/07/07 03:48

fana

総合スコア11658

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

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

0

C++

1void FrameWork::Ellipse::Draw(glm::vec2 pos, glm::vec2 s, int num,float r) 2{ 3 vertex->resize(num); 4 ... 5}

Draw時に(描画のたびに) resize してるんだから、コンストラクタでやらなくてもいいんじゃない?

投稿2021/07/07 03:45

episteme

総合スコア16614

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問