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 = 长度>1;

将为您提供任何空信息日志的 False 值。

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

于 2012-04-22T23:56:03.073 回答
0

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

我不确定您在这里指的是程序还是着色器,但您应该分别使用 GL_LINK_STATUS/GL_COMPILE_STATUS 调用glGetProgramivglGetShaderiv以获得布尔通过/失败结果。

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

它可以在着色器编译后轻松返回"Compile Successful"到信息日志中,这会使您的长度检查毫无用处。

于 2012-04-22T21:40:08.737 回答