热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

计算机图形学基础(五)光照1

基础就不记录了,只记录有关数学的东西彩色光源红绿蓝分量环境光ambient漫反射diffuse镜面反射specular环境光表征场景中每一处的Ia都是相同的点光源

基础就不记录了,只记录有关数学的东西

彩色光源

这里写图片描述
红绿蓝分量

环境光ambient
漫反射diffuse
镜面反射specular

环境光

这里写图片描述
表征场景中每一处的Ia都是相同的

点光源

理想的电光源向所有方面发射的光线强度都相等。
一个位于P0的点光源
这里写图片描述
点p从点光源接收到的光线强度(反比于光源到改点所在平面之间距离的平方)
这里写图片描述
这里写图片描述
仅利用点光源来照明往往会使场景的亮暗反差太大,可以看到,一些区域完全处于本影中,而另一些区域处于半影中。通过设置环境光,可以减弱由点光源照明引起的过高的对比度。
衰减因子实际应用中通常用形如
这里写图片描述
通过选择常数a,b,c的值来获得柔和的照明效果

聚光灯

这里写图片描述
限制点光源的发射光线来得到,如图,如果角度为180,就是点光源。

更逼真的是通过其发光强度在圆锥内的分布来描述,通常越接近圆锥中心,所发射光线的强度越大。通常定义为
这里写图片描述
指数e决定了随着角度增大而衰减的速度这里写图片描述
指数的影响
这里写图片描述
计算技巧:两个单位向量的点积就是它们之间角度cos的值。

远距离光源

非常远。直接看作平行光源
这里写图片描述
用一个方向向量描述。

Phong反射模型

这里写图片描述
Phong反射模型用4个向量来计算表面上任一点p的颜色值。如果表面是曲面,那么这4个向量都随着表面上位置的不同而改变。
n:表面在p点处的发向量。
v:p指向观察者(cop)的向量。
l:p指向扩展光源上任意一点的向量。
r:沿着向量l的方向入射的光线按照反射定律的出射方向。
Phong反射模型考虑了光线和材质之间的三种相互作用:环境光反射、漫反射、镜面反射。
第i个光源的表示如下
这里写图片描述
rgb表示红绿蓝
ads表示环境光分量、漫反射光分量、镜面反射光分量。
代码表示:

vec3 light_i_ambient, light_i_diffuse, light_i_specular;
//或者
vec4 light_i_ambient, light_i_diffuse, light_i_specular;

每个颜色分量在改点的反射率。
对于第i个光源的漫反射光的红色分量Lird,可以计算出一个反射率Rird,于是前者对p点处光线强度的贡献为RirdLird。
Rird的值取决于材质属性、表面的方向、光源的方向以及光源与观察者之间的距离。
这里写图片描述

第i个光源对p点处的红色的光照强度。
这里写图片描述
p点处的红色的光照强度。
这里写图片描述
某点的光照强度
这里写图片描述
代码表示:

vec4 reflect_i_ambient, reflect_i_diffuse, reflect_i_specular;

环境光反射

前面说过-所有点处的环境光强度都是相同的。
被反射的部分又环境光反射系数Ka确定,此时:
这里写图片描述
一个表面有3个环境光反射系数Kar,Kag,Kab。并且这3个反射系数可以不相同。

漫反射

这里写图片描述
理想的漫反射表面粗糙,以至向各个方向反射的光线强度都相等。有时被称为Lambert表面,可以用Lambert定律来建模。
这里写图片描述
这里写图片描述
箭头方向为光线方向。
可见Rd应该和cosθ成正比。cosθ可以通过两个单位向量的点积来求。
法向量n和光源的方向l(参考前面的Phong模型)。
这里写图片描述
漫反射系数为Kd,如下公式很好推出
这里写图片描述
上面有一个问题,如果光源在水平面以下会取负值,此时希望取0
这里写图片描述

镜面反射

高光。
这里写图片描述
这里写图片描述
观察者看到的光线强度取决于理想反射器反射光线的方向r和观察者的方向v这两者之间的夹角。公式如下:
这里写图片描述
系数Ks大于等于0小于等于1,表示入射的镜面反射光中有多大一部分被反射。指数α是高光系数。
这里写图片描述
无限大的α对应于镜子,在100~500之间的α对应大多数金属的表面,小于100的对应于高光区域比较大的材质。下列公式中rv代表的意思参照Phong模型。

这里写图片描述
包含衰减因子的Phong模型可以用下列来表示
这里写图片描述

改进的Phong模型

这里写图片描述
这里写图片描述
和Phong模型相比多了一个h,h就是l和v的中间向量,并且是一个单位向量(全部都是单位向量,为了方便运算)。
把Ψ称为半角,h称为半角向量。
一个简单的证明可以得到2Ψ=Φ
如果把rv替换成nh,就无需计算r。半角Ψ比Φ小,为了减小对明暗绘制带来的影响,改变指数使之更接近rv的e次方。至于在什么情况下计算量会减少,这里先不解释了(先记录基础)。
这也被称为Blinn-Phong模型。
下列使用改进的Phong模型绘制的一组Utah茶壶
这里写图片描述

计算向量

基本数学知识,只写个大概
(1)法向量
1、不共线的三个点,它们分成2个向量的叉积确定法向量,注意叉积中的顺序确定方向。
2、梯度向量,高数那门课最开始的,对x、y、z求导。
3、参数形式,同样求导。
在OpenGL中,通常把法向量设置为顶点的属性

typedef normal vec4;
normal n = vec4(nx, ny, nz, 0.0);

反射角

下图字母代表的具体意思看前面的Phong模型,这里直接写推导。
这里写图片描述
αβ
r=αl+βn
nr=αln+β=ln
1=rr=α平方+2αβln+β平方
然后得到r=2(ln)n-1
我推了好久都没推出来。。。看图推得话很快就能推出来。

下面都只是简单介绍

递归生成球面

从一个四面体,取每条边中点,中点归一化,递归。
然后就出来个单位球了。拓展半径r的球很简单,归一化改成归r化。
注意逆时针方向朝外。
这里写图片描述

光源

代码如下,很好理解,前面说过很多了

color4 light_diffuse, light_specular, light_ambient;
//点光源,用齐次坐标表示,最后一个是1
point4 light_position = vec4(1.0, 2.0, 3.0, 1.0);
//远距离光源,最后一个是0
point4 light_position = vec4(1.0, 2.0, 3.0, 0.0);
//衰减模型前面已经说过了,包括常数项、线性项和二次项
float attenuation_constant, attenuation_linear, attenuation_quadratic;
\\其他光源通过设置相应项,可以把点光源转换到目的光源,前面已经解释过。

材质

//假定对象表面是不透明的,通过指定三个颜色对象来指定3个系数。
color4 ambient = color4(0.2, 0.2, 0.2, 1.0);
color4 diffuse = color4(1.0, 0.8, 0.0, 1.0);
color4 specular = color4(1.0, 1.0, 1.0, 1.0);
//镜面反射还需要指定高光系数
float shininess;
//如果对象表面的正面和背面具有不同的反射属性
color4 back_ambient, back_diffuse, back_specular;
//自发光(任何光源都不会影响自己的发光分量,自己的发光分量也不会影响任何其他的表面)
//只是为表面增加了一个固定的颜色值
color4 emission = color4(0.0, 0.3, 0.3, 1.0);

可以通过定义结构体或者类来定义材质

typedef struct materialStruct{
color4 ambient;
color4 diffuse;
color4 specular;
color4 emission;
float shininess;
}materialStruct;
//可以通过指针来访问这些属性
currentMaterial = &brassMaterials;

推荐阅读
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 尽管某些细分市场如WAN优化表现不佳,但全球运营商路由器和交换机市场持续增长。根据最新研究,该市场预计在2023年达到202亿美元的规模。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • andr ... [详细]
author-avatar
看破红尘红尘看破_728
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有