QOpenGLVertexArrayObject Class
QOpenGLVertexArrayObjectクラスは、OpenGL頂点配列オブジェクトをラップします。詳細...
Header: | #include <QOpenGLVertexArrayObject> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS OpenGL) target_link_libraries(mytarget PRIVATE Qt6::OpenGL) |
qmake: | QT += opengl |
Inherits: | QObject |
- 継承メンバを含む全メンバのリスト
- QOpenGLVertexArrayObjectは、3Dレンダリングの一部です。
パブリックタイプ
class | Binder |
パブリック関数
QOpenGLVertexArrayObject(QObject *parent = nullptr) | |
virtual | ~QOpenGLVertexArrayObject() |
void | bind() |
bool | create() |
void | destroy() |
bool | isCreated() const |
GLuint | objectId() const |
void | release() |
詳細説明
頂点配列オブジェクト(VAO)は、OpenGLパイプラインに頂点ごとの属性データを指定するために必要な状態をカプセル化するOpenGLコンテナオブジェクトです。別の言い方をすれば、VAOはバッファ・オブジェクトの状態(QOpenGLBuffer を参照)と、それに関連する状態(頂点属性の除数など)を記憶します。これにより、シーン内の異なる「オブジェクト」をレンダリングするために、OpenGLバッファの状態を非常に簡単かつ効率的に切り替えることができます。QOpenGLVertexArrayObjectクラスは、OpenGL VAOの薄いラッパーです。
デスクトップでは、VAOはOpenGL 3.0以降のコア機能としてサポートされており、古いバージョンではGL_ARB_vertex_array_objectによってサポートされています。OpenGL ES 2では、VAOはオプションのGL_OES_vertex_array_object拡張によって提供されます。OpenGLのバージョンはQOpenGLContext::surfaceFormat()で確認でき、拡張機能の有無はQOpenGLContext::hasExtension()で確認できます。
他の Qt OpenGL クラスと同様に、QOpenGLVertexArrayObject には、基礎となる OpenGL オブジェクトを作成するcreate() 関数があります。これは、開発者がその時点で有効な現在のOpenGLコンテキストがあることを確認できるようにするためです。
VAOの作成に成功したら、典型的な使用パターンは次のようになります:
- シーンの初期化関数で、各ビジュアル・オブジェクトを作成します:
- VAOをバインドする
- このビジュアル・オブジェクトの頂点データ状態(頂点、法線、テクスチャ座標など)を設定します。
- VAO のバインドを解除します (release())。
- レンダリング関数で、各ビジュアルオブジェクトに対して
- VAO をバインドします(必要であればシェーダープログラムも)。
- glDraw*() 関数を呼び出します。
- VAOのバインドを解除する (release())
レンダー関数でVAOをバインドする行為は、初期化段階で設定したすべての頂点データ状態を復元する効果があります。このようにして、VAOのセットアップ時に多くのステートを設定し、レンダリングするオブジェクトのステートセットを効率的に切り替えることができます。また、VAOを使用することで、OpenGLドライバは頂点データの検証チェックを簡略化することができます。
注意: 頂点配列オブジェクトは、他のすべてのOpenGLコンテナオブジェクトと同様に、作成されたコンテキストに固有であり、コンテキストグループ間で共有することはできません。
QOpenGLVertexArrayObject::Binder およびQOpenGLBufferも参照の こと。
メンバ関数ドキュメント
[explicit]
QOpenGLVertexArrayObject::QOpenGLVertexArrayObject(QObject *parent = nullptr)
与えられたparent で QOpenGLVertexArrayObject を作成します。使用する前に、有効な OpenGL コンテキストでcreate() を呼び出す必要があります。
[virtual noexcept]
QOpenGLVertexArrayObject::~QOpenGLVertexArrayObject()
QOpenGLVertexArrayObject と基礎となる OpenGL リソースを破棄します。
void QOpenGLVertexArrayObject::bind()
この頂点配列オブジェクトをOpenGLバインディング・ポイントにバインドします。この時点から、release ()が呼び出されるか、別の頂点配列オブジェクトがバインドされるまで、頂点データの状態に加えられた変更はすべて、この頂点配列オブジェクトの内部に保存されます。
その後、別の頂点配列オブジェクトがバインドされた場合、このオブジェクトの bind() を再度呼び出すことで、このオブジェクトに関連付けられた状態のセットを後で復元することができます。これにより、レンダリング関数内で頂点データの状態を効率的に変更することができます。
bool QOpenGLVertexArrayObject::create()
基礎となるOpenGL頂点配列オブジェクトを作成します。この関数が成功するためには、現在の頂点配列オブジェクトをサポートする有効なOpenGLコンテキストが存在しなければなりません。
OpenGL頂点配列オブジェクトが正常に作成された場合、true
を返します。
戻り値がfalse
の場合、頂点配列オブジェクトのサポートは利用できません。これはエラーではありません:OpenGL 2.xまたはOpenGL ES 2.0のシステムでは、頂点配列オブジェクトがサポートされていない可能性があります。この場合、アプリケーションは自由に実行を続行できますが、VAOレスで動作するように準備する必要があります。つまり、単にbind ()を呼び出すのではなく、isCreated ()の値をチェックし、頂点配列オブジェクトが存在しない場合には、従来の方法で頂点配列を初期化する必要があります。
isCreated()も参照 。
void QOpenGLVertexArrayObject::destroy()
基礎となるOpenGL頂点配列オブジェクトを破棄します。この関数が成功するためには、現在の頂点配列オブジェクトをサポートする有効なOpenGLコンテキストが存在しなければなりません。
bool QOpenGLVertexArrayObject::isCreated() const
基礎となるOpenGL頂点配列オブジェクトが作成された場合、true
を返します。これがtrue
を返し、関連するOpenGLコンテキストが現在のものであれば、このオブジェクトをbind() することができます。
GLuint QOpenGLVertexArrayObject::objectId() const
基礎となるOpenGL頂点配列オブジェクトのidを返します。
void QOpenGLVertexArrayObject::release()
デフォルトの頂点配列オブジェクト(id = 0)をバインドすることで、この頂点配列オブジェクトのバインドを解除します。
©2024 The Qt Company Ltd. 本書に含まれるドキュメントの著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。