OpenGL_16_镜面反射

1,
我们在计算环境光的时候,光的强度是唯一的影响因素。然后处理漫射光的时候公式中加入了光的方向参数。
镜面反射包含了上面所有的综合因素并且添加了一个新的元素:观察者的位置。
镜面反射时光以一定角度照射到物体表面,同时会在法线的另一侧对称的角度上反射出去,如果观察者刚好在反射光线的路径上那么就会看到格外强烈的光线。

镜面反射最终的结果是物体在从某个角度看上去会十分明亮,而移动开后这个光亮又会消失。现实中好的镜面反射的例子是金属物体,这些物体有时候看上去由于太亮了导致看不到他本来的颜色而是直接照向你眼睛的白色的亮光。但这种属性在其他的一些材料上是没有的(比如:木头)。很多东西根本不会发光,不管光源从什么角度照射以及观察者在什么位置。所以,镜面反射光的存在更取决于反射物体的材料性质而不是光源本身。


'I' 是入射光
'N' 是表面法线
'R' 反射光,和入射光'I'关于法线对称,但方向相反
'V' 是从入射光和反射光交点处(入射点)到观察者眼睛的向量,表示观察者视线
'α' 反射光'R'和观察者视线'V'的夹角

我们将使用夹角'α'来对镜面反射光现象进行建模。有一点可以看出当观察者视线和反射光重合时(夹角为0),反射光的强度最大。观察者慢慢从反射光'R'移开时,夹角慢慢变大,而我们希望随着角度增大反射光要慢慢衰弱。明显,这里又要使用差积运算来计算夹角'α'的余弦值了,这个值将作为计算镜面反射光公式的反射参数。当'α'为0时余弦值为1,这是我们反射参数的最大值。随着夹角'α'增大余弦值慢慢减小,直到夹角达到90度时就彻底没有镜面反射的效果了。当然,夹角大于90度时余弦值为负,也没有任何反射效果,也就是观察者不在反射光的路径范围内。

我们要用到'R'和'V'来计算夹角'α'。'V'可以通过世界坐标系中观察者位置和光的入射点位置的差计算得到。camera已经在世界空间进行维护了,我们只需要将它的位置传给shader着色器。
另外上面的图是经过简化了的模型,光在物体表面只有一个入射点(事实上不是,这里只是为了好分析)。
事实上,整个三角形都被点亮了(假设它面向光源),因此我们要计算每一个像素的镜面反射效果(和漫反射光的计算一样)。
我们必须要知道每个像素在世界空间的位置,这个不难:可以将顶点变换到世界空间,让光栅器对像素的世界空间位置进行插值并将结果传给片段着色器。事实上,这个和之前教程中对法线的处理操作是一样的。
最后是要使用'I'向量(由应用传给shader)来计算反射光线'R'。如下图:

首先要强调向量没有起点的概念,所有方向相同且长度相同的向量都是同一个向量。
因此,图中将入射光向量'I'复制到表面下面位置向量本身是不变的。
目标是求向量'R',根据向量的加法,'R'等于'I'+'V'。

'I'是已知的,所以我们要求'V'。
注意法线'N'的反向向量为'-N', 计算'I'和'-N'的点积可以得到'I'在'-N'上的投影,这也是'V'的模长度的一半。
另外'V'和'N'的方向是相同的,所以只要用计算的那个投影长度乘以单位向量'N'再乘以2就是向量'V'了。

GLSL提供了一个叫做'reflect'的内部函数就是做的上面这个计算。可以看下面这个函数在shader中的用法。这里得出计算镜面反射的最终公式:

开始先是将光的颜色和物体表面的颜色相乘,这个和在计算环境光以及漫反射光时一样。得到的结果再和材料的镜面反射强度参数('M')相乘。如果材料没有反射性能,比如木头,那么镜面反射参数就为0,整个公式的结果也就为0了,而像金属这种发光材料镜面反射能力就会很强。之后再乘以光线和观察者视线夹角的余弦值,这也是最后一个调整镜面反射光强度的参数('镜面参数'或者叫做'发光参数')。

这三个参数都是独立于光线本身的,因为当同一束光照到不同的材料上(比如:木头和金属)时会有不同的反射发光效果。
目前对材料属性的使用模型还是很局限的,同一个绘制回调的所有三角形会得到这些属性的一样的值。如果同一个模型的不同部分的三角形图元是不同的材料,这样就不合理了。在后面的教程中讲关于mesh网格的加载时我们会在一个模块中产生不同的镜面参数值并作为顶点缓冲器的一部分(而不是shader的一个参数),这样我们就可以在同一个绘制回调中使用不同的镜面光照参数来处理三角形图元。

2,

上面顶点着色器多了最后一行代码,世界变换矩阵(之前用来变换法线的那个世界变换矩阵)这里用来将顶点的世界坐标传给片段着色器。






转载于:https://www.cnblogs.com/liuhan333/p/6612960.html

1 课程简介:本课程详细讲解了OpenGL从入门到精通的理论+实践知识,对于每一个知识点都会带领学员通过代码来实现功能。其中涵盖了基础图元绘制,基础光照,高级过程,高级光照等内容;当前图形引擎的应用已经越来越广泛,春晚以及各大综艺节目已经开始使用XR作为主流的内容制作技术,房地产漫游及Web渲染技术已经开始茁壮发展,VR也即将突破硬件瓶颈;普遍的游戏引擎在独特的领域已经无法完全实用,且我们国家要发展自主科技技术,图形引擎以及CAD等卡脖子技术一定会蓬勃发展,所以同学们要抓住机会,趁势而上,熟悉底层,博取更大发展,学习OpenGL底层接口的应用以及图形学算法,将是您向纵深发展的第一步!2 课程解决优势:很多同学学习OpenGL最难的是找到路径,并且其中牵扯到的理论知识点无法完全理解透彻(比如VAO与VBO的区别,MVP矩阵变换的推导及原理,光照系统的设计及算法推导,帧缓存的灵活应用等),我们的课程可以带领大家从原理+实践的角度进行学习,每一个知识点都会:a 推导基础公式及原理 b 一行一行进行代码实践从而能够保证每位同学都学有所得,能够看得懂,学得会,用得上,并且能够培养自主研究的能力。学习课程所得:学习本课程完毕之后,学员可以全方位的完全了解OpenGL当中的必要接口,并且可以对图形学的基础知识融会贯通,可以制作中级的特效。并且对于UnrealEngine以及Unity3D的学习更加轻松,对于各类商业引擎当中的算法以及内容制作手法更加深刻理解把控。学员也可以自行进行图形引擎的设计以及研究,并且将本课程的知识点进行代码模块化编写;能够自主推导图形学管线以及应用当中的各类公式,并且理解其几何含义。 代码与PPT资源,已随课程附赠,请同学们对应课程下载 
欢迎来到OpenGL系列教程之《OpenGL进阶》的OSX版。由于OpenGL的发展历史比较久远,因此给萌新们带来了不小的入门门槛,没有理清头绪一头扎进OpenGL里面进行学习的萌新们,可能很难理清头绪。不过不用怕,跟着我们的OpenGL系列教程一起学习,你将由浅入深的逐步掌握OpenGL的精髓,我们为萌新准备的是一套成体系的知识系统,而不是凌乱的知识碎片。你将在我们这里把OpenGL学的清清楚楚,明明白白。无论你是小白学生、还是职场员工,都可以跟着我们的教程,一步一个脚印把整个图形学领域的知识学个痛快。在正式进入学习之前,我们需要提醒同学们注意下面这些点。比起一般的教程,我们这里会让你掌握整个图形学硬件API的全貌。在学习OpenGL进阶课程之前,我们期望你最好是已经掌握了我们的OpenGL入门课程,因为在入门课程中我们会为你构建足够多的知识框架来帮助你更好的理解OpenGL进阶这边的知识点。OpenGL是一个直接与GPU接触的API,这种方便硬件操作,而且还是面向图形学编程的语言,当之无愧的要选C++。你不必担心的是,我们并不使用花里胡哨的C++语法,我们使用最基本的C With Class的编程风格,来保证程序的可移植性和可阅读性。如果你是来自其他行业的程序员,你觉得学起来难,纯粹是因为你的编程思路还是单线程的思路,算你厉害,你是个多线程思路那又如何。我们图形学编程里的程序是几百几千个线程同时运行的。怕不怕?如果你是完全没什么头绪的程序员,你的最好策略是,先把所有的视频浏览一遍,把随堂代码都拖出来编译运行一次,看看都是些什么东西。然后再第二遍精读课程。图形学编程更多的是硬件操作和数学,编程语言只是个工具和皮毛。没有高层语言那么多API让你用。如果存在,那么一定是某个个人提供的,OpenGL的API是由显卡驱动直接提供,也就是说,是显卡的硬件生产者提供了OpenGL的API,如果你的显卡是GTX1060,那么他的OpenGLAPI就是由nVidia提供的。如果你用的是Intel的集成显卡HD4600,那么他的OpenGLAPI就是由Intel提供的。如果是移动端比如Mali的GPU,那么它的OpenGLES的API就是由arm实现的。而硬件厂商提供的都是标准的C语言API,所以高层语言是不存在OpenGL的API的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值