首页 文章

为什么GLSL日志返回错误的结果? (Intel驱动程序)

提问于
浏览
0

我正在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”的函数

enter image description here

enter image description here

2 回答

  • 2

    我相信你正在绊倒用于日志的基地 . 在Excel中,基数是10,但是在glsl中它是e .

    要获得正确的结果,您应该将结果与所需基数的日志分开 .

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

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

  • 2

    这是the specification . log() 将返回自然对数,即对数 e 的对数 . 不是基数10的对数 .

相关问题