LWJGL Opengl着色器错误

博格丹

在我的createShaderProgram方法中,在glLinkProgram(pID)和glValidateProgram(pID)之后,我进行了一些简单的错误检查。

int errorCheckValue = glGetError();
if(errorCheckValue != GL_NO_ERROR)
{
    System.err.println("Could not create shaders " + GLU.gluErrorString(errorCheckValue));
   //System.exit(-1);
}

代码的这种平静会引发错误消息->无法创建着色器无效的操作。因为我评论了System.exit(-1),所以一切正常,但是我不知道为什么会发生此错误。有什么方法可以对某些错误处理函数进行编码,该函数对错误更具体-不仅仅是无效操作?

编辑:这是其余的代码

private static int createShader(String source, int shaderType)
{
    int shaderID = 0;
    shaderID = glCreateShader(shaderType);
    glShaderSource(shaderID, source);
    glCompileShader(shaderID);

    if(glGetShaderi(shaderID, GL_COMPILE_STATUS) == GL_FALSE)
    {
        System.err.println("Shader failed to compile!");
        System.err.println(glGetShaderInfoLog(shaderID, 2048));
        System.exit(-1);
    }

    return shaderID;
}

public static int[] createShaderProgram(String vertFilename, String fragFilename, Attribute locations[])
{
    int pID, vertID, fragID = 0;
    pID = glCreateProgram();
    vertID = createShader(FileUtils.loadFileAsString(vertFilename), GL_VERTEX_SHADER);
    fragID = createShader(FileUtils.loadFileAsString(fragFilename), GL_FRAGMENT_SHADER);
    glAttachShader(pID, vertID);
    glAttachShader(pID, fragID);
    for(int i = 0; i < locations.length; i++){locations[i].bindAttribute(pID);}
    glLinkProgram(pID);
    glValidateProgram(pID);
    int errorCheckValue = glGetError();
    if(errorCheckValue != GL_NO_ERROR)
    {
        System.err.println("Could not create shaders " + GLU.gluErrorString(errorCheckValue));
        //System.exit(-1);
    }

    int[] result = new int[] {pID, vertID, fragID};

    return result;
}
javac

您可以检查链接/验证状态,并打印程序信息日志,类似于使用着色器的方式。

glLinkProgram(pID);
if (glGetProgrami(pID, GL_LINK_STATUS) == GL_FALSE) {
    System.err.println("Program failed to link");
    System.err.println(glGetProgramInfoLog(pID, glGetProgrami(pID, GL_INFO_LOG_LENGTH)));
}

(与相同GL_VALIDATE_STATUS)。


如果您使用的是LWJGL 3(最新夜间版本),则可以使用以下命令设置OpenGL调试消息回调

GLUtil.setupDebugMessageCallback();

这将自动选择正确的OpenGL扩展(或核心功能)来设置一个回调,该回调在每次OpenGL错误发生时打印一条错误消息(因此不再需要调用glGetError())。

如果您想对输出进行更多控制,可以查看GLUtil的源代码,了解如何手动设置调试回调。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章