【问题标题】:In HLSL, how do I set a float to NaN?在 HLSL 中,如何将浮点数设置为 NaN?
【发布时间】:2022-01-08 09:04:08
【问题描述】:

如果满足某些条件,我有一个返回 float3 的函数,但如果不满足这些条件,我想返回 float3(nan, nan, nan)。无穷大应该做同样的工作。

【问题讨论】:

  • 你试过 0/0 还是 sqrt(-1)?
  • 0/0 无法编译并且 sqrt(-1) 似乎无法正常工作(不过我可能使用不正确)
  • @JimmyDiddler 你找到这个问题的答案了吗?如果下面的答案有帮助,请考虑 accepting it

标签: unity3d directx hlsl


【解决方案1】:

根据浮点数上的HLSL documentation,浮点数学中的 0/0 会产生 NaN,所以你可以这样做:

float nan = 0. / 0.;

如果您使用未优化的 nan 检查器,则可以确认此方法有效:

Shader "Custom/NaNChecker" {
    Properties{
    }
    SubShader{
        Pass {
            CGPROGRAM
            #pragma vertex vert_img
            #pragma fragment frag
            #include "UnityCG.cginc"

            float IsNaN(float x) {
                return (x < 0. || x > 0. || x == 0.) ? 0. : 1.;
            }

            // Displays Red
            float4 frag(v2f_img i) : COLOR {
                return float4(IsNaN(0. / 0.), 0, 0, 1);
            }
            ENDCG
        }
    }
}

【讨论】:

    【解决方案2】:

    Unity 中的float3 没有NaN 属性。您要么需要为此建立自己的“特殊值”(不推荐),要么用另一个值包装函数的返回类型,例如:

    public struct FunctionOperationResult
    {
       public float3 Response {get; set;}
       public bool Result {get; set;}
    }
    

    如果操作失败,则将Result设置为false。

    【讨论】:

    • 这个问题是关于hlsl,而不是c#
    • @Ruzihm 核心思想将保持不变:使用带有float3bool 的结构并使用布尔值来检查它是否有效.. 可能类似于@ 987654329@
    • 我绝对可以做到这一点,但是当(至少据我理解)NaN 是标准 FP32 实现的一部分时,它看起来很笨拙。此外,尽量减少晃动的数据量会很好 - 特别是因为这是一个性能关键的功能。
    猜你喜欢
    • 2012-03-09
    • 1970-01-01
    • 2011-11-17
    • 2015-09-27
    • 1970-01-01
    • 2011-11-04
    • 2019-02-06
    • 2013-05-05
    • 2017-08-28
    相关资源
    最近更新 更多