【问题标题】:LWJGL GLSL Shader validity check always fails, though shader works fineLWJGL GLSL 着色器有效性检查总是失败,尽管着色器工作正常
【发布时间】:2012-04-22 21:24:56
【问题描述】:

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

【问题讨论】:

    标签: java opengl graphics opengl-es lwjgl


    【解决方案1】:

    这部分

    boolean isValid = 长度>1;

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

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

    【讨论】:

      【解决方案2】:

      不适合使用信息日志长度来检查着色器的有效性。

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

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

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

      【讨论】:

      • 好的,我现在明白了。感谢回复
      猜你喜欢
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      相关资源
      最近更新 更多