LWJGL GLSL着色器有效性检查总是失败,但着色器工作正常

时间:2012-04-22 21:24:56

标签: java opengl graphics opengl-es lwjgl

我有一个函数检查顶点/片段共享是否已成功编译并且在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,即使我跳过此检查并只使用着色器,它也能正常工作。那么,这个着色器有效性检查有什么问题?

2 个答案:

答案 0 :(得分:1)

这部分

boolean isValid = length> 1;

会为任何空信息日志获取False值。

据我所知,着色器的空信息日志很好,因此可以使用任何完美验证的着色器获得False结果。

答案 1 :(得分:0)

使用infolog长度检查着色器的有效性是不合适的。

我不确定您是在这里引用程序还是着色器,但是您应该致电glGetProgramivglGetShaderiv分别使用GL_LINK_STATUS / GL_COMPILE_STATUS获取布尔传递/失败结果。

信息日志长度仅在您想要分配字符缓冲区以检索日志时才有用,并且日志内容完全取决于GPU供应商并且是任意的。

在着色器编译后,它可以很容易地在infolog中返回"Compile Successful",这将使您的长度检查无效。