Godot: isnan () en el código de sombreado rompe el sombreador cuando se le pasa un no flotante

Creado en 26 may. 2018  ·  1Comentario  ·  Fuente: godotengine/godot

Versión de Godot:
3.0.2 Mono

Sistema operativo / dispositivo incluida la versión:
KDE Neón
GTX 1060

Descripcion del problema:
en un sombreador, puede usar isnan() para verificar si un flotante es NaN. Sin embargo, si le pasa algo que no sea un flotante (como un número entero, vector, matriz, etc.), rompe el sombreador, pero no da un mensaje de error en el editor. Sin embargo, recibes una gran cantidad de spam de errores cuando se ejecuta el juego:

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

Por ejemplo, prueba este sombreador:

shader_type spatial;

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

Lo he asignado en una esfera aquí, como puede ver, la esfera se estira extrañamente y se dibuja en el espacio de la pantalla:
bug

Pasos para reproducir:

  1. Agregue MeshInstance a la escena, asigne una esfera y asígnele un nuevo ShaderMaterial.
  2. Coloque el sombreador de arriba y observe los resultados.

Proyecto de reproducción mínima:

shadernanbug.zip

bug core rendering

Comentario más útil

Gracias por el informe de errores reproducible. Creé una solicitud de extracción que debería corregir este error.

Solo quería hacerle saber que su código de sombreado no se compilará incluso con la solución porque isnan (vec2) devuelve un vec2 booleano. Su código se compilaría si especificara qué elemento del vec2 desea verificar. Por ejemplo:

shader_type spatial;

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

>Todos los comentarios

Gracias por el informe de errores reproducible. Creé una solicitud de extracción que debería corregir este error.

Solo quería hacerle saber que su código de sombreado no se compilará incluso con la solución porque isnan (vec2) devuelve un vec2 booleano. Su código se compilaría si especificara qué elemento del vec2 desea verificar. Por ejemplo:

shader_type spatial;

void fragment()
{
    ALBEDO = isnan(vec2(0,0)).x ? vec3(1.0) : vec3(0.0);
}
¿Fue útil esta página
0 / 5 - 0 calificaciones