Godot: isnan () dans le code du shader casse le shader lorsqu'un non-float y est passé

Créé le 26 mai 2018  ·  1Commentaire  ·  Source: godotengine/godot

Version Godot:
3.0.2 Mono

OS / appareil, y compris la version:
KDE Neon
GTX 1060

Description du problème:
dans un shader, vous pouvez utiliser isnan() pour vérifier si un flottant est NaN. Cependant, si vous lui passez quelque chose qui n'est pas un flottant (comme un entier, un vecteur, une matrice, etc.), cela casse le shader, mais ne donne pas de message d'erreur dans l'éditeur. Cependant, vous recevez beaucoup de spam d'erreur lorsque le jeu s'exécute:

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

Par exemple, essayez ce shader:

shader_type spatial;

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

Je l'ai assigné sur une sphère ici, comme vous pouvez le voir, la sphère est étrangement étirée et est dessinée dans l'espace de l'écran:
bug

Étapes à suivre pour reproduire:

  1. Ajoutez MeshInstance à la scène, attribuez une sphère et attribuez-lui un nouveau ShaderMaterial.
  2. Mettez le shader ci-dessus et observez les résultats.

Projet de reproduction minimale:

shadernanbug.zip

bug core rendering

Commentaire le plus utile

Merci pour le rapport de bogue reproductible. J'ai créé une pull request qui devrait corriger ce bogue.

Je voulais juste vous faire savoir que votre code shader ne se compilera pas même avec le correctif car isnan (vec2) renvoie un booléen vec2. Votre code se compilerait si vous spécifiiez quel élément du vec2 vous souhaitez vérifier. Par example:

shader_type spatial;

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

>Tous les commentaires

Merci pour le rapport de bogue reproductible. J'ai créé une pull request qui devrait corriger ce bogue.

Je voulais juste vous faire savoir que votre code shader ne se compilera pas même avec le correctif car isnan (vec2) renvoie un booléen vec2. Votre code se compilerait si vous spécifiiez quel élément du vec2 vous souhaitez vérifier. Par example:

shader_type spatial;

void fragment()
{
    ALBEDO = isnan(vec2(0,0)).x ? vec3(1.0) : vec3(0.0);
}
Cette page vous a été utile?
0 / 5 - 0 notes