frac()函数未在unity / cg着色器中返回正确的值

时间:2015-05-23 07:01:56

标签: unity3d shader cg

我一直在使用噪声函数作为我正在使用的着色器的一部分,遇到了一些关于frac()函数我不理解的东西,特别是它返回了最初传入的数字,而不只是小数部分。

为了调试这个问题,我创建了一个非常简单的着色器:

Shader "Custom/FracTest" {
    SubShader {
        CGPROGRAM

        #pragma surface surf Lambert
        #pragma target 3.0

        #include "UnityCG.cginc"

        struct Input {
            half3 viewDir;
        };

        void surf(Input IN, inout SurfaceOutput o) {
            float4 col = 0;

            float n = 1;
            float sinn = sin(n); // ~0.84147
            float hash = sinn * 43758.5453; // ~36821.54621

            float floorHash = floor(hash); // 36821
            float fracHash = frac(hash); // should be ~0.54621

            float manualFrac = hash - floorHash;

            col.r = fracHash == hash ? 1 : 0;
            col.g = floorHash == hash ? 1 : 0;
            col.b = manualFrac == fracHash ? 1 : 0;

            o.Albedo = col.rgb;
        }

        ENDCG
    }

    Fallback "Diffuse"
}

正如你所看到的,这是一个Unity Surface着色器,但我不认为Unity在这里有错 - 从查看生成的片段着色器它没有弄乱这个位周围的任何值/数据类型码。注释中的值是我期望变量包含的内容。

当这个着色器运行时,它只是根据对函数结果的一些测试来着色整个对象。在这种情况下,我的对象显示为红色,表示fracHash值仍然等于原始hash值,floorHash不等于它,manualFrac值也是不等于fracHash值。

我无法看到我在这里做错了什么,文档声明有frac()函数的浮点变体,但我只能假设我只是在{{{{}}内部达到一些精度限制1}}函数 - 如果我使用较小的数字,它似乎会返回合理的结果。鉴于它在我手动提取分数时有效,或许我使用更高精度的数字?

任何想法 - 我在某处做了一些错误的假设,还是我只是个白痴:P?

目前我正在通过手动计算分数来进步,但我想了解我错过的内容:)

0 个答案:

没有答案