Godot: 着色器代码中的isnan()将非浮点传递到着色器时会中断着色器

创建于 2018-05-26  ·  1评论  ·  资料来源: godotengine/godot

Godot版本:
3.0.2单声道

操作系统/设备,包括版本:
霓虹灯
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 等级

相关问题

EdwardAngeles picture EdwardAngeles  ·  3评论

SleepProgger picture SleepProgger  ·  3评论

bojidar-bg picture bojidar-bg  ·  3评论

gonzo191 picture gonzo191  ·  3评论

testman42 picture testman42  ·  3评论