我有一个函数检查顶点/片段共享是否已成功编译并且在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,即使我跳过此检查并只使用着色器,它也能正常工作。那么,这个着色器有效性检查有什么问题?
答案 0 :(得分:1)
这部分
boolean isValid = length> 1;
会为任何空信息日志获取False值。
据我所知,着色器的空信息日志很好,因此可以使用任何完美验证的着色器获得False结果。
答案 1 :(得分:0)
使用infolog长度检查着色器的有效性是不合适的。
我不确定您是在这里引用程序还是着色器,但是您应该致电glGetProgramiv或glGetShaderiv分别使用GL_LINK_STATUS / GL_COMPILE_STATUS获取布尔传递/失败结果。
信息日志长度仅在您想要分配字符缓冲区以检索日志时才有用,并且日志内容完全取决于GPU供应商并且是任意的。
在着色器编译后,它可以很容易地在infolog中返回"Compile Successful"
,这将使您的长度检查无效。