先来几个概念:

  • 环境光(Ambient Light): 从物体表面所产生的反射光的统一照明,称为环境光
    或背景光。环境光没有空间和方向性,在所有方向上和所有物体表面上投射的环境光强度是统一的恒定值。

  • 平行光:即光线都从同一个方向照射。

  • 漫反射:英文是diffuse reflection,不用解释了。

  • Lambert反射体:即理想漫反射体,产生光的漫反射现象的物体表面。
    Iambdiff=kdIaI_{ambdiff}=k_{d}I_{a} 用以求某点处漫反射的光强。
    其中IaI_{a}表示环境光强度(简称光强),kd(0<kd<1)k_{d}(0为材质对环境光的反射系数。I——ambdiffI——{ambdiff}是漫反射体与环境光交互反射的光强。

  • Lambert漫反射模型:
    Ildiff=kdIlcosθI_{ldiff}=k_{d}I_{l}\cos\theta
    IlI_{l}是点光源强度,θ\theta是入射光方向与顶点法线的夹角(0≤θ≤90∘0\leq\theta\leq90^{\circ}),IldiffI_{ldiff}是漫反射体与方向光交互反射的光强。
    因为cosθ\cos\theta等于顶点单位法向量和从顶点指向光源的单位向量的点积,故Ildiff=kdIl(N∙L)I_{ldiff}=k_{d}I_{l}(N•L),N为顶点单位法向量,L为顶点指向光源的单位向量。

综合考虑环境光和方向,Lambert光照模型可以写成:
Idiff=Iambdiff+Ildiff=kdIa+kdIl(N∙L)I_{diff}= I_{ambdiff} + I_{ldiff} = k_{d}I_{a} + k_{d}I_{l}(N•L)

漫反射光照模型顶点着色程序:

void main_v(float4 position : Position,float4 normal : NORMAL,out float4 oPosition : POSITION,out float4 color : COLOR,uniform float4*4 modelViewProj,uniform float4*4 worldMatrix,uniform float4*4 worldMatrix_IT,uniform float3 globalAmbient,uniform float3 lightPosition,uniform float3 lightColor,uniform float3 Kd)
{oPostion = mul(modelViewProj,postion);//mul:计算两个矩阵相乘float3 worldPos = mul(worldMatrix, position).xyz;float3 N = mul(worldMatrix_IT,normal).xyz;N = normalize(N);//计算入射光方向float3 L = lightPosition - worldPos;L = normalize(L);//计算方向光漫反射光强float3 diffuseColor = Kd*lightColor*max(dot(N,L),0);color.xyz = diffuseColor + ambientColor;color.w = 1;
}

漫反射光照模型顶点着色程序

struct VertextIn
{float4 position : Position;float4 normal : NORMAL;
};
struct VertexScreen
{float4 oPosition : POSITION;float4 color : COLOR;
};
void main_v(VertexScreen posOut,uniform float4*4 modelViewPorj,uniform float4*4 worldMatrix,uniform float4*4 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;posOut.color.w = 1;
}

《GPU编程与CG语言之阳春白雪下里巴人》 读书笔记3 漫反射与Lambert光照模型相关推荐

  1. GPU编程与CG语言之阳春白雪下里巴人 读书笔记

    CHPT2 GPU图形绘制管线 本章作者对GPU图形渲染管线做了深入浅出的总结概括. 所谓渲染管线即图形是如何从三维空间变换到我们二维的屏幕上的.具体的过程可以分为如下几步: 几何阶段   主要工作是 ...

  2. 计算机图形学绘制多边形代码_《GPU编程与CG语言之阳春白雪下里巴人》- 第二章(GPU 图形绘制管线)...

    第二章 GPU 图形绘制管线 万事开头难,每门科学都是如此. ------ 马克思 图形绘制管线描述 GPU 渲染流程,即"给定视点.三维物体.光源.照明模式,和纹理等元素,如何绘制一幅二维 ...

  3. 学习笔记-《GPU 编程与CG 语言之阳春白雪下里巴人》

    第一章 绪论 1.1 Programmable Graphics Processing Unit 发展历程 Programmable Graphics Processing Unit( GPU),即可 ...

  4. GPU 编程与CG 语言之阳春白雪下里巴人——CG学习读书笔记之数学函数(之一)。

    1.abs(x) 取得输入参数的绝对值. 2.acos(x) 反余切函数,为cos(x)的反函数,原来得到Y作为输入,的到对应的角度. (其实只要记得作用是:得到角度,值域为[0,π],输入范围为[- ...

  5. 《Python神经网络编程(Make Your Own Neural Network)》读书笔记

    声明 这是作者在CSDN上的第二篇博客,关于阅读塔里克·拉希德的著作<Python神经网络编程(Make Your Own Neural Network)>之后的读书笔记.跟诸位大牛相比, ...

  6. 《Python编程 从入门到实践》简单读书笔记

    目录 第2章 变量和简单数据类型 第3章 列表简介 第4章 操作列表 第5章 if语句 第6章 字典 第7章 用户输入和while循环 第8章 函数 第9章 类 第10章 文件和异常 第11章 测试代 ...

  7. 《JavaScript语言精粹 修订版》 读书笔记

    之前看到这篇文章, 前端网老姚浅谈:怎么学JavaScript?,说到怎么学习JavaScript,那就是 看书.分析源码. 10本书读2遍的好处,应该大于一本书读20遍. 看书主动学习,看视频是被动 ...

  8. 超级宝典编程指南(红蓝宝书)-读书笔记

    学习中and持续更新中-- 超级宝典= 客户端:指我们需要执行,存储在CPU中的指令(OpenGLAPI,C和C++代码),客户端会把渲染命令发送给服务器执行. 服务器:接收客户端的指令后调用GPU芯 ...

  9. 《Linux多线程服务端编程——使用muduo C++网络库》读书笔记

    第一章 线程安全的对象生命期管理 第二章 线程同步精要 第三章 多线程服务器的适用场合与常用编程模型 第四章 C++多线程系统编程精要 1.(P84)11个常用的最基本Pthreads函数: 2个:线 ...

  10. python编程入门到实践笔记-python基础(《Python编程:从入门到实践》读书笔记)...

    注: 本文的大部分代码示例来自书籍<Python编程:从入门到实践>. 一.变量: 命名: (1)变量名只能包含字母.数字和下划线.变量名可以字母或下划线打头,但不能以数字打头 (2)变量 ...

最新文章

  1. 部分样式在360和ie上不能显示_Adobe Photoshop添加图层样式全方面介绍
  2. netty服务器定时发送消息,netty+websocket+quartz实现消息定时推送
  3. Windows Subsystem for Linux (WSL)简单尝试
  4. ae中心点重置工具_(精品)AE从小白到大神之路(七)-AE动画—动效常见的设计方法...
  5. 王思聪旗下公司破产拍卖:13.8万成交、溢价超100倍
  6. 英特尔玩VR有多认真?看看Project Alloy的细节就知道了
  7. 1121. Damn Single (25)-PAT甲级真题
  8. FTP服务学习笔记之基于MySQL+PAM的vsftpd虚拟用户
  9. python 中主线程结束 子线程还在运行么_Python爬虫进阶(二)爬虫之多任务模块(Ⅰ)...
  10. wxParse空格解析不生效的解决方案
  11. 鸿合一体机触屏没反应怎么办_一体机屏幕触摸不准的原因以及解决方法
  12. sklearn实战之决策树
  13. 盖茨再捐200亿美元,谷歌云转投ARM,推特员工因马斯克遭CEO警告,今日更多大新闻在此...
  14. linux系统服务器日志,linux系统日志及日志服务器
  15. IT大四考研还是就业?2022考研内卷有多严重
  16. 查看ubuntu系统的版本详细信息
  17. Android-加速传感器或者OrientationEventListener做横竖屏切换
  18. antDesignPro线上刷新404 和 liunx部署使用mock数据 umi-serve + pm2
  19. Android解决部分手机拍照照片自动旋转的问题
  20. LED有哪些优点,LED驱动电源方案

热门文章

  1. php pcntl_alarm,pcntl_alarm定时闹钟信号详解
  2. linux ARM64 中断底层处理代码分析
  3. 深入理解DNS(域名系统)
  4. mybatis 插入insert对象
  5. 学好Linux运维决心书
  6. 执行throw后 后面代码还会执行吗?
  7. 天下极品女人-----海上闻人
  8. 网站项目计划书模板范本
  9. jupyterLab增大字体大小
  10. iOS frame与bounds区别详解