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

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

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

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

C++

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

Q&A

0回答

515閲覧

[opengl] vao,vboは同じものを使っていい場合とそじゃない場合が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

0グッド

0クリップ

投稿2022/10/30 01:30

編集2022/10/30 01:41

提示コードですがvao,vboスプライトのような一つの正方形の頂点データが一フレーム内で移動して描画される場合は一つだでいいのでしょうか?これはスプライトクラスなのですが頂点は同じ形なので使いまわしてvao,vboは別に生成して使ってるんですけどこれは実際どうなのでしょうか?参考サイトを使って調べましたがそれでもどっちがいいのかわかりません。

vao

実際に頂点情報を格納するGPU側のバッファ。ここに頂点の位置や色、法線、テクスチャ座標等を格納

vbo
  1. バッファオブジェクトの属性をまとめる機能

 複数のVBOの頂点属性(位置/色/法線など)を一つのVAOへまとめる役割をもつ。頂点属性だけでなくインデックスバッファや、インダイレクトバッファ等のバッファオブジェクトもまとめることができる。
2. シェーダー側への橋渡しであるインターフェイス的な機能
シェーダー側でC++側で生成した頂点データの処理を行うとき、どれが頂点の位置で色で法線なのかわかる必要がある。VAOはこれを解決する橋渡し的な機能を持っている。

部参考 VBOとVAO、シェーダーを利用して図形を描画する。
参考サイト:https://qiita.com/y_UM4/items/75941cb75afb0a46aa5e

cpp

1#include "Sprite.hpp" 2#include "Transform.hpp" 3#include "Shader.hpp" 4#include "Window.hpp" 5#include <vector> 6#include <iostream> 7 8std::array<FrameWork::VertexAttribute_Sprite,4> FrameWork::Sprite::vertex; 9 10/*############################################################################################ 11# コンストラクタ 12############################################################################################*/ 13FrameWork::Sprite::Sprite() 14{ 15 glGenVertexArrays(1, &vao); 16 glGenBuffers(1, &vbo); 17 18 glBindVertexArray(vao); 19 glBindBuffer(GL_ARRAY_BUFFER, vbo); 20 21 glBufferData(GL_ARRAY_BUFFER, vertex.size() * sizeof(VertexAttribute_Sprite), vertex.data(), GL_DYNAMIC_DRAW); 22 23 glBindVertexArray(0); 24 glBindBuffer(GL_ARRAY_BUFFER, 0); 25} 26 27 28/*############################################################################################ 29# テクスチャ 設定 30############################################################################################*/ 31void FrameWork::Sprite::setTexture(const int texNum,const Texture tex) 32{ 33 glBindVertexArray(vao); 34 glBindBuffer(GL_ARRAY_BUFFER, vbo); 35 36 setVertexUV(tex); 37 38 glBindTexture(GL_TEXTURE_2D, tex.id); //テクスチャバインド 39 glActiveTexture(GL_TEXTURE0 + texNum); //テクスチャ有効 40 41 glBindVertexArray(0); 42 glBindBuffer(GL_ARRAY_BUFFER, 0); 43 44} 45 46 47/*############################################################################################ 48# 描画 49############################################################################################*/ 50void FrameWork::Sprite::Render(const glm::mat4 view) 51{ 52 //std::cout<<"あああ"<<std::endl; 53 54 glBindVertexArray(vao); 55 glBindBuffer(GL_ARRAY_BUFFER, vbo); 56 57 glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VertexAttribute_Sprite) * vertex.size(), vertex.data()); 58 glDrawArrays(GL_TRIANGLE_STRIP, 0, vertex.size()); //描画 59 60 glBindVertexArray(0); 61 glBindBuffer(GL_ARRAY_BUFFER, 0); 62 glBindTexture(GL_TEXTURE_2D, 0); 63} 64 65 66/*############################################################################################ 67# 頂点属性 68############################################################################################*/ 69void FrameWork::Sprite::setVertexUV(const Texture tex) 70{ 71 72 vertex[0].normal[0] = 0; 73 vertex[0].normal[1] = 0; 74 vertex[0].normal[2] = 1; 75 76 vertex[1].normal[0] = 0; 77 vertex[1].normal[1] = 0; 78 vertex[1].normal[2] = 1; 79 80 vertex[2].normal[0] = 0; 81 vertex[2].normal[1] = 0; 82 vertex[2].normal[2] = 1; 83 84 vertex[3].normal[0] = 0; 85 vertex[3].normal[1] = 0; 86 vertex[3].normal[2] = 1; 87 88 // 頂点座標 89 vertex[0].position[0] = -0.5f; 90 vertex[0].position[1] = 0.5f; 91 vertex[0].position[2] = 0; 92 93 vertex[1].position[0] = -0.5f; 94 vertex[1].position[1] = -0.5f; 95 vertex[1].position[2] = 0; 96 97 vertex[2].position[0] = 0.5f; 98 vertex[2].position[1] = 0.5f; 99 vertex[2].position[2] = 0; 100 101 vertex[3].position[0] = 0.5f; 102 vertex[3].position[1] = -0.5f; 103 vertex[3].position[2] = 0; 104 105 //UV座標 106 float sizeX = 1.0f / (float)tex.size.x; 107 float sizeY = 1.0f / (float)tex.size.y; 108 109 110 111 vertex[0].uv[0] = 0; 112 vertex[0].uv[1] = 0; 113 114 vertex[1].uv[0] = 0; 115 vertex[1].uv[1] = 1; 116 117 vertex[2].uv[0] = 1; 118 vertex[2].uv[1] = 0; 119 120 vertex[3].uv[0] = 1; 121 vertex[3].uv[1] = 1; 122 123 124/* 125 vertex[0].uv[0] = sizeX * tex.position.start.x; 126 vertex[0].uv[1] = sizeY * tex.position.start.y; 127 128 vertex[1].uv[0] = sizeX * tex.position.start.x; 129 vertex[1].uv[1] = sizeY * tex.position.end.y; 130 131 vertex[2].uv[0] = sizeX * tex.position.end.x; 132 vertex[2].uv[1] = sizeY * tex.position.start.y; 133 134 vertex[3].uv[0] = sizeX * tex.position.end.x; 135 vertex[3].uv[1] = sizeY * tex.position.end.y; 136*/ 137} 138 139 140FrameWork::Sprite::~Sprite() 141{ 142 143} 144

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問