热门标签 | 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;

推荐阅读
  • 视觉Transformer综述
    本文综述了视觉Transformer在计算机视觉领域的应用,从原始Transformer出发,详细介绍了其在图像分类、目标检测和图像分割等任务中的最新进展。文章不仅涵盖了基础的Transformer架构,还深入探讨了各类增强版Transformer模型的设计思路和技术细节。 ... [详细]
  • 本文详细介绍了Socket在Linux内核中的实现机制,包括基本的Socket结构、协议操作集以及不同协议下的具体实现。通过这些内容,读者可以更好地理解Socket的工作原理。 ... [详细]
  • 来自FallDream的博客,未经允许,请勿转载,谢谢。一天一套noi简直了.昨天勉强做完了noi2011今天教练又丢出来一套noi ... [详细]
  • 题面:P3178[HAOI2015]树上操作好像其他人都嫌这道题太容易了懒得讲,好吧那我讲。题解:第一个操作和第二个操作本质上是一样的&# ... [详细]
  • 本文详细介绍了如何在PHP中使用Memcached进行数据缓存,包括服务器连接、数据操作、高级功能等。 ... [详细]
  • 本文探讨了如何选择一个合适的序列化版本ID(serialVersionUID),包括使用生成器还是简单的整数,以及在不同情况下应如何处理序列化版本ID。 ... [详细]
  • 本文详细探讨了Java中HashMap类的hash()方法的工作原理及其重要性,特别是在JDK 7版本中的实现。 ... [详细]
  • 本文探讨了一个Web工程项目的需求,即允许用户随时添加定时任务,并通过Quartz框架实现这些任务的自动化调度。文章将介绍如何设计任务表以存储任务信息和执行周期,以及如何通过一个定期扫描机制自动识别并加载新任务到调度系统中。 ... [详细]
  • This article explores the process of integrating Promises into Ext Ajax calls for a more functional programming approach, along with detailed steps on testing these asynchronous operations. ... [详细]
  • 探索CNN的可视化技术
    神经网络的可视化在理论学习与实践应用中扮演着至关重要的角色。本文深入探讨了三种有效的CNN(卷积神经网络)可视化方法,旨在帮助读者更好地理解和优化模型。 ... [详细]
  • 探讨多种方法来确定Java对象的实际类型,包括使用instanceof关键字、getClass()方法等。 ... [详细]
  • 本文介绍了如何通过安装和配置php_uploadprogress扩展来实现文件上传时的进度条显示功能。通过一个简单的示例,详细解释了从安装扩展到编写具体代码的全过程。 ... [详细]
  • 在使用mybatis进行mapper.xml测试的时候发生必须为元素类型“mapper”声明属性“namespace”的错误项目目录结构UserMapper和UserMappe ... [详细]
  • D17:C#设计模式之十六观察者模式(Observer Pattern)【行为型】
    一、引言今天是2017年11月份的最后一天,也就是2017年11月30日,利用今天再写一个模式,争取下个月(也就是12月份& ... [详细]
  • Asynchronous JavaScript and XML (AJAX) 的流行很大程度上得益于 Google 在其产品如 Google Suggest 和 Google Maps 中的应用。本文将深入探讨 AJAX 在 .NET 环境下的工作原理及其实现方法。 ... [详细]
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社区 版权所有