我正在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上做?为什么我不能在网上找到证据支持这个?我完全被困惑了!
我在笔记本电脑上运行:(英特尔(R)HD Graphics 4000,分机132)
附: Sqrt很好,我得到了我期望的值 . p.p.s我查了一下,我没有意外地创建了一个名为“log”的函数
2 回答
我相信你正在绊倒用于日志的基地 . 在Excel中,基数是10,但是在glsl中它是e .
要获得正确的结果,您应该将结果与所需基数的日志分开 .
或者在excel中你可以使用
LN(RC[-1])
这是the specification .
log()
将返回自然对数,即对数e
的对数 . 不是基数10的对数 .