Godot: isnan () no código de sombreador quebra o sombreador quando um não flutuante é passado para ele

Criado em 26 mai. 2018  ·  1Comentário  ·  Fonte: godotengine/godot

Versão Godot:
3.0.2 Mono

Sistema operacional / dispositivo incluindo versão:
KDE Neon
GTX 1060

Descrição do problema:
em um sombreador, você pode usar isnan() para verificar se um float é NaN. No entanto, se você passar qualquer coisa que não seja um float para ele (como um inteiro, vetor, matriz, etc), ele quebra o sombreador, mas não dá uma mensagem de erro no editor. No entanto, você recebe muito spam de erro quando o jogo é executado:

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

Por exemplo, tente este shader:

shader_type spatial;

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

Eu o atribuí a uma esfera aqui, como você pode ver, a esfera fica estranhamente esticada e é desenhada no espaço da tela:
bug

Passos para reproduzir:

  1. Adicione MeshInstance à cena, atribua esfera e atribua um novo ShaderMaterial a ela.
  2. Coloque o sombreador acima nele e observe os resultados.

Projeto de reprodução mínima:

shadernanbug.zip

bug core rendering

Comentários muito úteis

Obrigado pelo relatório de bug reproduzível. Eu criei uma solicitação de pull que deve corrigir esse bug.

Eu só queria que você soubesse que seu código de sombreador não compilará mesmo com a correção porque isnan (vec2) retorna um vec2 booleano. Seu código seria compilado se você especificasse qual elemento do vec2 você deseja verificar. Por exemplo:

shader_type spatial;

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

>Todos os comentários

Obrigado pelo relatório de bug reproduzível. Eu criei uma solicitação de pull que deve corrigir esse bug.

Eu só queria que você soubesse que seu código de sombreador não compilará mesmo com a correção porque isnan (vec2) retorna um vec2 booleano. Seu código seria compilado se você especificasse qual elemento do vec2 você deseja verificar. Por exemplo:

shader_type spatial;

void fragment()
{
    ALBEDO = isnan(vec2(0,0)).x ? vec3(1.0) : vec3(0.0);
}
Esta página foi útil?
0 / 5 - 0 avaliações