Games101-Chapter8-Shading2(镜面反射,环境光,着色频率,渲染管线)

上节课提到了Diffuse

【Specular Term】

看半程向量是否和法线方向接近

指数p:(加这个指数是为了离得非常近才看成是高光)

【Ambient Term】

环境光与l,v,n等都没有关系,它是一个常数(这里是简化和假设)

【SUM UP-布林冯反射模型】

 【Shading Frequencies 着色频率】

逐三角形 ——着色应用在面上,用面的法线计算,然后每一个像素都是这个面的信息

 

逐顶点 (Shader就叫顶点着色器)——着色应用在顶点上,用顶点的法线算出顶点的颜色,然后面内部像素的颜色用顶点的颜色进行插值的方法得出

 

逐像素 (Shader叫片元着色器)——着色应用在每个像素上,同样是求面的顶点法线,然后面内部的每个像素的法线用插值的方法得出,再计算每个像素的颜色

 

Flat shading 是最简单的着色模型,每个多边形只会呈现一个颜色,这个颜色由面法向量和光照计算得来。在该模型中,每个多边形中只有多边形的面存在法向量,而其各个顶点没有。

Phong shading 是三者之中最复杂的着色方法。它的特点是结合了多边形物体表面反射光的亮度,并以特定位置的表面法线作为像素参考值,以插值方式来估计其他位置像素的色值。在这种情况下,多边形中每个顶点都有一个法向量,通过这些法向量与光照计算,来得到每个点的颜色。在使用有限数量的多边形时,对定点法向量进行插值可以给出近似平滑的曲面效果,但是这样一来的计算量肯定是非常大的。

Gouraud shading 是三者中比较折衷的方法。类似 Phong shading,其多边形的每个顶点都有一个法向量,但它在着色时不是对向量进行插值。实际使用时,通常先计算多边形每个顶点的光照,再通过双线性插值计算三角形区域中其它像素的颜色。

第一种着色模型比较直观非常好理解,相比之下,后两个方法就显得有些难理解。虽然两个方法都需要应用多边形的法向量计算出其公共顶点的法向量,也都需要计算各顶点处的光强,但在逐像素计算上还是有所区别。

Phong shading 逐像素计算的思路可以理解为从顶点着色器传递过来的法向量,只是这一个顶点的法线方向,而到了片段着色器处理的阶段,每个像素所对应的向量由其周围几个顶点进行插值后得到,之后我们再用该像素点对应的法向量与光照进行计算,得到其着色,即上述所述,我们的插值是对法向量进行插值。而 Gouraud shading 的计算逻辑,我们则可以简单的理解成是对多边形的每个顶点计算好着色,然后再使用双线性插值方法对面上的像素进行计算
 

在模型面熟少的时候,Flat都是大块面颜色,Gouraud有很强的硬边缘;Phong的高光很柔和

面多起来后,3者效果类似

 怎么算逐顶点的法线?

 一个顶点的法线是ta所关联的面的法线的加权平均

怎么算逐像素的法线?(重心插值)

【渲染管线(实时渲染)】

在这里细说一下光栅化阶段:

 

1. 图元组装(Primitive Assembly)

也叫三角形设置。上一个阶段输出的都是三角网格的顶点,即我们得到的是三角网格每条边的两个端点。但如果要得到整个三角网格对像素的覆盖情况 我们就必须计算每条边上的像素坐标。为了能够计算边界像素的坐标信息,我们就需要得到三角形边界的表示方式。这样一个计算三角网格表示数据的过程就叫做三角形设置。它的输出是为了给下一个阶段做准备。

2.三角形遍历

三角形遍历 (Triangle Traversal) 阶段将会检查每个像素是否被三角网格所覆盖。如果被覆盖的话,就会生成一个片元 (fragment) 。而这样一个找到哪些像素被三角网格覆盖的过程就是三角形遍历,这个阶段也被称为扫描变换 

三角形遍历阶段会根据上个阶段的计算结果来判断一个三角网格覆盖了哪些像素,并使用三角网格 个顶点的顶点信息对整个覆盖区域的像素进行插值

这一阶段牵扯到了抗锯齿(Anti-aliasing)操作。因为不管用什么划分片元的方法,三角形边缘部分总会显得很锐利。

除此以外,GPU还将对覆盖区域的每个像素的深度进行插值计算。

简单地说,这一步将告诉接下来的步骤,一个个三角形是怎么样覆盖每个像素的。 

 3.片元着色器(Fragment Shader)

进行到这一步时片元还不是真正意义上的像素。这是十分重要的一步,它将为每个片元计算颜色,这意味着它们很快就能被我们在屏幕上看见了。而且,是可编程着色器阶段。

片元着色器的输入是上个阶段对顶点信息插值得到的结果,而它的输出是一个或者多个颜色值。下图显示了这样一个过程

4.逐片元操作(Per-Fragment Operations)

GPU在这个阶段要做的事情:对每个片元进行操作,将它们的颜色以某种形式合并,得到最终在屏幕上像素显示的颜色。主要的工作有两个:对片元进行测试(Test)并进行合并(Merge)

在层层测试后,片元颜色就会被送到颜色缓冲区。GPU会使用双重缓冲(Double Buffering)的策略,即屏幕上显示前置缓冲(Front Buffer),而渲染好的颜色先被送入后置缓冲(Back Buffer),再替换前置缓冲,以此避免在屏幕上显示正在光栅化的图元

P.S.什么是图元,什么是片元?

 

 【Texture Mapping纹理映射——定义任何一个点的基本属性】

如何理解物体表面——任何一个三维表面都是二维的

物体的表面可以和一张图上的点有对应关系(映射)

纹理上有坐标系(uv)(uv的范围一般都是0~1)

把物体上的三角形对应到纹理上

知道三角形顶点上的uv,怎么知道三角形内部某点的uv?

--------->插值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值