Qt GUIにおけるOpenGLプログラミングの高度なテクニック:QOpenGLExtraFunctions::glDisablei()


QOpenGLExtraFunctions::glDisablei()は、OpenGLで特定のインデックスの頂点シェーダー入力レイアウトを無効にする関数です。頂点シェーダー入力レイアウトは、頂点シェーダーが頂点データにどのようにアクセスするかを定義します。

使用方法

void QOpenGLExtraFunctions::glDisablei(GLuint index);
  • index: 無効にする頂点シェーダー入力レイアウトのインデックス

詳細

頂点シェーダーは、頂点データにさまざまな方法でアクセスできます。最も一般的な方法は、頂点属性と呼ばれる名前付き変数を使用することです。頂点属性は、頂点シェーダー入力レイアウトで定義されます。

QOpenGLExtraFunctions::glDisablei()は、特定のインデックスの頂点シェーダー入力レイアウトを無効にします。無効にされた頂点シェーダー入力レイアウトは、頂点シェーダーで使用できなくなります。

次のコードは、インデックス1の頂点シェーダー入力レイアウトを無効にします。

QOpenGLExtraFunctions *functions = QOpenGLContext::current()->functions();
functions->glDisablei(1);

注意点

QOpenGLExtraFunctions::glDisablei()は、OpenGL 3.3以降でのみ使用できます。古いバージョンのOpenGLを使用している場合は、代わりにglDisableVertexAttribArray()関数を使用する必要があります。



#include <QOpenGLFunctions>

void MyGLWidget::initializeGL()
{
    QOpenGLFunctions *functions = QOpenGLContext::current()->functions();

    // ... OpenGL初期化処理 ...

    // インデックス1の頂点シェーダー入力レイアウトを無効にする
    functions->glDisablei(1);
}

例2: 頂点シェーダー入力レイアウトを無効にするループ

#include <QOpenGLFunctions>

void MyGLWidget::initializeGL()
{
    QOpenGLFunctions *functions = QOpenGLContext::current()->functions();

    // ... OpenGL初期化処理 ...

    // すべての頂点シェーダー入力レイアウトを無効にする
    for (int i = 0; i < 16; ++i) {
        functions->glDisablei(i);
    }
}

説明

  • 実際のコードでは、無効にする必要がある頂点シェーダー入力レイアウトを決定する必要があります。
  • 例2では、すべての頂点シェーダー入力レイアウトを無効にします。
  • 例1では、インデックス1の頂点シェーダー入力レイアウトのみを無効にします。
  • 上記の例では、QOpenGLFunctions::glDisablei()を使用して、頂点シェーダー入力レイアウトを無効にしています。
  • 頂点シェーダー入力レイアウトを無効にする前に、有効になっていることを確認してください。無効な頂点シェーダー入力レイアウトを無効にしても、何の効果もありません。
  • QOpenGLExtraFunctions::glDisablei()は、OpenGL 3.3以降でのみ使用できます。古いバージョンのOpenGLを使用している場合は、代わりにglDisableVertexAttribArray()関数を使用する必要があります。


QOpenGLExtraFunctions::glDisablei()は、OpenGL 3.3以降でのみ使用できる関数です。古いバージョンのOpenGLを使用している場合は、代わりに以下の代替方法を使用できます。

代替方法

  1. glDisableVertexAttribArray()関数を使用する
void glDisableVertexAttribArray(GLuint index);
  • index: 無効にする頂点属性配列のインデックス

説明

glDisableVertexAttribArray()関数は、指定されたインデックスの頂点属性配列を無効にします。頂点属性配列は、頂点シェーダーが頂点データにどのようにアクセスするかを定義します。

QOpenGLExtraFunctions::glDisablei()と同様に、glDisableVertexAttribArray()を使用する前に、無効にする必要がある頂点属性配列を決定する必要があります。

次のコードは、インデックス1の頂点属性配列を無効にします。

glDisableVertexAttribArray(1);
  1. glVertexAttribPointer()関数を使用して無効な頂点属性配列を再設定する
void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
  • pointer: 頂点データへのポインタ
  • stride: 頂点データ間のバイトオフセット
  • normalized: 頂点要素を正規化するかどうかのフラグ
  • type: 頂点要素のデータ型
  • size: 各頂点要素のコンポーネント数
  • index: 設定する頂点属性配列のインデックス

説明

glVertexAttribPointer()関数は、指定されたインデックスの頂点属性配列を設定します。無効な頂点属性配列を再設定するには、glVertexAttribPointer()関数を呼び出し、すべての引数を0に設定します。

この方法は、頂点属性配列を完全に無効にするのではなく、無効にするだけです。頂点シェーダーは、無効な頂点属性配列にアクセスすることはできませんが、他のアプリケーションで使用することはできます。

glVertexAttribPointer(1, 0, GL_FLOAT, GL_FALSE, 0, nullptr);
  • 古いバージョンのOpenGLを使用している場合は、適切なバージョンに対応した関数を使用する必要があります。
  • glVertexAttribPointer()関数は、OpenGL 1.3以降で使用できます。
  • glDisableVertexAttribArray()関数は、OpenGL 2.0以降で使用できます。