【问题标题】:Why is GLSL log returning the wrong result? (Intel Driver)为什么 GLSL 日志返回错误的结果? (英特尔驱动程序)
【发布时间】:2016-01-22 00:24:51
【问题描述】:

我正在 GPU 上做一些数学运算并读取结果。

我从日志中得到了错误的值。我已经验证了值 0 - 10、20、30、40。

如果我对值进行硬编码(如您在下面的验证中看到的那样),我会得到正确的结果。但是,如果我将 log 与应该返回相同结果的硬编码值一起使用,我会得到错误的结果。

这是我在工作中一直在做的事情。

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.)

附言Sqrt 很好,我得到了我期望的值。 p.p.s我查了一下,我没有不小心创建了一个名为“log”的函数

【问题讨论】:

  • 我现在确实觉得很傻!希望这会帮助其他人休息一天!

标签: opengl math glsl driver


【解决方案1】:

我相信您正在绊倒用于日志的底座。在 Excel 中,基数是 10,但在 glsl 中是 e。

要获得正确的结果,您应该将结果与所需基数的对数相除。

value = log(value)/log(10);

或者在excel中你可以使用LN(RC[-1])

【讨论】:

  • 你们俩都很棒,现在世界上一切都很好!不敢相信我错过了!
【解决方案2】:

这是根据the specificationlog() 将返回自然对数,即以 e 为底的对数。不是以 10 为底的对数。

【讨论】:

  • 你们俩都很棒,现在世界上一切都很好!不敢相信我错过了!
  • ratchet 以 1 分钟的优势击败你,所以我会给他最好的答案分数,但是 +1 为规范链接,我看过它并完全错过了它!
  • 实际上,我打败了他 :p 但这不是比赛,他的解释很中肯。保持原样。感谢您的支持。 ;)
猜你喜欢
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-29
  • 1970-01-01
相关资源
最近更新 更多