Java LWJGL Opengl着色器错误

Java LWJGL Opengl着色器错误,java,opengl,shader,lwjgl,Java,Opengl,Shader,Lwjgl,在glLinkProgram(pID)和glValidateProgram(pID)之后的createShaderProgram方法中 进行一些简单的错误检查 int errorCheckValue = glGetError(); if(errorCheckValue != GL_NO_ERROR) { System.err.println("Could not create shaders " + GLU.gluErrorString(errorCheckValue)); //S

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

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;
}
private static int createShader(字符串源,int shaderType)
{
int shaderID=0;
shaderID=glCreateShader(shaderType);
glShaderSource(shaderID,source);
glCompileShader(shaderID);
if(glGetShaderi(shaderID,GL\u编译\u状态)==GL\u FALSE)
{
System.err.println(“着色器未能编译!”);
System.err.println(glGetShaderInfoLog(shaderID,2048));
系统退出(-1);
}
返回shaderID;
}
公共静态int[]createShaderProgram(字符串vertFilename、字符串fragFilename、属性位置[])
{
int-pID,vertID,fragID=0;
pID=glCreateProgram();
vertID=createShader(FileUtils.loadFileAsString(vertFilename),GL\u VERTEX\u着色器);
fragID=createShader(FileUtils.loadFileAsString(fragFilename),GL\u FRAGMENT\u着色器);
格拉塔沙德(pID,vertID);
格拉塔沙德(pID,fragID);
对于(inti=0;i
您可以检查链接/验证状态并打印程序信息日志,与使用着色器的方式类似

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\u VALIDATE\u STATUS
相同)


如果您使用的是LWJGL3(最新的夜间构建),则可以使用设置OpenGL调试消息回调

GLUtil.setupDebugMessageCallback();
这将自动选择正确的OpenGL扩展(或核心功能),以设置每次发生OpenGL错误时打印错误消息的回调(因此不再需要调用
glGetError()


如果您希望对输出进行更多控制,可以了解如何手动设置调试回调。

Hi-javac。谢谢你的回答。它准确地回答了我的问题,但不幸的是没有解决我的问题。此函数不触发任何错误,但编译状态函数触发无效操作错误。但是我会接受你的回答,因为它再次回答了我的问题。