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

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

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

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

C++

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

Q&A

解決済

1回答

1405閲覧

VAO VBOは複数あってもいいのかどうか?

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

0グッド

1クリップ

投稿2021/01/29 01:00

編集2021/01/29 01:05

DrawGprah関数部のコメント部のコードですが毎フレームvao vbo を生成して消す処理と
Spriteクラスのインスタンスごとにvao vbo を生成する処理は正しいのでしょうか?

提示コードは画像を表示させるクラスです。

cpp

1#include "../Header/Sprite.hpp" 2#include "../Header/Shader.hpp" 3#include "../Header/Game.hpp" 4#include "../Header/Texture.hpp" 5#include "../Header/VertexData.hpp" 6 7// 数学ライブラリ 8#include "glm/ext.hpp" 9#include "glm/glm.hpp" 10 11// OpenCV 12#include <opencv2/core.hpp> 13 14class Game; 15/*################################################################################################################ 16* 画像 描画クラス 17################################################################################################################*/ 18 19//コンストラクタ 20/* 21* Game クラス 22* テクスチャ パス 23* 描画する画像の寸法 24*/ 25 26Sprite::Sprite(class Game* g, const char* FileName) : Transform_2D(g) 27{ 28 shader = new Shader(g,"Shader/2D/Sprite.vert", "Shader/2D/Sprite.frag"); 29 Owner = g;//Gameクラス 30 31 Transform_2D::setTransfrom(glm::vec2(1,1),0,glm::vec2(0,0)); //トランスフォームを初期化 32 33 //テクスチャを設定 34 glGenTextures(1, &TextureID); 35 glBindTexture(GL_TEXTURE_2D, TextureID); 36 37 int width = 0, height = 0; //画像の寸法 38 int channels = 0; //画像のチャンネル数 39 40 std::shared_ptr<byte[]> data = LoadTexture(FileName, width, height, channels); //テクスチャを取得 41 42 43 mPicSize.x = width; 44 mPicSize.y = height; 45 46 //printf("widht: %f\n", width); 47 //printf("height: %f\n", height); 48 49 if (data.get() != NULL) 50 { 51 if (channels == 3) 52 { 53 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, (GLsizei)width, (GLsizei)height, 0, GL_RGB, GL_UNSIGNED_BYTE, data.get()); 54 } 55 else if (channels == 4) 56 { 57 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data.get()); 58 } 59 } 60 else { 61 std::cerr << "Unable to load texture: " << FileName << std::endl; 62 } 63 64 65 66// mSize = end - start; //画像のサイズを取得 67 68// printf("width: %.2f\n", mSize.x); 69// printf("height: %.2f\n",mSize.y); 70 71 /* 72 vertex[0] = VertexAttribute_2D{ -width / 2.0f,height / 2.0f, 0,0 }; 73 vertex[1] = VertexAttribute_2D{ -width / 2.0f,-height / 2.0f, 0,1 }; 74 vertex[2] = VertexAttribute_2D{ width / 2.0f,-height / 2.0f, 1,1 }; 75 76 vertex[3] = VertexAttribute_2D{ -width / 2.0f,height / 2.0f, 0,0 }; 77 vertex[4] = VertexAttribute_2D{ width / 2.0f,-height / 2.0f, 1,1 }; 78 vertex[5] = VertexAttribute_2D{ width / 2.0f,height / 2.0f, 1,0 }; 79 */ 80 81 82 /* 83 * 84 // 頂点情報を設定 85 vertex[0] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f, start.x * uvWidth,start.y * uvHeight }; 86 vertex[1] = VertexAttribute_2D{ -mSize.x / 2.0f,-mSize.y / 2.0f, start.x * uvWidth,end.y * uvHeight }; 87 vertex[2] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f, end.x * uvWidth,end.y * uvHeight }; 88 89 vertex[3] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f, start.x * uvWidth,start.y * uvHeight }; 90 vertex[4] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f, end.x * uvWidth,end.y * uvHeight }; 91 vertex[5] = VertexAttribute_2D{ mSize.x / 2.0f,mSize.y / 2.0f, end.x * uvWidth,start.y * uvHeight }; 92 93 */ 94 95 96 //VAO 97// glGenVertexArrays(1, &VAO); 98// glBindVertexArray(VAO); 99 100 //VBO 101// glGenBuffers(1, &VBO); 102// glBindBuffer(GL_ARRAY_BUFFER, VBO); 103// glBufferData(GL_ARRAY_BUFFER, (sizeof(vertex) / sizeof(vertex[0])) * sizeof(VertexAttribute_2D), vertex, GL_STATIC_DRAW); 104 105 //頂点座標 106// glEnableVertexAttribArray(0); 107// glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute_2D), NULL); 108 109 //UV座標 110// glEnableVertexAttribArray(1); 111// glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute_2D), (void*)(sizeof(float) * 2)); 112 113 //ミニマップを設定 114 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 115 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 116 glGenerateMipmap(GL_TEXTURE_2D); 117 118 //異方性フィルタリングを設定 119 GLfloat largest; 120 glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &largest); 121 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, largest); 122 123 124 glDeleteBuffers(1, &VAO); 125 glDeleteVertexArrays(1, &VAO); 126 127 glBindVertexArray(0); 128 glBindTexture(GL_TEXTURE_2D, 0); 129 130 131// delete data; 132// data = nullptr; 133 134} 135 136//描画 137void Sprite::DrawGraph(glm::vec2 pos, glm::vec2 start, glm::vec2 end) 138{ 139 140 141 Transform_2D::UpdateTransform(); //トランスフォームを更新 142 Transform_2D::setTransform_Move(pos); //移動 143 144 shader->Enable(); //シェーダーを有効にする 145 shader->SetFloatUniform_3m("uViewMatrix", getViewMatrix()); 146 shader->SetFloatUniform_3m("uWorldMatrix", getWorldMatrix()); 147 148 149 glm::vec2 mSize; 150 mSize = end - start; //画像のサイズを取得 151// printf("mSize.x %f\n", mSize.x); 152//` printf("start.x. x%f\n", end.x); 153 154 155 156 157 // 頂点情報を設定 158 vertex[0] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f, start.x / mPicSize.x ,start.y / mPicSize.y }; 159 160// printf("%f\n", start.y / mSize.y); 161 162 vertex[1] = VertexAttribute_2D{ -mSize.x / 2.0f,-mSize.y / 2.0f, start.x / mPicSize.x ,end.y / mPicSize.y }; 163 vertex[2] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f, end.x / mPicSize.x ,end.y / mPicSize.y }; 164 165 vertex[3] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f, start.x / mPicSize.x ,start.y / mPicSize.y }; 166 vertex[4] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f, end.x / mPicSize.x ,end.y / mPicSize.y }; 167 vertex[5] = VertexAttribute_2D{ mSize.x / 2.0f,mSize.y / 2.0f, end.x / mPicSize.x ,start.y / mPicSize.y }; 168 169//////////////////////////////////////////////////////////////////////////////////////////// 170 171 //VAO 172 glGenVertexArrays(1, &VAO); 173 glBindVertexArray(VAO); 174 175 //VBO 176 glGenBuffers(1, &VBO); 177 glBindBuffer(GL_ARRAY_BUFFER, VBO); 178 glBufferData(GL_ARRAY_BUFFER, (sizeof(vertex) / sizeof(vertex[0])) * sizeof(VertexAttribute_2D), vertex, GL_STATIC_DRAW); 179/////////////////////////////////////////////////////////////////////////////////////////// 180 //頂点座標 181 glEnableVertexAttribArray(0); 182 glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute_2D), NULL); 183 184 //UV座標 185 glEnableVertexAttribArray(1); 186 glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute_2D), (void*)(sizeof(float) * 2)); 187 188 189 glBindVertexArray(VAO); 190 glBindTexture(GL_TEXTURE_2D, TextureID); 191 glDrawArrays(GL_TRIANGLES, 0, (GLsizei)std::size(vertex)); 192 193 // バッファを解放 194 glDeleteBuffers(1,&VAO); 195 glDeleteVertexArrays(1,&VAO); 196 197 //glBindVertexArray(0); 198// glBindTexture(GL_TEXTURE_2D, 0); 199 200} 201 202 203 204// 画像サイズを取得 205glm::vec2 Sprite::getSize() 206{ 207 return mPicSize; 208} 209 210 211 212// デストラクタ 213Sprite::Sprite(const Sprite & sp) : Transform_2D(sp.Owner) 214{ 215 shader = new Shader(sp.Owner, "Shader/2D/Sprite.vert", "Shader/2D/Sprite.frag"); 216 Owner = sp.Owner;//Gameクラス 217 mPicSize.x = sp.mPicSize.x; 218 mPicSize.y = sp.mPicSize.y; 219 220 221} 222 223 224// デストラクタ 225Sprite::~Sprite() 226{ 227// printf("Sprite delete\n"); 228 229 230 231 delete shader; 232 shader = nullptr; 233 glDeleteTextures(1,&TextureID); 234 235} 236

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

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

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

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

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

y_waiwai

2021/01/29 01:04

なにをするコードなんでしょうか
退会済みユーザー

退会済みユーザー

2021/01/29 01:06

スプライト描画クラスです。
fana

2021/01/29 02:26

> スプライト描画クラスです。 とだけ言われても,何をするのかわからんのですが… 画像の任意の部分矩形領域を表示する手段 みたいなものなのでしょうか? そうであれば,DrawGraph()の引数の意味は, ・pos : 矩形を表示する場所を指定(矩形の中心の位置か) ・start, end : 画像のどこらへんを矩形に張り付けるのか,という領域を指定(大元の画像のpixel座標で指定する) という話で合ってますか?
guest

回答1

0

ベストアンサー

どんな形がベストなのかわかりませんが,
Sprite::DrawGraph()を実施するたびに【VAOやVBOを作って→使って→すぐ捨てる】というのは効率が悪そうに思います.

Sprite::DrawGraph()の引数によって
頂点座標とテクスチャ座標がちょっと変わるだけなのであれば,例えば
その変換のための uniform変数を用意して,そいつだけを更新する形にすれば良いのではないかと.

投稿2021/01/29 02:36

fana

総合スコア11996

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

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

fana

2021/01/29 02:38

あと,Spriteのコンストラクタに glDeleteBuffers(1, &VAO); glDeleteVertexArrays(1, &VAO); とかありますが,必要な処理なんでしょうか?(やっても問題ないのか?)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問