Nano Hash - криптовалюты, майнинг, программирование

GL_INFO_LOG_LENGTH возвращает 1

РЕДАКТИРОВАТЬ: уточнение. Я не проверяю, произошла ли ошибка компиляции, я просто ищу журналы. Я проверяю 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]:

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

07.07.2019

Ответы:


1

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

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

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

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

07.07.2019
  • Проверка состояния компиляции - это то, как вы определяете, удалась ли компиляция или нет, а не информационный журнал, меня это не волнует. Мне интересно, почему это 1, а не 0. 07.07.2019
  • Я ПОСТОЯННО вижу как 0, так и 1 в конкретном шейдере, который я компилирую. 07.07.2019
  • Shader_1: Всегда длина 0, Shader_2: Всегда длина 1. 07.07.2019
  • @KimS.: Тогда вы спрашиваете, почему вещь, зависящая от реализации, имеет ту ценность, которую она имеет. Ну, это просто так. Я имею в виду, что где-то в глубинах используемой вами реализации может быть ответ. Но этот ответ никоим образом не будет ни полезным, ни значимым. Он также не обязательно будет соответствовать следующей версии драйвера, что может изменить результат. 07.07.2019
  • @KimS Мне жаль это говорить, но если вы проверяете длину журнала шейдера как способ определить статус компиляции, вы НЕ следуете спецификации. Спецификация позволяет разработчикам драйверов возвращать предупреждения через информационный журнал, которые не имеют ничего общего с действительностью самого кода шейдера. Чтобы узнать, произошла ли ошибка компиляции, вам нужно проверить GL_COMPILE_STATUS, конец истории. 08.07.2019
  • @NicolBolas, да, я просто проверяю, не замечал ли кто-нибудь такое же поведение, когда что-то было не так. Не волнуйтесь, я проверю все позже в коде, COMPILE, LINK, VALIDATION и т. д. 08.07.2019
  • @robthebloke, как я уже несколько раз упоминал здесь, я не проверяю размер журнала, чтобы убедиться, что компиляция не удалась, я просто проверяю, есть ли журнал ВООБЩЕ. Иисус Христос. 08.07.2019
  • @KimS .: Тогда почему ваш код печатает ошибку при компиляции, если создается журнал с ненулевой длиной? Почему ваш код запрашивает статус компиляции, но ничего с ним не делает? Все это свидетельствует о неправильном использовании информационного журнала для проверки ошибок или просто о пропущенном операторе if(isCompiled). 08.07.2019
  • @NicolBolas, вы хотите, чтобы в журнале было написано LOG при компиляции или что-то в этом роде, достаточно честно. Статус компиляции даже не обрабатывается ни в одном из этих кодов. Вы фокусируетесь не на том. Посмотрите на заголовок. 08.07.2019
  • @NicolBolas Этот код находится прямо под фрагментом, который я разместил; ``` if (isCompiled == GL_FALSE) { g_ErrorReport(Шейдер [%s:%s] не будет использоваться из-за ошибки., шейдер-›Name.c_str(), GetShaderTypeAsString(shader-›Type).c_str( )); возврат -1; } вернуть скомпилированное значение; ``` 08.07.2019
  • @NicolBolas Я не добавлял это в вопрос, потому что это вообще не имеет отношения к моему вопросу. 08.07.2019
  • I@KimS Должно быть ноль, но это не так. Это будет драйвер bu (или оптимизация, в зависимости от того, как вы на это смотрите) g. t по-прежнему не устраняет проблему, связанную с использованием длины журнала для определения того, произошла ли ошибка: Ошибка шейдера [%s:%s] при компиляции[%d]: \n%s 09.07.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..