OpenGL ステート変数の値を64ビット整数で取得: Qt GUI における QOpenGLExtraFunctions::glGetInteger64v() 関数の詳細解説と代替方法


QOpenGLExtraFunctions::glGetInteger64v() 関数は、OpenGL ステート変数の値を 64 ビット整数として取得するために使用されます。この関数は、OpenGL 4.3 以降でのみ使用可能であり、従来の glGetIntegerv() 関数の拡張版として機能します。

関数詳細

void QOpenGLExtraFunctions::glGetInteger64v(GLenum pname, GLint64 *params);

引数

  • params: 取得したステート変数の値を格納する GLint64 型の配列ポインタです。
  • pname: 取得したいステート変数の名前を指定する GLenum 型の値です。

戻り値

なし

エラー処理

glGetInteger64v() 関数は、エラーが発生した場合に GLenum 型のエラーコードを返します。エラーが発生した場合は、glGetError() 関数を使用して詳細なエラー情報を取得する必要があります。

GLint64 bufferSize;
QOpenGLExtraFunctions::glGetInteger64v(GL_ARRAY_BUFFER_BINDING, &bufferSize);

この例では、GL_ARRAY_BUFFER_BINDING ステート変数の値を取得し、bufferSize 変数に格納しています。GL_ARRAY_BUFFER_BINDING ステート変数は、現在バインドされている頂点バッファオブジェクトの ID を格納します。

  • QOpenGLExtraFunctions::glGetInteger64v() 関数は、64 ビット整数のみをサポートします。32 ビット整数を取得するには、glGetIntegerv() 関数を使用する必要があります。
  • QOpenGLExtraFunctions::glGetInteger64v() 関数は、OpenGL 4.3 以降でのみ使用可能です。古いバージョンの OpenGL を使用している場合は、glGetIntegerv() 関数を使用する必要があります。


#include <QOpenGLFunctions>

int main() {
  // QOpenGLFunctions インスタンスを作成
  QOpenGLFunctions *functions = QOpenGLContext::currentContext()->functions();

  // GL_ARRAY_BUFFER_BINDING ステート変数の値を取得
  GLint64 bufferSize;
  functions->glGetInteger64v(GL_ARRAY_BUFFER_BINDING, &bufferSize);

  // 取得した値を出力
  std::cout << "Current array buffer ID: " << bufferSize << std::endl;

  return 0;
}

このコードは、以下の手順を実行します。

  1. QOpenGLFunctions インスタンスを作成します。
  2. glGetInteger64v() 関数を使用して、GL_ARRAY_BUFFER_BINDING ステート変数の値を取得します。
  3. 取得した値をコンソールに出力します。
// GL_MAX_VERTEX_ATTRIBS ステート変数の値を取得
GLint64 maxVertexAttribs;
functions->glGetInteger64v(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs);
std::cout << "Maximum number of vertex attributes: " << maxVertexAttribs << std::endl;

// GL_MAX_VIEWPORT_DIM ステート変数の値を取得
GLint64 maxViewportDim[2];
functions->glGetInteger64v(GL_MAX_VIEWPORT_DIM, maxViewportDim);
std::cout << "Maximum viewport dimensions: " << maxViewportDim[0] << " x " << maxViewportDim[1] << std::endl;


代替方法

  • glGetTexParameteriv() 関数: テクスチャパラメータの値を取得するには、glGetTexParameteriv() 関数を使用できます。
  • glGetMaterialfv() 関数: マテリアルプロパティの値を取得するには、glGetMaterialfv() 関数を使用できます。
  • glGetFloatv() 関数: 浮動小数点数のステート変数の値を取得するには、glGetFloatv() 関数を使用できます。
  • glGetBooleanv() 関数: ブール値のステート変数の値を取得するには、glGetBooleanv() 関数を使用できます。
  • glGetIntegerv() 関数: QOpenGLExtraFunctions::glGetInteger64v() 関数の代わりに glGetIntegerv() 関数を使用することもできます。ただし、glGetIntegerv() 関数は 32 ビット整数しか取得できないため、64 ビット整数が必要な場合は使用できません。

どの方法を選択するべきか

どの方法を選択するべきかは、取得したいステート変数の型と、必要な精度によって異なります。

  • テクスチャパラメータの値を取得したい場合は、glGetTexParameteriv() 関数を使用します。
  • マテリアルプロパティの値を取得したい場合は、glGetMaterialfv() 関数を使用します。
  • 浮動小数点数のステート変数の値を取得したい場合は、glGetFloatv() 関数を使用します。
  • ブール値のステート変数の値を取得したい場合は、glGetBooleanv() 関数を使用します。
  • 32 ビット整数で十分な場合は、glGetIntegerv() 関数を使用できます。
  • 64 ビット整数が必要な場合は、QOpenGLExtraFunctions::glGetInteger64v() 関数を使用する必要があります。

以下のコードは、glGetIntegerv() 関数を使用して GL_ARRAY_BUFFER_BINDING ステート変数の値を取得する方法を示しています。

GLint bufferSize;
glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &bufferSize);

このコードは、QOpenGLExtraFunctions::glGetInteger64v() 関数を使用するよりも簡潔ですが、32 ビット整数しか取得できません。