Qt GUIでOpenGLサンプリングを自在に操る!QOpenGLExtraFunctions::glSamplerParameterfv()徹底解説


QOpenGLExtraFunctions::glSamplerParameterfv() 関数は、OpenGL ES 3.x、OpenGL 3.x または 4.x コンテキストで使用されるサンプラーオブジェクトのパラメータを設定するために使用されます。この関数は、サンプラーオブジェクトのテクスチャフィルタリング、テクスチャラッピング、ミップマップサンプリングなどの特性を制御します。

関数詳細

void QOpenGLExtraFunctions::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
  • param: パラメータ値を格納した配列
  • pname: 設定するパラメータの種類
  • sampler: 設定対象のサンプラーオブジェクトのID

パラメータ

pname には、以下のいずれかの値を指定できます。

  • GL_TEXTURE_SRGB_DECODE: sRGBテクスチャデコード (OpenGL ES 3.0 以降)
  • GL_TEXTURE_SRGB: sRGBテクスチャサポート (OpenGL ES 3.0 以降)
  • GL_TEXTURE_MAX_LEVEL: テクスチャ最大レベル
  • GL_TEXTURE_BASE_LEVEL: テクスチャベースレベル
  • GL_TEXTURE_MAX_LOD: 最大テクスチャLOD
  • GL_TEXTURE_MIN_LOD: 最小テクスチャLOD
  • GL_TEXTURE_BorderColor: テクスチャ境界色
  • GL_TEXTURE_COMPARE_FUNC: テクスチャ比較関数 (OpenGL ES 3.0 以降)
  • GL_TEXTURE_COMPARE_MODE: テクスチャ比較モード (OpenGL ES 3.0 以降)
  • GL_TEXTURE_LOD_BIAS: テクスチャLODバイアス
  • GL_TEXTURE_WRAP_R: テクスチャR方向ラッピングモード (OpenGL ES 3.0 以降)
  • GL_TEXTURE_WRAP_T: テクスチャT方向ラッピングモード
  • GL_TEXTURE_WRAP_S: テクスチャS方向ラッピングモード
  • GL_TEXTURE_MIN_FILTER: テクスチャ縮小フィルタリングモード
  • GL_TEXTURE_MAG_FILTER: テクスチャ拡大フィルタリングモード

param には、pname で指定したパラメータに対応する値を設定します。具体的な値は、設定するパラメータによって異なります。

以下の例は、サンプラーオブジェクト sampler のテクスチャ拡大フィルタリングモードを線形補間 (GL_LINEAR) に設定します。

GLfloat param[1] = { GL_LINEAR };
glSamplerParameterfv(sampler, GL_TEXTURE_MAG_FILTER, param);
  • param に設定する値は、パラメータのデータ型と範囲に準拠する必要があります。
  • pname に指定するパラメータは、対応する OpenGL バージョンでサポートされている必要があります。
  • QOpenGLExtraFunctions::glSamplerParameterfv() 関数は、OpenGL ES 3.x、OpenGL 3.x または 4.x コンテキストでのみ使用できます。


#include <QCoreApplication>
#include <QOpenGLFunctions>
#include <QOpenGLWidget>

class MyGLWidget : public QOpenGLWidget {
public:
    MyGLWidget() {
        // OpenGL 関数へのアクセスを初期化する
        initializeOpenGLFunctions();
    }

protected:
    void initializeGL() override {
        // サンプラーオブジェクトを作成
        GLuint sampler;
        glGenSamplers(1, &sampler);

        // テクスチャ拡大フィルタリングモードを線形補間に設定
        GLfloat param[1] = { GL_LINEAR };
        glSamplerParameterfv(sampler, GL_TEXTURE_MAG_FILTER, param);

        // テクスチャ縮小フィルタリングモードをバイリニア補間に設定
        param[0] = GL_LINEAR;
        glSamplerParameterfv(sampler, GL_TEXTURE_MIN_FILTER, param);

        // テクスチャラッピングモードを繰り返し設定
        param[0] = GL_REPEAT;
        glSamplerParameterfv(sampler, GL_TEXTURE_WRAP_S, param);
        glSamplerParameterfv(sampler, GL_TEXTURE_WRAP_T, param);

        // その他のサンプラーパラメータを設定

        // テクスチャオブジェクトをバインド
        glBindTexture(GL_TEXTURE_2D, textureId);

        // テクスチャサンプラーオブジェクトをバインド
        glBindSampler(0, sampler);

        // 描画処理
    }

    void paintGL() override {
        // 描画処理
    }

private:
    GLuint textureId; // テクスチャオブジェクトID
};

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    MyGLWidget widget;
    widget.show();

    return app.exec();
}

説明

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

  1. initializeGL() 関数内で、サンプラーオブジェクトを作成します。
  2. glSamplerParameterfv() 関数を使用して、サンプラーオブジェクトのテクスチャ拡大フィルタリングモード、テクスチャ縮小フィルタリングモード、テクスチャラッピングモードを設定します。
  3. テクスチャオブジェクトをバインドします。
  4. テクスチャサンプラーオブジェクトをバインドします。
  5. paintGL() 関数内で、描画処理を行います。
  • さまざまなテクスチャサンプリング設定を試し、アプリケーションに最適な設定を見つけることが重要です。
  • テクスチャサンプリングの設定は、テクスチャの外観に大きな影響を与える可能性があります。
  • テクスチャオブジェクトとテクスチャサンプラーオブジェクトは、OpenGL でテクスチャをレンダリングするために必要なオブジェクトです。


古いバージョンの OpenGL でサンプラーオブジェクトのパラメータを設定するには、以下の代替方法を使用できます。

glTexParameterfv() 関数を使用する

glTexParameterfv() 関数は、テクスチャオブジェクトのパラメータを設定するために使用されます。サンプラーオブジェクトのパラメータを設定するために、この関数を以下のように使用できます。

void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *param);
  • param: パラメータ値を格納した配列
  • pname: 設定するパラメータの種類
  • target: 設定対象のテクスチャオブジェクトの種類 (GL_TEXTURE_2D など)

glTexParameterfv() 関数は、サンプラーオブジェクトではなくテクスチャオブジェクトに対して設定を行うため、テクスチャサンプラーオブジェクトに関連するパラメータのみを設定できます。

glUniform1i() 関数を使用してサンプラーユニットを設定する

glUniform1i() 関数は、ユニフォーム変数の値を設定するために使用されます。サンプラーユニットを設定するために、この関数を以下のように使用できます。

void glUniform1i(GLint location, GLint value);
  • value: 設定する値
  • location: 設定対象のユニフォーム変数の場所

サンプラーユニットは、サンプラーオブジェクトをシェーダープログラムに渡すために使用されます。

glBindSampler() 関数を使用してサンプラーオブジェクトをバインドする

glBindSampler() 関数は、サンプラーオブジェクトをバインドするために使用されます。サンプラーオブジェクトをバインドするには、以下のコードを使用します。

void glBindSampler(GLuint unit, GLuint sampler);
  • sampler: バインドするサンプラーオブジェクトID
  • unit: バインドするサンプラーユニット

サンプラーオブジェクトをバインドすると、シェーダープログラム内で sampler2D などのサンプラーサンプラーを使用してサンプラーオブジェクトにアクセスできます。

以下の例は、glTexParameterfv() 関数を使用して、サンプラーオブジェクトのテクスチャ拡大フィルタリングモードを線形補間に設定する方法を示します。

GLuint sampler;
glGenSamplers(1, &sampler);

GLfloat param[1] = { GL_LINEAR };
glBindTexture(GL_TEXTURE_2D, textureId);
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, param);

glBindSampler(0, sampler);

この例では、まずサンプラーオブジェクトを作成し、テクスチャ拡大フィルタリングモードを線形補間に設定します。次に、テクスチャオブジェクトをバインドし、glTexParameterfv() 関数を使用してテクスチャパラメータを設定します。最後に、サンプラーオブジェクトをバインドします。

  • 古いバージョンの OpenGL でサンプラーオブジェクトを使用する場合は、これらの代替方法を使用する必要があります。
  • 上記の代替方法は、QOpenGLExtraFunctions::glSamplerParameterfv() 関数よりも柔軟性に欠けます。