Шейдер OpenGL не компилируется, но не выдает сообщения об ошибке

#c #opengl #glsl

#c #opengl #glsl

Вопрос:

Я пытаюсь написать функцию для загрузки и компиляции шейдера с использованием OpenGL, но шейдер отказывается компилироваться, выдавая мне пустой (или случайный) журнал ошибок.

Ниже приведен мой минимальный пример:

 vertexShader = glCreateShader( GL_VERTEX_SHADER );
std::string vertexSource = ShaderLoader::load("vertexShader.vert");
const char * vertexAdress = vertexSource.c_str();
glShaderSource( vertexShader, 1, amp;vertexAdress, NULL );
int shaderCompiled = GL_FALSE;
char errorLog[512];
glCompileShader(vertexShader);
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, amp;shaderCompiled );
glGetShaderInfoLog(vertexShader, 512, nullptr, amp;errorLog[0]);
glDeleteShader(vertexShader);
 

Вывод shaderCompiled выдает 0 и errorLog выдает либо пустую строку, либо несколько случайных символов.

Функция ShaderLoader::load содержит следующий код:

 std::string ShaderLoader::load(std::string source) {
    std::string shader;
    std::fstream readFile(source, std::ios::in);
    if (readFile.is_open()){
        std::stringstream buffer;
        buffer << readFile.rdbuf();
        shader = buffer.str()   "";
    } else {
        throw std::runtime_error( "Couldn't load shader file: "   source);
    }
    return shader;
}
 

Похоже, он работает так, как ожидалось. Исходный код шейдера

 #version 330 core
layout (location = 0) in vec3 inVertex;
layout (location = 1) in vec3 inNormal;

out vec3 FragmentPosition;
out vec3 Normal;

uniform mat4 transform;

void main()
{
    FragmentPosition = vec3(inVertex);
    Normal = mat3(transpose(inverse(transform))) * inNormal;
    gl_Position = transform * vec4( inVertex, 1 );
}
 

Как я могу errorLog заполнить фактическое сообщение об ошибке или, что еще лучше, заставить шейдер скомпилироваться.

Комментарии:

1. Это опечатка. Вы используете 2 разные переменные vertexShader и shader .

2. Спасибо, что указали на это! Однако, к сожалению, он делает то же самое после изменения имени переменной. Я обновил вопрос.

3. Извините, проблема не воспроизводима. Код работает нормально. Код шейдера корректен и может быть успешно скомпилирован.

4. Вы проверяете glError ? Because shaderCompiled изменяется только тогда, когда ошибка не возникает. Вы инициализируете его с помощью false , поэтому он мог просто не быть изменен до его проверки. Как уже сказал Rabbid76: шейдер отлично компилируется для меня.

5. Должно быть, я сделал что-то странное в остальной части моего кода. К сожалению, glError возвращается GL_NO_ERROR , поэтому я все еще в неведении. В любом случае, большое спасибо за ваш вклад.

Ответ №1:

Сначала используйте протоколирование ошибок, только если значение shaderCompiled равно false, чтобы вы не получали случайные строки,

   glGetShaderiv(VS, GL_COMPILE_STATUS, amp;shaderCompiled);
  if (!shaderCompiled)
  {
    //error
    GLchar InfoLog[256];
    glGetShaderInfoLog(vertexShader, sizeof(InfoLog), NULL, InfoLog);

 

Во-вторых, вы на самом деле связываете и используете шейдеры, проблема может быть не в компиляции:

   // after compilation
  GLuint shaderProgram = glCreateProgram();
  glAttachShader(shaderProgram, vertexShader);
  glLinkProgram(shaderProgram);
  glDetachShader(shaderProgram, vertexShader);
  glDeleteShader(vertexShader);
  glGetProgramiv(shaderProgram, GL_LINK_STATUS, amp;success);