Godot: isnan () в коде шейдера прерывает шейдер, когда ему передается не-float

Созданный на 26 мая 2018  ·  1Комментарий  ·  Источник: godotengine/godot

Версия Годо:
3.0.2 Моно

ОС / устройство, включая версию:
KDE Neon
GTX 1060

Описание проблемы:
в шейдере вы можете использовать isnan() чтобы проверить, является ли число с плавающей запятой NaN. Тем не менее, если вы передадите все , что не поплавок в него (например, целое число, вектор, матрица, и т.д.) он разбивает шейдер, но не дает сообщение об ошибке в редакторе. Однако при запуске игры вы получаете много спама с ошибками:

 drivers/gles3/shader_gles3.h:377 - Condition ' !version ' is true. returned: -1

Например, попробуйте этот шейдер:

shader_type spatial;

void fragment()
{
    ALBEDO = isnan(vec2(0,0)) ? vec3(1.0) : vec3(0.0);
}

Я назначил это на сферу здесь, как вы можете видеть, сфера странным образом растягивается и рисуется в пространстве экрана:
bug

Действия по воспроизведению:

  1. Добавьте MeshInstance в сцену, назначьте сферу и назначьте ей новый ShaderMaterial.
  2. Поместите в него шейдер и посмотрите на результат.

Проект минимального воспроизведения:

shadernanbug.zip

bug core rendering

Самый полезный комментарий

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

Я просто хотел сообщить вам, что ваш шейдерный код не будет компилироваться даже с исправлением, потому что isnan (vec2) возвращает логическое значение vec2. Ваш код будет компилироваться, если вы укажете, какой элемент vec2 вы хотите проверить. Например:

shader_type spatial;

void fragment()
{
    ALBEDO = isnan(vec2(0,0)).x ? vec3(1.0) : vec3(0.0);
}

>Все замечания

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

Я просто хотел сообщить вам, что ваш шейдерный код не будет компилироваться даже с исправлением, потому что isnan (vec2) возвращает логическое значение vec2. Ваш код будет компилироваться, если вы укажете, какой элемент vec2 вы хотите проверить. Например:

shader_type spatial;

void fragment()
{
    ALBEDO = isnan(vec2(0,0)).x ? vec3(1.0) : vec3(0.0);
}
Была ли эта страница полезной?
0 / 5 - 0 рейтинги