1

LWJGL アプリケーションにシェーダーを実装しようとしています。シェーダーをアタッチしようとすると、「無効な Enum」例外が発生します。オーケー、コードの話もっと....

private void attach(int progID) {
    GL20.glAttachShader(progID,  vertShaderID);
    GL20.glAttachShader(progID, fragShaderID);
    System.out.println("Tester: " + GLU.gluErrorString(GL11.glGetError()));
    GL20.glLinkProgram(progID);
    System.out.println("Tester: " + GLU.gluErrorString(GL11.glGetError()));
    if(GL20.glGetShader(progID, GL20.GL_LINK_STATUS) == GL11.GL_FALSE) {
        System.err.println("error during linking shaders! " + GL20.glGetProgramInfoLog(progID, 1000) + " " + GLU.gluErrorString(GL11.glGetError()));
    }

    GL20.glValidateProgram(progID);
    System.out.println(GL20.glGetProgramInfoLog(progID, 1000));
    System.out.println("Tester: " + GLU.gluErrorString(GL11.glGetError()));
    System.out.println(GL20.glGetProgramInfoLog(progID, 1000));
    if(GL20.glGetShader(progID, GL20.GL_VALIDATE_STATUS) == GL11.GL_FALSE) {
        System.err.println("error during validating shaders! " + GL20.glGetProgramInfoLog(progID, 1000) + " " + GLU.gluErrorString(GL11.glGetError()));
    }

}

出力を生成します:

テスター: エラーなし

テスター: エラーなし

検証成功

テスター: 無効な列挙型

検証成功

したがって、この関数の例外のソースに従います。この検証機能は何ですか? プログラムのログが「検証成功」の場合、何がこのエラーを生成しますか? または、そのエラーは、アプリケーションで GL 関数を使用した他の状況から呼び出されていますか? そして、Invlaid Enum エラーとは何を意味するのでしょうか? GL Type を間違って使用したということですか?

4

1 に答える 1

2

GL_LINK_STATUSでクエリできるものではありませんglGetShader{iv} (...)。つまり、シェーダー ステータスです。おそらくGL_COMPILE_STATUS、各シェーダーに使用するつもりでした。

GL20.glGetShader (vertShaderID, GL20.GL_COMPILE_STATUS);
GL20.glGetShader (fragShaderID, GL20.GL_COMPILE_STATUS);

GL_LINK_STATUSは の有効な列挙型のみですglGetProgram{iv} (...):

GL20.glGetProgram (progID, GL20.GL_LINK_STATUS);

理想的には、各シェーダーのコンパイル ステータスを確認してから、上記の関数と列挙型を使用してすべてのシェーダーをリンクした後にリンク ステータスを確認する必要があります。

于 2013-09-27T23:14:26.713 に答える