计算光线反射的reflect向量

1、首先需要知道的是,特征尺寸较大,光线可以当作成直线。

2、如图所示,已知入射光线向量I,法向N,那么需要求的包括交点o以及反射光线向量R.

3、假设o点要经过求得了,那么:

OR=IR-IO=2*IP-IO;

又IP=IO+OP;

所以OR=IO+2*OP

即只需要求出OP就可以求出OR.

4、求OP,显然OP为IO在ON方向的投影的负方向。

首先获得N的单位法向量:n=N/|N|

OP=|OP|n

|OP|=|OI|cosθ

cosθ=OI.n/|OI|

|OP|=OI.n=-IO.n

5、所以求出OR.

OR=IO+2*OP=IO+2*|OP|n=IO-2*(IO.n)*n

6、对反射向量进行单位化:

OR_unit=OR/|OR|

7、测试一下,效果如下。

 

 

 

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在Shader中,直射光通常需要以下几个步骤来计算: 1. 计算光线方向 由于直射光是一种只有方向属性的光源,因此在计算光照时需要先计算光线方向。假设直射光的方向为 `lightDir`,则光线方向可以表示为: ``` vec3 lightDir = normalize(-lightDirection); ``` 其中 `lightDirection` 是直射光的方向属性,取相反数是因为我们通常使用光线的方向矢量指向光源。 2. 计算反射光照 在计算反射光照时,我们同样需要使用光线方向和线向量计算光线在表面上的投影,并根据投影的大小来计算光照强度。假设当前像素的线向量为 `normal`,漫反射光照强度为 `diffuse`,则漫反射光照的计算公式为: ``` float diff = max(dot(normal, lightDir), 0.0); vec3 diffuse = diff * lightColor; ``` 其中 `lightColor` 是直射光的颜色属性,`max(dot(normal, lightDir), 0.0)` 表示光线在表面上的投影大小。 3. 计算镜面反射光照 如果需要计算镜面反射光照,则可以使用反射向量和视线向量计算镜面反射光照的强度。假设当前像素的反射向量为 `reflectDir`,视线向量为 `viewDir`,镜面反射光照强度为 `specular`,则镜面反射光照的计算公式为: ``` vec3 reflectDir = reflect(-lightDir, normal); float spec = pow(max(dot(viewDir, reflectDir), 0.0), shininess); vec3 specular = spec * lightColor; ``` 其中 `shininess` 是一个用户定义的常量,用于控制镜面反射光照的大小,`reflect(-lightDir, normal)` 表示光线在表面上的反射向量。最终,我们可以将漫反射光照和镜面反射光照的强度相加,得到直射光对当前像素的光照贡献。需要注意的是,直射光没有距离衰减的效果,因此通常情况下直射光的光照强度会比点光源要强。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值