GL_INFO_LOG_LENGTH возвращает 1 - PullRequest
0 голосов
/ 07 июля 2019

РЕДАКТИРОВАТЬ: уточнение. Я не проверяю, не прошла ли компиляция, я просто ищу logs . Я проверяю COMPILE_STATUS позже в коде. (См. GLint isCompiled, который не используется в этой части.)

Почему это возвращает 1, оно должно быть 0 ?

glGetShaderiv(compiled, GL_INFO_LOG_LENGTH, &infoLogLength);

    GLuint compiled = glCreateShader(shader->Type);
    GLchar const *shader_source = code.c_str();
    GLint const shader_length = code.size();

    glCheck(glShaderSource(compiled, 1, &shader_source, &shader_length));
    glCheck(glCompileShader(compiled));

    GLint isCompiled = 0;
    char msg[512];

    // Check if everything went ok
    glGetShaderiv(compiled, GL_COMPILE_STATUS, &isCompiled);

    // Getting information about the compile
    GLsizei infoLogLength = 0;
    glGetShaderiv(compiled, GL_INFO_LOG_LENGTH, &infoLogLength);
    if (infoLogLength > 0)
    {
        glGetShaderInfoLog(compiled, 512, &infoLogLength, msg);
        printf("Shader [%s:%s] error when compiling[%d]: \n%s", shader->Name.c_str(), GetShaderTypeAsString(shader->Type).c_str(), infoLogLength, msg);
    }

Выход:

Shader [dust_particle_VS.glsl:Vertex Sader] error when compiling[1]:

Кажется, шейдер работает нормально, и игра играет без проблем. Я просто думаю, что это может быть какое-то предупреждение, о котором мне может быть полезно знать.

Ответы [ 2 ]

4 голосов
/ 07 июля 2019

Реализации могут выдавать вам информационный журнал , даже если шейдер успешно скомпилирован. Или, что более важно, информационный журнал не обязательно должен быть пустым при успешной компиляции шейдера. Из спецификации:

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

Обратите внимание, что в нем не говорится "последняя неудачная попытка компиляции" или что-либо в этом роде. Поэтому не имеет значения, будет ли длина информационного журнала 0, 1 или что-то еще; Длина информационного журнала не может сказать вам, если компиляция прошла успешно или не удалось. Действительно, известно, что некоторые реализации выдают предупреждения в информационном журнале даже при успешной компиляции.

Проверка состояния компиляции - это способ определения успешности компиляции, а не информационный журнал.

0 голосов
/ 07 июля 2019

Спецификации OpenGLs 4.6 в 7.13 говорят:

void GetShaderiv (шейдер uint, enum pname, int * params);

...

Если pname имеет значение INFO_LOG_LENGTH, возвращается длина информационного журнала, включая нулевой терминатор.Если есть пустой информационный журнал, возвращается ноль.

И позже:

void GetShaderInfoLog (шейдер uint, sizei bufSize, sizei * length, char * infoLog);

...

Эти команды возвращают строку журнала информации для соответствующего типа объекта в infoLog.Эта строка будет заканчиваться нулем, даже если запрос INFO_LOG_LENGTH возвращает ноль.

Как я понимаю, эти предложения таковы, что запрос INFO_LOG_LENGTH должен возвращать ноль для пустого информационного журналастрока.И если вы получите эту строку, она будет содержать как минимум нулевой символ.

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

Другими словами, кажется, ошибка драйвера.
Не большой, потому что, как сказал @NicoBolas, вы не будете использовать инфо-журнал для проверки на сбой, но для информации в случае сбоя;и, вероятно, в этом случае драйвер установит строку длиннее 1.

...