漫反射指的是粗糙的物体表面各个方向等强度地反射光,即等同的各个方向散射的现象

(图片源于Unity Shader 入门精要-冯乐乐著)

对于物体上的某一点,使用环境光源的情况下

A=K*I(环境光强)

其中A为漫反射物体与环境光交互反射的光强

K为漫反射物体材质的反射系数,取值范围为(0,1)

I1为环境光光强

因为环境光在物体各个点的强度相同,且没有方向因此上述Lambert公式中无需考虑光强的方向,但对于使用点光源就要考虑了

对于物体上的某一点,使用环境光源的情况下

A=K*I2*Cos(α)(点光源)

其中A为漫反射物体与环境光交互反射的光强

K为漫反射物体材质的反射系数,取值范围为(0,1)

I2为点光源光强

α为点光源向量与表面法向量的夹角

在Cg中,点光源向量为顶点指向光源的向量,并非普通情况下所指的从光源位置到顶点的向量,即:

(图片源于Unity Shader 入门精要-冯乐乐著)

如图所示,l为顶点指向光源的单位向量,n为顶点单位法向量,将向量表示为单位向量可以避免一些错误

因此A=K*I2*Cos(α)可以表示为A=K*I2*(n*l).

因为n*l=|n|*|l|*Cos(α)

而|n|=|l|=1

所以A=K*I2*Cos(α)等价于A=K*I2*(n*l)

对于|n|>1或|l|>1时

A=K*I2*Cos(α)等价于A=K*I2*(n*l)/(|n|*|l|)

对于漫反射模型来说,n,l,的数值并不是必须的,所以还是将其归一化会比较好,也可以避免一些额外的计算

因此,综合环境光和点光源计算得到最终的公式:A=K*I1+K*I2*(n*l) (n,l为单位向量)

附上源代码:

struct VertexIn
{
float4 position:POSITION;
float4 normal:NORMAL;
};
struct VertexScreen
{
float4 oPosition:POSITION;
float4 color:COLOR;
};
void main_v(
VertexIn posIn,
out VertexScreen posOut,
uniform float4x4 modelViewProj,
uniform float4x4 worldMatrix,
uniform float4x4 worldMatrix_IT,
uniform float3 globalAmbient,
uniform float3 lightPosition,
uniform float3 lightColor,
uniform float3 Kd)
{
posOut.oPosition= mul(modelViewProj,posIn.position);
float3 worldpos= mul(worldMatrix,posIn.position).xyz;
float3 N= mul(worldMatrix_IT,posIn.normal).xyz;
N= normalize(N);
float3 L=lightPosition-worldpos; //计算入射光方向
L= normalize(L); //归一化
float3 diffuseColor=Kd*lightColor* max( dot(N,L), 0); //计算方向光漫反射光强
float3 ambientColor=Kd*globalAmbient; //计算环境光漫反射光强
posOut.color.xyz=diffuseColor+ambientColor; //RGB
posOut.color.w= 1; //Alpha
}

(代码源于GPU编程+Cg语言之阳春白雪下里巴人)

漫反射与Lambert模型相关推荐

  1. Unity shader 使用 半兰伯特 (Half-Lambert)漫反射会使得模型在没有直射光的情况下漆黑一片

    问题: Unity shader 使用 半兰伯特 (Half-Lambert)漫反射会使得模型在没有直射光的情况下漆黑一片,原因不得而知. 使用半兰伯特漫反射代码如下: *************** ...

  2. 兰伯特(Lambert)模型

    漫反射,是投射在粗糙表面上的光向各个方向反射的现象.当一束平行的入射光线射到粗糙的表面时,表面会把光线向着四面八方反射,所以入射线虽然互相平行,由于各点的法线方向不一致,造成反射光线向不同的方向无规则 ...

  3. (转)光照模型及cg实现

    经典光照模型(illumination model) 物体表面光照颜色由入射光.物体材质,以及材质和光的交互规律共同决定. 由于环境光给予物体各个点的光照强度相同,且没有方向之分,所以在只有环境光的情 ...

  4. PBR:双向反射分布函数(BRDF)介绍与Cook-Torrance模型的实现

    PBR:双向反射分布函数(BRDF)介绍与Cook-Torrance模型的实现 BRDF简介 再介绍BRDF之前我们要引入渲染方程这个东西: 其中L表示辐射率,其公式为: 它表示了一个拥有辐射强度Φ的 ...

  5. mie散射理论方程_腾讯游戏学院专家:PBR渲染模型的理论及具体应用

    编者按 PBR,基于物理的渲染模型,是当前主流游戏引擎使用的真实感3D渲染模型.腾讯游戏学院专家Leonn,将和大家分享PBR的理论知识以及在Disney和UE中的典型应用. 文 | Leonn 腾讯 ...

  6. 虚幻引擎之自定义着色模型(ShadingModel)

    虚幻引擎之自定义着色模型(ShadingModel) 文章目录 虚幻引擎之自定义着色模型(ShadingModel) 一.前言 二.着色模型 2.1 材质输入 2.2 模型浅析 2.2.1 Defau ...

  7. 【技术美术图形部分】2.2 模型与材质基础

    记录之前膜拜一下这节课的大佬,才大三,我一个研二菜狗留下不学无术的泪水! May佬提到,这次课程安排的目的是给美术同学一个缓冲的空间,我的话在写这篇学习笔记就尽量加入一些自己的理解. 友情提示!才发现 ...

  8. PBR以及在Disney和UE渲染模型中的使用

    PBR,基于物理的渲染模型,是当前主流游戏引擎使用的真实感3D渲染模型,在游戏场景渲染中,它用更接近光学物理的方式,建立一个对全场景材质的大一统shader.大一统shader的好处包括:统一美术制作 ...

  9. 进阶光照与材质之光照和反射模型

    第五章讲述了一些漫反射模型和镜面反射模型的原理和数学公式 博主在unity中实现了一下,把部分结果贴在上面 有下面几个主题: 渲染公式 基本光照定义 光照和lambert法则 双向反射分布函数BRDF ...

最新文章

  1. Java学习笔记(九)--数组及Arrays类
  2. docker安装redis并设置密码
  3. bgp 建立邻居发送的报文_大型网络BGP之IBGP和EBGP邻居关系基础配置
  4. 看完这个你还不理解右值引用和移动构造 你就可以来咬我(中)
  5. 华中科技大学计算机系统结构,华中科技大学计算机系统结构复习题.pdf
  6. 一个开源的ORM框架——Light.Data
  7. Perl 连接Oracle 出现OCI missing的问题及解决
  8. 爬虫可视化点选配置工具之chrome插件简介
  9. [转]Birdfont 2.10 发布,字体编辑器
  10. PS抠发丝简单详细方法
  11. 开源.net 混淆器ConfuserEx
  12. 国内外常用的MD5在线解密网站
  13. 漫谈Anchor-based和Anchor-Free
  14. 滴滴云 远程访问jupyter
  15. 科技爱好者周刊:第 90 期
  16. Java 8 新特性 宋红康跟学
  17. Kafka教程(一)Kafka入门教程
  18. SetFocus()函数
  19. 深入分析:Onliner SpamBot7.11亿电邮账号泄露事件
  20. 最新成果展示:Ga2O3-SBD计算模型

热门文章

  1. 身份认证协议攻击怎么解决
  2. 面向对象:不要热情,不要高冷,只要37度的温暖
  3. java怎么没有jmf包_java JMF
  4. 陌上花将开,徐徐观赏
  5. 折叠屏市场起风,华为、OPPO“你追我赶”
  6. 【css技巧】CSS filter的神奇用法 | 褪色|融合效果等
  7. 蔡颖-《APS走向实践》书解读之二:需求驱动-预测、掌握、满足需求
  8. 2020年全球程序员收入出炉,国内程序员的收入也不低!北京以10万美元的薪资排名第十!
  9. Postman couldn‘t upload file
  10. 获取300套PPT模板+7天WPS会员,扫码关注领取