このページでは

QOpenGLVertexArrayObject Class

QOpenGLVertexArrayObject クラスは、OpenGL の Vertex Array Object をラップしています。詳細...

ヘッダー: #include <QOpenGLVertexArrayObject>
CMake: find_package(Qt6 REQUIRED COMPONENTS OpenGL)
target_link_libraries(mytarget PRIVATE Qt6::OpenGL)
qmake: QT += opengl
継承元: QObject

パブリック型

class Binder

パブリック関数

QOpenGLVertexArrayObject(QObject *parent = nullptr)
virtual ~QOpenGLVertexArrayObject()
void bind()
bool create()
void destroy()
bool isCreated() const
GLuint objectId() const
void release()

詳細な説明

Vertex Array Object (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 ドライバは頂点データの妥当性チェックを分散処理できるようになります。

注:Vertex Array Object(VAO)は、他のすべての 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

true が返された場合、基礎となるOpenGL頂点配列オブジェクトが作成されていることを示します。true が返され、かつ関連するOpenGLコンテキストがアクティブな状態であれば、このオブジェクトに対してbind()を呼び出すことができます。

GLuint QOpenGLVertexArrayObject::objectId() const

基になる OpenGL 頂点配列オブジェクトの ID を返します。

void QOpenGLVertexArrayObject::release()

デフォルトの頂点配列オブジェクト(ID = 0)をバインドすることで、この頂点配列オブジェクトのバインドを解除します。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.