我一直在使用噪声函数作为我正在使用的着色器的一部分,遇到了一些关于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?
目前我正在通过手动计算分数来进步,但我想了解我错过的内容:)