Java LWJGL GLSL着色器有效性检查始终失败,尽管着色器工作正常

Java LWJGL GLSL着色器有效性检查始终失败,尽管着色器工作正常,java,opengl,graphics,opengl-es,lwjgl,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 = iV

我有一个函数,用于检查共享的顶点/片段是否已成功编译,是否可在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,即使当我跳过此检查并仅使用着色器时,它仍然可以正常工作。那么,此着色器有效性检查有什么问题吗?

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

我不确定您在这里指的是程序还是着色器,但您应该分别使用GL\u LINK\u STATUS/GL\u COMPILE\u STATUS调用或以获得布尔通过/失败结果

只有当您想要分配一个字符缓冲区来检索日志,并且日志内容完全由GPU供应商决定,并且是任意的时,info日志长度才有用


在着色器编译之后,它可以很容易地在信息日志中返回
“compilesuccessful”
,这将使您的长度检查毫无用处

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

我不确定您在这里指的是程序还是着色器,但您应该分别使用GL\u LINK\u STATUS/GL\u COMPILE\u STATUS调用或以获得布尔通过/失败结果

只有当您想要分配一个字符缓冲区来检索日志,并且日志内容完全由GPU供应商决定,并且是任意的时,info日志长度才有用

在着色器编译之后,它可以很容易地在信息日志中返回
“compilesuccessful”
,这将使您的长度检查毫无用处

这部分

布尔值isValid=长度>1

将为任何空信息日志获取一个假值

据我所知,着色器的空信息日志是可以的,因此任何完美验证着色器都可能得到错误的结果。

此部分

布尔值isValid=长度>1

将为任何空信息日志获取一个假值


据我所知,着色器的空信息日志是可以的,因此任何完全验证着色器的结果都可能是错误的。

好的,我现在明白了。谢谢你的回复,我现在明白了。谢谢你的回复