Godot: シェーダーコードのisnan()は、非フロートが渡されるとシェーダーを壊します

作成日 2018年05月26日  ·  1コメント  ·  ソース: godotengine/godot

Godotバージョン:
3.0.2モノ

バージョンを含むOS /デバイス:
KDEネオン
GTX 1060

問題の説明:
シェーダーでは、 isnan()を使用して、floatが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 評価