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

【简介与代码下载】

本示例在上一节:【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;//根据光线与视线的夹角计算出因子nDhfloat3 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以及其缩放因子Ksresult += Ks * power * Lc;}}}prd.result = result;
}

首先我们来看一张图:

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

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

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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部