【OptiX】第3个示例,phong光照模型

版权声明:本博客所有文章均为原创,转载请注明出处。 https://blog.csdn.net/FreeSouthS/article/details/89791319

【简介与代码下载】

本示例在上一节:【OptiX】第2个示例 添加实时计算几何体以及计算法线等属性的基础上,对球体计算phong模型。

链接:https://pan.baidu.com/s/19xkXILS8PgAMpgsepEhkJA 
提取码:rg5y 


下载解压后,请使用VS2015打开工程,并把当前配置调整为Debug和x64。另需要在默认路径安装OptiX6.0与CUDA10.0,可以参考我的这篇博文:【Optix】Optix介绍与示例编译

运行结果如下:

【phong光照原理与实现】

无论哪本教科书,只要讲到光照模型,都会介绍到phong光照,它是第一个简单的又有影响力的在图形学界提出的光照模型。它实现简单,非常易懂。我们首先来看代码,基于代码我们再来解释。

RT_PROGRAM void closest_hit_radiance()
{
    //求出当前交点
    float3 hit_point = ray.origin + t_hit * ray.direction;

    //全局光乘以其系数,Ka是全局光调节系数
    float3 result = Ka * ambient_light_color;

    //计算光线
    unsigned int num_lights = lights.size();
    for (int i = 0; i < num_lights; i++)
    {
        BasicLight light = lights[i];
        //从交点指向光源的向量
        float3 L = optix::normalize(light.pos - hit_point);
        //光线向量L在交点法线上的投影长度
        float nDl = optix::dot(geometric_normal, L);
        
        //若>0则说明夹角在[-90, 90]之间,就有光照效果,否则光照不过去
        if (nDl > 0)
        {
            float3 Lc = light.color;
            //Kd是方向光源光调节变量
            result += Kd * nDl * Lc;

            //根据光线与视线的夹角计算出因子nDh
            float3 H = optix::normalize(L - ray.direction);
            float nDh = optix::dot(geometric_normal, H);
            //则夹角在[-90, 90]镜面效果可以入眼反射光源形成亮斑
            if (nDh > 0)
            {
                float power = pow(nDh, phong_exp);
                //镜面光power以及其缩放因子Ks
                result += Ks * power * Lc;
            }
        }
    }

    prd.result = result;
}

首先我们来看一张图:

首先我们要计算result,而result由全局光照ambient_light_color和其系数Ka(代表任何地方,任何角落都有这个光,和法线无关),方向光(分为漫反射光和镜面光),漫反射光主要由其系数Kd,光源与交点的向量L在法线方向上的投影长度nDl来决定,假如nDl<0说明在背面,只有在[-90, 90]之间的光线才能形成漫射光。

扫描二维码关注公众号,回复: 6112142 查看本文章

而镜面光是指光源经过交叉点反射入观察者的眼睛形成光斑的效果,它与镜面光系数Ks, 与光源与视线差向量在法线方向上的投影长度nDh相关,同样假若nDh<0,则光源是不入眼的,形成不了镜面光斑。还有计算镜面光的缩放参数phong_exp。

全局光+方向光源的漫反射+方向光源的镜面反射=phong光照效果

猜你喜欢

转载自blog.csdn.net/FreeSouthS/article/details/89791319