QOpenGLExtraFunctions::glProgramUniform2f() の詳細解説


QOpenGLExtraFunctions::glProgramUniform2f() は、Qt GUI で OpenGL シェーダー プログラムに 2D 浮動小数点ベクトル値をユニフォーム変数として設定するために使用される関数です。シェーダー プログラムは、3D グラフィックスをレンダリングするために使用されるプログラムであり、ユニフォーム変数は、シェーダー プログラム内でグローバルにアクセスできる値です。

関数詳細

void QOpenGLExtraFunctions::glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1);
  • v1: ユニフォーム変数の 2 番目の浮動小数点値です。
  • v0: ユニフォーム変数の最初の浮動小数点値です。
  • location: ユニフォーム変数の場所です。これは、シェーダー プログラム内でユニフォーム変数が宣言されたときに割り当てられる整数値です。
  • program: シェーダー プログラムの ID です。

使用例

// シェーダー プログラムを作成してコンパイルします。
GLuint program = createAndCompileShaderProgram();

// ユニフォーム変数の場所を取得します。
GLint uniformLocation = glGetUniformLocation(program, "myUniform");

// ユニフォーム変数に値を設定します。
QOpenGLExtraFunctions::glProgramUniform2f(program, uniformLocation, 0.5f, 0.8f);
  • ユニフォーム変数に値を設定するには、QOpenGLExtraFunctions::glProgramUniform2f() 関数を使用する必要があります。この関数は、シェーダー プログラム、ユニフォーム変数の場所、および設定する値を渡します。
  • ユニフォーム変数の場所を取得するには、glGetUniformLocation() 関数を使用する必要があります。この関数は、ユニフォーム変数の名前と、その名前が宣言されたシェーダー プログラムを渡します。
  • QOpenGLExtraFunctions::glProgramUniform2f() は、OpenGL ES 3.x 以降、または OpenGL 3.x または 4.x コンテキストでのみ使用できます。古いバージョンの OpenGL を使用している場合は、代わりに glUniform2f() 関数を使用する必要があります。

この説明が、Qt GUI における QOpenGLExtraFunctions::glProgramUniform2f() の理解に役立つことを願っています。

  • Qt GUI で OpenGL を使用するには、まず Qt で OpenGL をサポートするように構成する必要があります。詳細については、Qt GUI ドキュメントを参照してください。
  • この説明は、Qt GUI 6.7.1 と OpenGL 4.6 を対象としています。他のバージョンでは、関数の名前、引数、または動作が異なる場合があります。


vertex.glsl

#version 330 core

layout (location = 0) in vec3 aPos;

uniform vec2 uOffset;

void main() {
    gl_Position = vec4(aPos.x + uOffset.x, aPos.y + uOffset.y, aPos.z, 1.0);
}

fragment.glsl

#version 330 core

out vec4 FragColor;

void main() {
    FragColor = vec4(1.0, 0.5, 0.0, 1.0);
}
#include <QApplication>
#include <QGLWidget>

class GLWidget : public QGLWidget {
public:
    GLWidget() {
        setFormat(QGLFormat(QGL::SingleBuffer | QGL::DepthBuffer));
    }

protected:
    void initializeGL() override {
        // シェーダー プログラムを作成してコンパイルします。
        GLuint program = createAndCompileShaderProgram("vertex.glsl", "fragment.glsl");

        // ユニフォーム変数の場所を取得します。
        GLint uniformLocation = glGetUniformLocation(program, "uOffset");

        // 三角形の頂点データを初期化します。
        GLfloat vertices[] = {
            0.5f,  0.5f, 0.0f,
            -0.5f, -0.5f, 0.0f,
            0.0f,  0.0f, 0.0f
        };

        // 頂点バッファ オブジェクト (VBO) を作成します。
        GLuint vbo;
        glGenBuffers(1, &vbo);
        glBindBuffer(GL_ARRAY_BUFFER, vbo);
        glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

        // シェーダー プログラムをアクティブにします。
        glUseProgram(program);

        // 頂点属性を有効化します。
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (void*)0);
        glEnableVertexAttribArray(0);
    }

    void paintGL() override {
        // 三角形を描画します。
        glDrawArrays(GL_TRIANGLES, 0, 3);

        // ユニフォーム変数に値を設定します。
        QOpenGLExtraFunctions::glProgramUniform2f(program, uniformLocation, 0.2f, 0.3f);
    }

private:
    GLuint createAndCompileShaderProgram(const char* vertexShaderSource, const char* fragmentShaderSource) {
        // 頂点シェーダーをコンパイルします。
        GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
        glShaderSource(vertexShader, 1, &vertexShaderSource, nullptr);
        glCompileShader(vertexShader);

        GLint compileStatus;
        glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &compileStatus);
        if (compileStatus != GL_TRUE) {
            glDeleteShader(vertexShader);
            return 0;
        }

        // フラグメント シェーダーをコンパイルします。
        GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
        glShaderSource(fragmentShader, 1, &fragmentShaderSource, nullptr);
        glCompileShader(fragmentShader);

        glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &compileStatus);
        if (compileStatus != GL_TRUE) {
            glDeleteShader(fragmentShader);
            glDeleteShader(vertexShader);
            return 0;
        }

        // シェーダー プログラムを作成します。
        GLuint program = glCreateProgram();
        glAttachShader(program, vertexShader);
        glAttachShader(program, fragmentShader);

        glLinkProgram(program);

        GLint linkStatus;
        glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
        if (linkStatus != GL_TRUE) {
            glDeleteProgram(program);
            glDeleteShader


この関数は、OpenGL ES 3.x 以降、または OpenGL 3.x または 4.x コンテキストでのみ使用できます。古いバージョンの OpenGL を使用している場合は、代わりに glUniform2f() 関数を使用する必要があります。

代替方法

  • glUniform2f(): glUniform2f() 関数は、OpenGL 2.0 以降で使用できる標準の OpenGL 関数です。これは、QOpenGLExtraFunctions::glProgramUniform2f() と同じ機能を提供しますが、シェーダー プログラム ID とユニフォーム変数の場所を引数として直接渡す必要があります。
glUniform2f(uniformLocation, v0, v1);
  • QOpenGLShaderProgram::setUniformValue(): QOpenGLShaderProgram クラスには、ユニフォーム変数の値を設定するための setUniformValue() メソッドがあります。このメソッドは、ユニフォーム変数の名前と設定する値を引数として受け取ります。
program->setUniformValue("uOffset", QVector2D(0.2f, 0.3f));
  • QOpenGLShaderProgram::setUniformValue(): Qt GUI で OpenGL を使用している場合は、QOpenGLShaderProgram クラスを使用する方が簡単で簡潔な場合があります。
  • glUniform2f(): より汎用性が高く、OpenGL 2.0 以降で使用できます。
  • QOpenGLShaderProgram::bindUniformBuffer(): ユニフォーム変数の値をバッファ オブジェクトから設定したい場合は、QOpenGLShaderProgram::bindUniformBuffer() メソッドを使用できます。
  • QOpenGLShaderProgram::setUniformValueArray(): 複数のユニフォーム変数に同時に値を設定したい場合は、QOpenGLShaderProgram::setUniformValueArray() メソッドを使用できます。