为什么 GLSL 日志返回错误结果?(英特尔驱动程序)

chr*_*989 1 opengl math driver glsl

我正在 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;
}
Run Code Online (Sandbox Code Playgroud)

我想知道这里有什么意义吗?我已将返回的结果添加到 Excel 中并绘制了图表。起初它几乎就像是正确值的两倍,但它不是那么干净,它变得越来越远。

除了驱动问题还有其他解释吗?我想不出还有什么要检查的!

如果是这样,除了重构我的代码以在 CPU 上执行此操作之外,我该如何解决它?为什么我在网上找不到证据来支持这一点?我完全困惑了!

我在笔记本电脑上运行:(Intel(R) HD Graphics 4000 with 132 ext.)

ps Sqrt 很好,我得到了我期望的值。pps我查了一下,我没有意外创建一个名为“log”的函数

在此输入图像描述 在此输入图像描述

rat*_*eak 5

我相信您被用于原木的底座绊倒了。在 Excel 中,基数为 10,但在 glsl 中,基数为 e。

为了获得正确的结果,您应该将结果除以所需底数的对数。

value = log(value)/log(10);
Run Code Online (Sandbox Code Playgroud)

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