94752


提示のエラーログですが読み込んだバイナリを読み込むと提示コードの利用側の`glProgramBinary(program,*binaryFormats,bin,size);`関数で`///`コメント部のコード内部の`ProgramInfoLog(GLuint
p)`関数内部の`glGetProgramInfoLog(p, bufSize, &length,
&infoLog[0]);`関数で以下のログが表示されますこれはなぜ互換性がないとうログが出るのでしょうか？

##### 試した事

1,下記のソフト(glview)でバージョンを確認  
2,利用側とコンパイル側でバージョンを合わせました  
3,wikipediaでバージョンを確認  
4,opengl4.5で実験しましたが同じでした。  
5,利用側とコンパイル側のバージョンを一致させてシェーダーファイルも`4.6`です

##### 確認したいこと

1,コンパイル側でもコンパイル時のログ、リンクでのログなどを取得していますが何も表示されないです。  
2,`glProgramBinary(program,*binaryFormats,bin,size);`で下記のログ  
2,利用側にて下記のログを確認しました。

##### 参考サイト

wikipedia (opoenglバージョン部、glslバージョン部): <https://ja.wikipedia.org/wiki/GLSL>

##### 環境

OS: windows 10  
GPU: gtx1650

##### バージョン画像 (glview)

[![画像の説明をここに入力](https://i.stack.imgur.com/UkUdq.png)](https://i.stack.imgur.com/UkUdq.png)  
[![画像の説明をここに入力](https://i.stack.imgur.com/CGxgD.png)](https://i.stack.imgur.com/CGxgD.png)

##### コンソールログ

[code]

    ログなし
    ログなし
    glGetError() 0
    Program Info Log: Program binary could not be loaded. Binary is not compatible with current driver/hardware combination. Driver build date Apr 25 2023. Please check build information of source that generated the binary.
    プログラムリンク失敗
    
[/code]

##### 利用側

[code]

    
    /*############################################################################################
    # コンストラクタ
    ############################################################################################*/
    FrameWork::Shader::Shader(const GLbyte *bin,size_t size):binary(bin),program(glCreateProgram())
    {
        std::cout << size << std::endl;
        GLint formats = 0;
        glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &formats);
        GLint *binaryFormats = new GLint[formats];
    
        //リンク時のログを表示
        if (ProgramInfoLog(program) == false)
        {
            std::cerr << "プログラムリンク失敗" << std::endl;
            assert(0);
        }
        else
        {
            std::cout << "ログなし" << std::endl;
        }
    
        glGetIntegerv(GL_PROGRAM_BINARY_FORMATS, binaryFormats);
    
        //リンク時のログを表示
        if (ProgramInfoLog(program) == false)
        {
            std::cerr << "プログラムリンク失敗" << std::endl;
            assert(0);
        }
        else
        {
            std::cout << "ログなし" << std::endl;
        }
    
        glProgramBinary(program,*binaryFormats,bin,size);
        std::cout << "glGetError() " << glGetError() << std::endl;
        //リンク時のログを表示
        if (ProgramInfoLog(program) == false)
        {
            std::cerr << "プログラムリンク失敗" << std::endl;
            assert(0);
        }
        else
        {
            std::cout << "ログなし" << std::endl;
        }
    
    
    
    }
    
    
    
    bool FrameWork::Shader::ProgramInfoLog(GLuint p)
    {
        GLsizei bufSize;
        glGetProgramiv(p, GL_INFO_LOG_LENGTH, &bufSize);
    
        if (bufSize > 1)
        {
            std::vector<GLchar> infoLog(bufSize);
            GLsizei length;
            glGetProgramInfoLog(p, bufSize, &length, &infoLog[0]);
            std::cerr << "Program Info Log: " << infoLog.data() << std::endl;
            return false;
        }
        else
        {
            return true;
        }
    }
    
    
    
[/code]

##### コンパイル側

[code]

    
    int main()
    {
    
        if(glfwInit() != GLFW_TRUE)
        {
            printf("glfwInit() Error");
    
        }
    
    
        // OpenGL Verison 4.6 Core Profile
        glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
        glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);
        glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
        glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    
        GLFWwindow *window = glfwCreateWindow(100,100,"test",NULL,NULL);    //ウインドウ生成
        glfwMakeContextCurrent(window);
    
        if(glewInit() != GLEW_OK)
        {
            printf("glewInit() Error");
        }
    
    
        const GLuint p = glCreateProgram(); //シェーダープログラムを作成
    
        const GLchar* vert =  LoadShaderFile("BasicMono.vert");
        //const GLchar* geom =  LoadShaderFile(NULL);
        const GLchar* geom =  NULL;
        const GLchar* frag =  LoadShaderFile("BasicMono.frag");
    
        if (vert != NULL)
        {
            const GLuint vobj = glCreateShader(GL_VERTEX_SHADER);
            
            glShaderSource(vobj, 1,&vert, NULL);
            glCompileShader(vobj);
            glAttachShader(p, vobj);
            CompileInfoLog(vobj);
            //glDeleteShader(vobj);
        }
        else 
        {
            std::cerr << "頂点シェーダー読み込み失敗" << std::endl;
        }
    
        
        if (geom != NULL)
        {
            const GLuint gobj = glCreateShader(GL_GEOMETRY_SHADER);
            
            glShaderSource(gobj, 1,&geom, NULL);
            glCompileShader(gobj);
            glAttachShader(p, gobj);
            CompileInfoLog(gobj);
            //glDeleteShader(gobj);
        }
        else 
        {
    //      std::cerr << "ジオメトリシェーダー読み込み失敗" << std::endl;
        }
    
    
    
    
        if (frag != NULL)
        {
            const GLuint fobj = glCreateShader(GL_FRAGMENT_SHADER);
            
            glShaderSource(fobj, 1,&frag, NULL);
            glCompileShader(fobj);
            glAttachShader(p, fobj);
            CompileInfoLog(fobj);
            //glDeleteShader(fobj);
        }
        else 
        {
            std::cerr << "フラグメントシェーダー読み込み失敗" << std::endl;
        }
    
    
        glLinkProgram(p);       //リンクプログラム
    
        //リンク時のログを表示
        if(ProgramInfoLog(p) == false)
        {
            std::cerr<<"プログラムリンク失敗"<<std::endl;
        }
    
        // シェーダーコードをバイナリ形式に変換
        GLsizei binaryLength;
        glGetProgramiv(p, GL_PROGRAM_BINARY_LENGTH, &binaryLength);
        std::vector<GLubyte> binaryCode(binaryLength);
        GLenum binaryFormat = 0;
        GLsizei length;
        glProgramBinary(p,binaryFormat,(char*)binaryCode.data(),binaryLength);
    
    
        const char* fileName = "shader.bin";
    
        std::ofstream ofs(fileName, std::ios::binary);
        ofs.write((char*)binaryCode.data(), binaryCode.size());
        ofs.close();
    
        
        glDeleteShader(p); // シェーダーオブジェクトを削除
    
    
        return 0;
    }
    
    
[/code]

##### Main.cpp コンパイルと読み込み部のバージョン

[code]

        // OpenGL Verison 4.6 Core Profile
        glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
        glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);
        glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
        glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    
    
[/code]

###### 頂点シェーダー

[code]

    /*#########################################################################
    # 単色の二次元描画　頂点シェーダー
    ###########################################################################*/
    #version 460
    
    
    
    // ###################### 頂点属性 ###################### 
    layout(location = 0) in vec3 vertexPosition;    //頂点座標
    
    // ###################### 出力 ###################### 
    layout(location = 2) out vec4 vFragment;    //頂点カラー
    
    // ###################### Uniform ###################### 
    uniform mat4 uScale;            //スケール
    uniform mat4 uRotate;           //回転
    uniform mat4 uTranslate;        //平行移動
    uniform mat4 uViewProjection;   //ビュープロジェクション行列
    
    uniform vec4 uFragment;         //色
    
    
    void main()
    {
        vec4 vertex = vec4(vertexPosition,1.0);     //頂点座標
        mat4 model = uTranslate * uRotate * uScale;     //モデル行列
    
        gl_Position =  (uViewProjection * model) * vertex;
        
        vFragment = uFragment;              //カラー
    }
    
    
[/code]

##### フラグメントシェーダー

[code]

    /*#########################################################################
    # 単色の二次元描画　フラグメントシェーダー
    ###########################################################################*/
    #version 450
    
    // ###################### 入力 ###################### 
    layout(location = 2) in vec4 vfragment; //カラー
    
    // ###################### 出力 ###################### 
    out vec4 fragment;
    
    void main()
    {
        fragment = vfragment;
    }
    
    
    
[/code]


CC BY-SA 4.0
2023-05-05T07:21:30.753
94748
2023-05-05T09:50:35.893
2023-05-05T08:58:35.683
55177
55177
question
opengl
「OpenGL」 ハードウェア/ドライバーとの互換性がないというエラーが出る原因が知りたい


[`glProgramBinary()`](https://registry.khronos.org/OpenGL-
Refpages/gl4/html/glProgramBinary.xhtml)は

> **glProgramBinary** loads a program object with a program binary previously
> returned from glGetProgramBinary. _binaryFormat_ and _binary_ must be those
> returned by a previous call to glGetProgramBinary, and _length_ must be the
> length returned by glGetProgramBinary, or by glGetProgram when called with
> _pname_ set to `GL_PROGRAM_BINARY_LENGTH`. If these conditions are not met,
> loading the program binary will fail and _program_ 's `GL_LINK_STATUS` will
> be set to `GL_FALSE`.

と説明されているように、失敗したら（[`glGetProgramiv`](https://registry.khronos.org/OpenGL-
Refpages/gl4/html/glGetProgram.xhtml)で取得できる）`GL_LINK_STATUS`が`GL_FALSE`になります。これを確認することなくinfo
logだけ見ていても意味がありません。

また同じく説明されているように、`glProgramBinary()`に渡すバイナリは`glGetProgramBinary()`で取得する必要があります。しかし、質問文の「コンパイル側」には使われた形跡がありません。

何にせよ、リファレンスをよく読み、記述に従うところから始めてください。


CC BY-SA 4.0
2023-05-05T09:50:35.893
94752
2023-05-05T09:50:35.893
4236
94748
answer