2015-10-29 3 views
0

В моем методе createShaderProgram после glLinkProgram (pID) и glValidateProgram (pID) i есть простая проверка ошибок.Ошибка LWJGL Opengl Shader

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

В этом покое кода выдается сообщение об ошибке -> Не удалось создать шейдеры Неверная операция. Поскольку я прокомментировал System.exit (-1), все работает нормально, но я не знаю, почему эта ошибка возникает. Есть ли какой-либо способ кода для обработки ошибок, что более специфично в отношении ошибки - что-то более конкретное, чем просто неправильная операция?

EDIT: Вот остальная часть кода

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; 
} 

ответ

1

Вы можете проверить состояние соединения/проверки и распечатать информация о программе журнала, такую ​​же, как вы делаете это с шейдерами.

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's source code о том, как вручную настраивать обратные вызовы отладки, если вы хотите получить больше контроля над выходом.

+0

Hi javac. Спасибо за Ваш ответ. Он всегда отвечает на мой вопрос, но, к сожалению, не разрешает мою проблему. Эти функции не запускают никаких ошибок, но функция статуса компиляции срабатывает. Неверная ошибка работы. Но я собираюсь принять ваш ответ, потому что снова он отвечает на мой вопрос. – Bogdan