在片元着色器中计算颜色值时,不知道何时使用乘法,何时用加法

这是我在学习unity的shader时遇到的一个疑问,一开始想不明白,觉得摸不着头绪。后来想到初中物理课上讲的光的原理,才想通,也许是我这个初步接触计算机图形学的小白牵强附会的解释,但是还是能帮助我自己理解这个东西,在这里做一些记录,各位图形学大神就当看个笑话了,欢迎在下方评论提出批评和意见

1.在用光源颜色和物体的基本颜色计算时我看到一下代码:

fixed4 baseColor = tex2D( _MainTex, i.uv );//采样贴图对应uv坐标处的颜色
baseColor = baseColor * _LightColor0 * (dot( worldNormal, worldLightDir )*0.5 + 0.5 );

可以看到这个时候使用的是乘法,用采样到的贴图的颜色和光源的颜色相乘,后面乘上的是一个一个半Lambert表达式。

2.最后在计算最终颜色返回值时高光,漫反射,环境光这三部分的颜色用的又是加法:

return fixed4( diffuse + specular + ambient, 1.0 );

想不明白为啥又有乘法又有加法,乘法和加法运算具体是什么意思呢?
后来想到了初中物理课上讲解的光的原理,才明白这里为什么有两种运算,以下是我的理解:

####加法是没有关系的颜色之间的叠加,而乘法是模拟光的照射过程。

光照射到一个物体表面时,是光的颜色和物体的颜色属性共同决定了照射后物体看起来是什么颜色。
比如物体在阳光照射下是红色,就说明这个物体吸收了红颜色以外的其他颜色的光,反射了红光。

假如物体的基本颜色为(R:1.0,G:0.3,B:0.0),这个颜色的意思是任何光照射到这个物体上,红光部分被完全返回,绿光部分被吸收70%,返回30%,蓝光部分被完全吸收。所以这个时候使用乘法来模拟光的交互过程,就是计算光源的每个色光分量有多少被这个物体返回。

而在标准光照模型里,用了四个部分来模拟自然界的光照过程:
自发光(emissive),环境光(ambient),漫反射(diffuse),高光反射(specular)
这四个部分可以说是没有关系的,相互没有影响和交互,是四个独立的部分,所以最后使用加法来进行叠加。

以上是我个人的理解,欢迎批评指正。

小伙伴加群交流,本群主要讨论Unity项目开发中的实际技术问题,欢迎有总结整理习惯的小伙伴进群交流
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值