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
回答1件
あなたの回答
tips
プレビュー