为什么 GLSL 日志返回错误结果? (英特尔驱动程序)
Why is GLSL log returning the wrong result? (Intel Driver)
我正在 GPU 上做一些数学运算并读取结果。
而且我从日志中得到了错误的值。我已经针对值 0 - 10、20、30、40 验证了这一点。
如果我对值进行硬编码(正如您在验证下看到的那样),我会得到正确的结果。但是,如果我使用带有应该 return 相同结果的硬编码值的日志,我会得到错误的结果。
这就是我在我的职能中一直在做的事情。
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 with 132 ext.)
p.s。 Sqrt 很好,我得到了我期望的值。
p.p.s 我查了一下,我没有不小心创建了一个函数叫 "log"
这是根据 the specification。 log()
将 return 自然对数,即以 e
为底的对数。不是以 10 为底的对数。
我相信您被用于日志的底座绊倒了。在 Excel 中基数是 10 但在 glsl 中它是 e.
要得到正确的结果,您应该将结果除以您想要的底数的对数。
value = log(value)/log(10);
或者在excel中你可以使用LN(RC[-1])
我正在 GPU 上做一些数学运算并读取结果。
而且我从日志中得到了错误的值。我已经针对值 0 - 10、20、30、40 验证了这一点。
如果我对值进行硬编码(正如您在验证下看到的那样),我会得到正确的结果。但是,如果我使用带有应该 return 相同结果的硬编码值的日志,我会得到错误的结果。
这就是我在我的职能中一直在做的事情。
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 with 132 ext.)
p.s。 Sqrt 很好,我得到了我期望的值。 p.p.s 我查了一下,我没有不小心创建了一个函数叫 "log"
这是根据 the specification。 log()
将 return 自然对数,即以 e
为底的对数。不是以 10 为底的对数。
我相信您被用于日志的底座绊倒了。在 Excel 中基数是 10 但在 glsl 中它是 e.
要得到正确的结果,您应该将结果除以您想要的底数的对数。
value = log(value)/log(10);
或者在excel中你可以使用LN(RC[-1])