中文第一计算机图形学社区OpenGPU 版权所有2007-2018

 找回密码
 注册

扫一扫,访问微社区

搜索
查看: 1608|回复: 2

请问,如何理解 LightSource 中 range 和 falloff 的含义?

[复制链接]
发表于 2017-10-29 14:44:46 | 显示全部楼层 |阅读模式
本帖最后由 shenruiyao 于 2017-10-29 14:48 编辑

在 KlayGE 的 Light.cpp 中 LightSource 定义了一个名为 range_ 的成员变量。请问 range_ 和 falloff_ 成员变量的关系是什么?该如何理解,谢谢。麻烦告知一下相关资料。

附: range_ 的赋值成员函数
        void LightSource::Range(float range)
        {
                if (range <= 0)
                {
                        const float4 RGB_TO_LUM(0.2126f, 0.7152f, 0.0722f, 0);
                        float lum = MathLib::dot(color_, RGB_TO_LUM);
                        if (MathLib::abs(falloff_.z()) < 1e-6f)
                        {
                                if (MathLib::abs(falloff_.y()) < 1e-6f)
                                {
                                        range_ = 100;
                                }
                                else
                                {
                                         // 这里是否有错误?两次重复的判断?
                                        range_ = MathLib::abs(falloff_.y()) < 1e-6f ? 1 : -(falloff_.x() - lum * 255) / falloff_.y();
                                }
                        }
                        else
                        {
                                float delta = falloff_.y() * falloff_.y() - 4 * falloff_.z() * (falloff_.x() - lum * 255);
                                range_ = delta < 0 ? 1 : (-falloff_.y() + sqrt(delta)) / (2 * falloff_.z());
                        }
                        range_ = -std::min(range_, 100.0f);
                }
                else
                {
                        range_ = range;
                }
        }


发表于 2017-11-14 09:17:20 | 显示全部楼层
range是一个光源可以影响到的最大范围。falloff是光源衰减的constant、linear、quadratic系数。这里的意思是,如果range = 0,就表示自动从falloff计算range。而这时候range止于光源亮度小于1/255。
 楼主| 发表于 2017-11-26 22:48:04 | 显示全部楼层
gongminmin 发表于 2017-11-14 09:17
range是一个光源可以影响到的最大范围。falloff是光源衰减的constant、linear、quadratic系数。这里的意思 ...

这是解二次方程,谢谢龚大。如果输入 <=0 就解方程,用负数来存储;如果 >0,就表示指定了范围,用正数来存储。
由于 constant 项一般为 1,所以有 y == 0 以及 z == 0 时设值为 1,而 range 的最高上限为 100。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|关于我们|小黑屋|Archiver|手机版|中文第一计算机图形学社区OpenGPU

GMT+8, 2018-10-17 10:05 , Processed in 0.043839 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表