1

共有されている頂点/フラグメントが正常にコンパイルされ、LWJGL 内で使用できるかどうかをチェックする関数があります。

public static boolean isShaderValid(int shaderToCheck) {
    IntBuffer iVal = BufferUtils.createIntBuffer(1);
    glGetObjectParameterARB(shaderToCheck, GL_OBJECT_INFO_LOG_LENGTH_ARB, iVal);
    int length = iVal.get();
    boolean isValid = length>1;
    if (isValid && verboseValidityCheck) {
        printShaderLogInfo(shaderToCheck, iVal, length);
    }
    return isValid;
}

ただし、これは常に false を返します。このチェックをスキップしてシェーダーだけを使用しても問題なく動作します。では、このシェーダーの有効性チェックの何が問題になっているのでしょうか?

4

2 に答える 2

1

この部分

boolean isValid = length>1;

空の情報ログに対して False 値を取得します。

私の知る限り、シェーダーの空の情報ログは問題ないので、完全に検証されたシェーダーで False の結果が得られる可能性があります。

于 2012-04-22T23:56:03.073 に答える
0

シェーダーの有効性をチェックするためにinfologの長さを使用することは適切ではありません。

ここでプログラムとシェーダーのどちらを参照しているかはわかりませんが、ブール値の合否結果を取得するには、GL_LINK_STATUS/GL_COMPILE_STATUSを指定してglGetProgramivまたはglGetShaderivをそれぞれ呼び出す必要があります。

情報ログの長さは、文字のバッファーを割り当ててログを取得する場合にのみ役立ちます。ログの内容は完全にGPUベンダーに依存し、任意です。

"Compile Successful"シェーダーのコンパイル後に情報ログに簡単に戻る可能性があり、長さのチェックが役に立たなくなります。

于 2012-04-22T21:40:08.737 に答える