QOpenGLExtraFunctions::glDeleteProgramPipelines()関数の詳細解説


構文

void QOpenGLExtraFunctions::glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines);

パラメータ

  • pipelines: 削除するプログラムパイプラインオブジェクトの配列
  • n: 削除するプログラムパイプラインオブジェクトの数

戻り値

なし

詳細

glDeleteProgramPipelines()関数は、指定されたプログラムパイプラインオブジェクトを削除します。プログラムパイプラインオブジェクトが使用されている場合は、まず使用を無効にする必要があります。

プログラムパイプラインオブジェクトを削除する前に、そのオブジェクトに関連付けられているすべてのシェーダープログラムを削除する必要があります。

次のコードは、プログラムパイプラインオブジェクトを削除する方法を示しています。

QOpenGLExtraFunctions *funcs = QOpenGLContext::currentContext()->extraFunctions();

GLuint pipelines[2];
glGenProgramPipelines(2, pipelines);

// ... プログラムパイプラインオブジェクトを使用 ...

funcs->glDeleteProgramPipelines(2, pipelines);

関連関数

  • glGetProgramPipelineiv()
  • glProgramParameteri()
  • glUseProgramStages()
  • glBindProgramPipeline()
  • glGenProgramPipelines()
  • プログラムパイプラインオブジェクトを削除する前に、そのオブジェクトに関連付けられているすべてのシェーダープログラムを削除する必要があります。
  • プログラムパイプラインオブジェクトが使用されている場合は、まず使用を無効にする必要があります。
  • glDeleteProgramPipelines()関数は、OpenGL ES 3.x、OpenGL 3.x、またはOpenGL 4.xコンテキストでのみ使用できます。


#include <QCoreApplication>
#include <QOpenGLWidget>
#include <QOpenGLShader>
#include <QOpenGLExtraFunctions>

class MyGLWidget : public QOpenGLWidget {
public:
    MyGLWidget() : QOpenGLWidget() {}

protected:
    void initializeGL() override {
        QOpenGLShader *vertexShader = new QOpenGLShader(this, QOpenGLShader::Vertex);
        vertexShader->sourceFile("vertex.vert");
        vertexShader->compile();

        QOpenGLShader *fragmentShader = new QOpenGLShader(this, QOpenGLShader::Fragment);
        fragmentShader->sourceFile("fragment.frag");
        fragmentShader->compile();

        QOpenGLProgram *program = new QOpenGLProgram(this);
        program->addShader(vertexShader);
        program->addShader(fragmentShader);
        program->link();

        GLuint pipelines[1];
        glGenProgramPipelines(1, pipelines);
        glBindProgramPipeline(pipelines[0]);

        glUseProgramStages(pipelines[0], GL_VERTEX_SHADER_BIT, program->programId());
        glUseProgramStages(pipelines[0], GL_FRAGMENT_SHADER_BIT, program->programId());

        // ... 描画処理 ...

        QOpenGLExtraFunctions *funcs = QOpenGLContext::currentContext()->extraFunctions();
        funcs->glDeleteProgramPipelines(1, pipelines);
    }
};

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

    MyGLWidget widget;
    widget.show();

    return app.exec();
}

このコードは以下の処理を行います。

  1. 頂点シェーダーとフラグメントシェーダーをソースファイルから読み込み、コンパイルします。
  2. 頂点シェーダーとフラグメントシェーダーを組み合わせたプログラムオブジェクトを作成し、リンクします。
  3. プログラムパイプラインオブジェクトを作成し、バインドします。
  4. プログラムパイプラインオブジェクトに頂点シェーダーとフラグメントシェーダーを割り当てます。
  5. 描画処理を行います。
  6. QOpenGLExtraFunctions::glDeleteProgramPipelines()関数を使用してプログラムパイプラインオブジェクトを削除します。

このコードはあくまで一例であり、実際のアプリケーションでは状況に応じて変更する必要があります。

  • プログラムパイプラインオブジェクトを削除する前に、そのオブジェクトに関連付けられているすべてのシェーダープログラムを削除する必要があります。
  • プログラムパイプラインオブジェクトが使用されている場合は、まず使用を無効にする必要があります。
  • このコードは、OpenGL ES 3.x、OpenGL 3.x、またはOpenGL 4.xコンテキストでのみ使用できます。


この関数の代替方法として、以下の方法が考えられます。

glDeleteProgram()関数を使用する

glDeleteProgram()関数は、プログラムオブジェクトを削除するために使用されます。プログラムパイプラインオブジェクトは、プログラムオブジェクトの一種であるため、この関数を使用して削除することができます。

void QOpenGLExtraFunctions::glDeleteProgram(GLuint program);

パラメータ

  • program: 削除するプログラムオブジェクト

戻り値

GLuint pipelines[2];
glGenProgramPipelines(2, pipelines);

// ... プログラムパイプラインオブジェクトを使用 ...

QOpenGLExtraFunctions *funcs = QOpenGLContext::currentContext()->extraFunctions();
funcs->glDeleteProgram(pipelines[0]);
funcs->glDeleteProgram(pipelines[1]);

glDeleteVertexShader()関数とglDeleteFragmentShader()関数を使用する

プログラムパイプラインオブジェクトは、頂点シェーダーとフラグメントシェーダーを組み合わせたもので構成されています。プログラムパイプラインオブジェクトを削除するには、まずそのオブジェクトに関連付けられている頂点シェーダーとフラグメントシェーダーを削除する必要があります。

void QOpenGLShader::glDeleteVertexShader(GLuint shader);
void QOpenGLShader::glDeleteFragmentShader(GLuint shader);

パラメータ

  • shader: 削除するシェーダーオブジェクト

戻り値

GLuint pipelines[2];
glGenProgramPipelines(2, pipelines);

// ... プログラムパイプラインオブジェクトを使用 ...

QOpenGLExtraFunctions *funcs = QOpenGLContext::currentContext()->extraFunctions();
funcs->glDeleteVertexShader(program->programId());
funcs->glDeleteFragmentShader(program->programId());
funcs->glDeleteProgram(pipelines[0]);
funcs->glDeleteProgram(pipelines[1]);

注意事項

  • glDeleteVertexShader()関数とglDeleteFragmentShader()関数を使用する場合は、プログラムパイプラインオブジェクトがまだ使用されていないことを確認する必要があります。
  • glDeleteProgram()関数を使用する場合は、プログラムパイプラインオブジェクトに関連付けられているすべてのシェーダープログラムが既に削除されていることを確認する必要があります。

これらの代替方法は、状況に応じて使用することができます。

QOpenGLExtraFunctions::glDeleteProgramPipelines()関数は、プログラムパイプラインオブジェクトを削除するための便利な関数ですが、状況によっては上記のような代替方法を使用することもできます。