Godot: isnan () im Shader-Code unterbricht den Shader, wenn ein Nicht-Float an ihn übergeben wird

Erstellt am 26. Mai 2018  ·  1Kommentar  ·  Quelle: godotengine/godot

Godot-Version:
3.0.2 Mono

Betriebssystem / Gerät einschließlich Version:
KDE Neon
GTX 1060

Fehlerbeschreibung:
In einem Shader können Sie mit isnan() prüfen, ob ein Float NaN ist. Wenn Sie jedoch etwas übergeben, das kein Float ist (z. B. eine Ganzzahl, ein Vektor, eine Matrix usw.), wird der Shader unterbrochen, es wird jedoch keine Fehlermeldung im Editor angezeigt. Sie erhalten jedoch eine Menge Fehler-Spam, wenn das Spiel ausgeführt wird:

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

Versuchen Sie zum Beispiel diesen Shader:

shader_type spatial;

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

Ich habe es hier einer Kugel zugewiesen, wie Sie sehen können, wird die Kugel merkwürdig gedehnt und im Bildschirmbereich gezeichnet:
bug

Schritte zum Reproduzieren:

  1. Fügen Sie der Szene MeshInstance hinzu, weisen Sie eine Kugel zu und weisen Sie ihr ein neues ShaderMaterial zu.
  2. Setzen Sie den Shader oben ein und beobachten Sie die Ergebnisse.

Minimales Reproduktionsprojekt:

shadernanbug.zip

bug core rendering

Hilfreichster Kommentar

Vielen Dank für den reproduzierbaren Fehlerbericht. Ich habe eine Pull-Anfrage erstellt, die diesen Fehler beheben soll.

Ich wollte Sie nur wissen lassen, dass Ihr Shader-Code auch mit dem Fix nicht kompiliert werden kann, da isnan (vec2) einen booleschen vec2 zurückgibt. Ihr Code würde kompiliert, wenn Sie angeben, welches Element von vec2 Sie überprüfen möchten. Beispielsweise:

shader_type spatial;

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

>Alle Kommentare

Vielen Dank für den reproduzierbaren Fehlerbericht. Ich habe eine Pull-Anfrage erstellt, die diesen Fehler beheben soll.

Ich wollte Sie nur wissen lassen, dass Ihr Shader-Code auch mit dem Fix nicht kompiliert werden kann, da isnan (vec2) einen booleschen vec2 zurückgibt. Ihr Code würde kompiliert, wenn Sie angeben, welches Element von vec2 Sie überprüfen möchten. Beispielsweise:

shader_type spatial;

void fragment()
{
    ALBEDO = isnan(vec2(0,0)).x ? vec3(1.0) : vec3(0.0);
}
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen