質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.49%

OpenGL シェーダー関係でdeleteしないといけない関数が知りたい。

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 364
退会済みユーザー

退会済みユーザー

提示コードですがメモリリークしていします。このコードはシェーダーについてのコードを書いているのですがコメント部の内部のデストラクタ関数で必要なものをdelete してるはずなのですがメモリリークしてしまます。OpenGL側の関数でdelete しないといけない関数を調べてdelete しているのですが他にもあるのでしょうか?調べた範囲では全部やったのですがまだあるみたいです。

知りたいこと「OpenGL側でdelete する必要がある関数がどれか知りたい。 」
調べたこと[調べた範囲でdelete しました。]

#include "../Header/Shader.hpp"
#include "../Header/Game.hpp"


/*###################################################################################
* コンストラクタ
* 
* 説明 頂点シェーダ,フラグメントシェーダの順にファイル名を指定する。
#####################################################################################*/
Shader::Shader(class Game* g,const char* VertName, const char* FragName)
{
    // 変数を初期化
    mIsActive = false;    //シェーダーアクティブ

    mShaderProgram = glCreateProgram();    //シェーダープログラムを作成

    // 頂点シェーダーをコンパイル
    if (CompileShader(VertName, GL_VERTEX_SHADER) == false)
    {
        printf("ファイルが存在しません: %s\n", VertName);        
    }

    // フラグメントシェーダーをコンパイル
    if (CompileShader(FragName, GL_FRAGMENT_SHADER) == false)
    {
        printf("ファイルが存在しません: %s\n", FragName);
    }

    glLinkProgram(mShaderProgram);    //プログラムをリンク
}




/*################################################################################### 
* ログを取得
#####################################################################################*/
void Shader::GetShader_Log(const char* fileName ,GLuint shader_type, GLuint Log_type)
{
    GLint bufferSize = 0;
    GLchar* infoLog = nullptr;


    glGetShaderiv(shader_type, Log_type, &bufferSize);    //成功したかどうか?
    if (bufferSize == GL_FALSE)
    {

    }

    glGetShaderiv(shader_type, GL_INFO_LOG_LENGTH, &bufferSize);    //ログの長さを取得する

    infoLog = (GLchar*)malloc(bufferSize);

    if (infoLog != NULL)
    {
        GLsizei length;    //ログの長さ    
        glGetShaderInfoLog(shader_type, bufferSize, &length, infoLog); // シェーダーオブジェクトの情報ログを返す

        if (length > 1)    //一文字以上の場合ログ出力
        {
            //printf("FileName: %s\n",fileName);        
        }

        free(infoLog);    //メモリ開放////////////////////////
        infoLog = NULL;
    }

    free(infoLog);    //メモリ開放//////////////////////////////
    infoLog = NULL;
    //return true;
}



/*###################################################################################
* コンパイル
* 
* 説明 ファイル名,タイプ
#####################################################################################*/
bool Shader::CompileShader(const char* fileName, GLenum type)
{

    out_shader = glCreateShader(type);    //シェーダーオブジェクトを作成

    //シェーダーを読み込み 
    std::ifstream shaderfile(fileName);    //読み取り用

    if (shaderfile.is_open() == true)    
    {
        //ソースコード文字列を取得
        std::stringstream sstream;
        sstream << shaderfile.rdbuf();
        std::string str = sstream.str();
        const char* cc = str.c_str();


        glShaderSource(out_shader, 1, &cc, nullptr);    //ソースファイルを設定
        glCompileShader(out_shader);                    //コンパイル

        //printf("ファイル読み込み成功: %s\n", fileName);
        GetShader_Log(fileName,out_shader, GL_COMPILE_STATUS);    //ログを取得
        glAttachShader(mShaderProgram, out_shader);                //アタッチ
        shaderfile.close();                                        //ファイルを閉じる
    }
    else {

        // ファイルが存在しない場合

        shaderfile.close();
        glDeleteShader(out_shader);/////////////////////////////////////////

        //printf("ファイル: %s が存在しません。\n", fileName);
        return false;
    }

    glDeleteShader(out_shader);////////////////////////////////////////////////

    return true;
}


//#################### 有効にする
void Shader::Enable()
{
//    printf("シェーダーを有効にしました: %s \n", mFileName.c_str());

    mIsActive = true;
    glUseProgram(mShaderProgram);    //アクティブにする
}


//#################### 無効にする
void Shader::Disable()
{
    printf("シェーダーを無効にしました: %s \n",mFileName.c_str());

    mIsActive = false;
    glDeleteProgram(mShaderProgram);    
}



// #######################################################################################  uniform を設定


// 行列 3行列
void Shader::SetFloatUniform_3m(const char* str, glm::mat3 m)
{
    float* p = glm::value_ptr(m);
    glUniformMatrix3fv(glGetUniformLocation(mShaderProgram, str), 1, GL_FALSE, p);
    if (mIsActive == false)
    {
        printf("ファイル名: [ %s ] アクティブになっていません。\n",mFileName.c_str());
    }
}

// 行列 4行列
void Shader::SetFloatUniform_4m(const char* str, glm::mat4 m)
{


    float* p = glm::value_ptr(m);
    glUniformMatrix4fv(glGetUniformLocation(mShaderProgram, str), 1, GL_FALSE, p);
    if (mIsActive == false)
    {
        printf("ファイル名: [ %s ] アクティブになっていません。\n", mFileName.c_str());
    }
}


// ベクトル 1次元
void Shader::SetFloatUniform_1f(const char* name, float m)
{
    GLuint loc = glGetUniformLocation(mShaderProgram, name);
    glUniform1f(loc, m);
    if (mIsActive == false)
    {
        printf("ファイル名: [ %s ] アクティブになっていません。\n", mFileName.c_str());
    }
}

// ベクトル 2次元
void Shader::SetFloatUniform_2f(const char* name, glm::vec2 v)
{
    GLuint loc = glGetUniformLocation(mShaderProgram, name);
    glUniform2f(loc, v.x, v.y);
    if (mIsActive == false)
    {
        printf("ファイル名: [ %s ] アクティブになっていません。\n", mFileName.c_str());
    }
}

// ベクトル 3次元
void Shader::SetFloatUniform_3f(const char* name, glm::vec3 v)
{
    GLuint loc = glGetUniformLocation(mShaderProgram, name);
    glUniform3f(loc, v.x, v.y, v.z);
    if (mIsActive == false)
    {
        printf("ファイル名: [ %s ] アクティブになっていません。\n", mFileName.c_str());
    }
}

// ベクトル 4次元
void Shader::SetFloatUniform_4f(const char* name, glm::vec4 v)
{
    GLuint loc = glGetUniformLocation(mShaderProgram, name);
    glUniform4f(loc, v.x, v.y, v.z, v.w);
    if (mIsActive == false)
    {
        printf("ファイル名: [ %s ] アクティブになっていません。\n", mFileName.c_str());
    }
}
/////////////////////////////////////////////////////////////////////////////
//デストラクタ
Shader::~Shader()
{
    Disable();
    glDeleteShader(out_shader);
}
/////////////////////////////////////////////////////////////////////////////
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • 退会済みユーザー

    2021/01/23 19:40

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る