Godot: isnan () dalam kode shader memecah shader ketika non-float dilewatkan ke dalamnya

Dibuat pada 26 Mei 2018  ·  1Komentar  ·  Sumber: godotengine/godot

Versi Godot:
3.0.2 Mono

OS / perangkat termasuk versi:
KDE Neon
GTX 1060

Deskripsi masalah:
di shader Anda dapat menggunakan isnan() untuk memeriksa apakah float adalah NaN. Namun, jika Anda meneruskan apa pun yang bukan float ke dalamnya (seperti integer, vektor, matriks, dll), shader akan rusak, namun tidak memberikan pesan kesalahan di editor. Anda memang mendapatkan banyak spam kesalahan saat permainan berjalan, meskipun:

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

Misalnya coba shader ini:

shader_type spatial;

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

Saya telah menugaskannya pada sebuah bola di sini, seperti yang Anda lihat, bola tersebut menjadi meregang secara aneh dan digambar di ruang layar:
bug

Langkah-langkah untuk mereproduksi:

  1. Tambahkan MeshInstance ke scene, tetapkan sphere, dan tetapkan ShaderMaterial baru ke situ.
  2. Masukkan shader di atasnya ke dalamnya dan amati hasilnya.

Proyek reproduksi minimal:

shadernanbug.zip

bug core rendering

Komentar yang paling membantu

Terima kasih atas laporan bug yang dapat direproduksi. Saya telah membuat permintaan tarik yang seharusnya memperbaiki bug ini.

Saya hanya ingin memberi tahu Anda bahwa kode shader Anda tidak akan dapat dikompilasi bahkan dengan perbaikan karena isnan (vec2) mengembalikan boolean vec2. Kode Anda akan dikompilasi jika Anda menentukan elemen vec2 mana yang ingin Anda periksa. Sebagai contoh:

shader_type spatial;

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

>Semua komentar

Terima kasih atas laporan bug yang dapat direproduksi. Saya telah membuat permintaan tarik yang seharusnya memperbaiki bug ini.

Saya hanya ingin memberi tahu Anda bahwa kode shader Anda tidak akan dapat dikompilasi bahkan dengan perbaikan karena isnan (vec2) mengembalikan boolean vec2. Kode Anda akan dikompilasi jika Anda menentukan elemen vec2 mana yang ingin Anda periksa. Sebagai contoh:

shader_type spatial;

void fragment()
{
    ALBEDO = isnan(vec2(0,0)).x ? vec3(1.0) : vec3(0.0);
}
Apakah halaman ini membantu?
0 / 5 - 0 peringkat