我正在GPU上做一些数学并阅读结果。
我从日志中得到了错误的值。我已经验证了0 - 10,20,30,40的值。
如果我对该值进行硬编码(正如您在验证下看到的那样),我会得到正确的结果吐出来。但是,如果我使用带有应该返回相同结果的硬编码值的log,我会得到错误的结果spat out。
这是我在我的功能中所做的事情。
vec4 IScale(vec4 value)
{
switch(uScaleType_i)
{
case Log:
//value = log(value);
value = vec4(1,1,1,1);
value.r = log(5);
//verifiy
//value.r = 0.698970004
break;
case Sqrt:
value = sqrt(value);
break;
case None:
break;
}
return value;
}
我想知道这里有什么意义吗。我已经将我回到excel的结果添加到了一个图表中。起初,它几乎就像是正确值的两倍,但它不是那么干净,它越走越远。
除驾驶员问题外,还有其他解释吗?我想不出其他任何事情要检查!
如果是这样,我怎么可能解决它,除了重构我的代码在CPU上做?为什么我不能在网上找到证据支持这一点?我完全被困惑了!
我在笔记本电脑上运行: (Intel(R)HD Graphics 4000,132分机。)
P.S。 Sqrt很好,我得到了我期望的值。 p.p.s我检查过,我没有意外地创建了一个名为" log"
答案 0 :(得分:2)
这是the specification。 e
将返回自然对数,即对数str_replace();
的对数。不是基数10的对数。
答案 1 :(得分:2)
我相信你正在绊倒用于日志的基地。在Excel中,基数是10,但是在glsl中它是e。
要获得正确的结果,您应该将结果与所需基数的对数分开。
value = log(value)/log(10);
或者在excel中,您可以使用LN(RC[-1])