games101学习笔记_Shading2(着色)

Shading 1回顾

Blinn - Phong 光照模型(Blinn - Phong reflectance model)包括 :

  • 漫反射
  • 镜面反射
  • 环境光
    在这里插入图片描述

上一节讲了漫反射,下面讲一下镜面反射和环境光。

镜面反射(Specular Term)

冯氏模型

高光: 当物体的表面很光滑的时候,在一定的角度范围(观察者角度z与出射角度R接近)内观察这个平滑的表面表面时,能够看到一个高光的效果。
在这里插入图片描述
如在用光源照射金属时,在一定的角度内可以看到一个有一定大小的光点,但你偏离一定的角度之后,就不能再看到这个高光效果。

在漫反射的部分已经讲过,漫反射的着色与观察方向无关,而漫反射不同,镜面反射的效果是与观察方向有关的。

当观察方向和光的反射方向越近的时候,观察到的镜面反射效果越强。

如何衡量两个上图中反射光和观察方向是否足够近?可以用反射光的方向向量和观察方向的方向向量做点乘,得到其夹角的余弦值,点乘的结果越大,则反射光和观察方向就越近。

Blinn-Phong光照模型

上面这是冯氏光照模型的做法,Blinn - Phong光照模型是对冯氏模型的一个改进,下面是Blinn - Phong的做法:

当我们观察的方向与镜面反射向量相近的时候其实就说明了法线向量和半程向量(即入射角和出射角的中间向量)接近。
在这里插入图片描述
并且我们这里并不是计算反射光和观察方向的远近,而是计算半程向量h和该平面的法向量n的远近。因为反射光和观察方向越近,半程向量和法向量也就越近,但是计算反射光的计算量比较大,而半程向量h只需要将v和l相加,再标准化即可得到。
在这里插入图片描述
最终计算某一点的高光强度的计算方法如下:
在这里插入图片描述

  • ks:镜面反射系数,不同的材质对光的反射程度不同,如金属和木头对光的反射效果就不同。
  • (I/r²):光到达着色点的能量。
  • 这里的向量n和向量h的点乘是为了判断两个向量的接近程度,如果越接近他们点乘的结果就越接近1。反射方向和高光观察方向越接近,半程向量和法向量就越接近,反之亦然。
  • 指数p:如果这里没有指数p,虽然我们也能直接使用点乘的值,但这个值过大,从而计算生成的高光面积也会变得很大,为了避免面积过大,我们采用了指数降低它的值。
    在这里插入图片描述
    所以可以用较高的指数p将高光限制在一个很小的范围内。
    在这里插入图片描述

环境光(Ambient Term)

在上一节说到,环境光就是许多光线经过多次漫反射最终打在某一点上,因为环境光的太复杂,所以直接将环境光设置为一个常数,假设任何一点接受到的都是一个相同的环境光(事实上并不是这样的,这需要运用全局光照)。

环境光不用考虑光的方向,与观察的方向也无关。
在这里插入图片描述

  • Ia:环境光,在我们的假设里是一个常数,保证没有任何一个地方完全是黑的。事实上要计算环境光要考虑到全局光照,这里暂时不考虑,看作一个常数。
  • ka:环境光系数。

Blinn-Phong光照模型例子

在这里插入图片描述
三种光照加在一起就能得到最后的Blinn-Phong光照模型。

  • L:布林冯反射项
  • La:环境光项
  • Ld:漫反射项
  • Ls:高光项

在这里插入图片描述
目前为止是考虑一个着色点上的情况,所以接下来我们会对所有的着色点做一遍以上的处理。

着色频率(Shading Frequencies)

是什么东西引起了下面三个材质球表面着色的不同?
在这里插入图片描述

  • 第一个球是以 为单位进行着色,所以会看到高光是一块亮度相等的面。
  • 第二个球是以 顶点 为单位,每一个顶点有自己的法线,就每一个顶点做一次着色,三个顶点可以形成一个三角形,三角形内部的点可以通过一种叫 插值 的方法进行平滑的过渡。
  • 第三个球以 像素 为单位。每一个三角形或者四边形的顶点求出一个法线,然后将这些法线的方向在三角形内部进行插值,然后就得到任何一个像素都有自己的法线方向,并且可以做一遍着色。

Flat Shading(左球)

一次对一个面进行着色

  • 三角形面是平面——也意味着有一个平面法线向量。
  • 但是对于平面之间的平滑过渡处理得不好。
    在这里插入图片描述

Gouraud Shading(中图)

逐顶点着色,结果比Flat Shading稍微好一点

  • 三角形顶点上的颜色插值。
  • 每一个顶点有一个法线向量(如何做到的后面会解释)。

在这里插入图片描述

Phong shading(右球)

Phong着色

  • 每一个三角形的法线向量进行插值。
  • 计算机在每一个像素上都进行一次着色。
  • Phong模型不是Blinn-Phong光照模型。

在每一个像素上都可以求得一个独特的法向量,然后就可以在每一个像素上都进行一次着色,这样就可以得到一个相对比较好的结果。

这种方法是在每一个像素上都进行一次着色。
在这里插入图片描述

着色频率的比较:面着色、点着色和像素着色

在这里插入图片描述
工作量和复杂程度应该取决于图形需要进行的着色频率或者说是复杂程度,比如说面的多少,顶点的多少和像素的多少,当面的数量远远超过像素的数量,那么计算机处理起来flat shading就比Phong(pixel) Shading复杂,同时面着色的效果也会好过像素着色。

定义逐顶点的法线(Defining Per-Vertex Normal Vectors)

在这里插入图片描述
比如要找一个球上的顶点的法线,根据几何知识我们知道圆心和球面上点的连线就是该点的法线。但是我们并不总是使用球,如果我们使用其他的物体该怎么球法线呢?

在这里插入图片描述
因为每一个物体都是由许多三角形相连无缝贴合组成的,所以每一个顶点就会和许多不同的三角形有所关联,即一个顶点就是多个三角形的顶点,所以我们就认为这个顶点的法线就是周围相邻的几个面的法线的平均。

在这里插入图片描述
但是简单的平均没有意义,比如说一个三角形的面积很小,而另一个三角形的面积很大,那么这个大的三角形的法向量平均的份就应该多一些,相反,小三角形的法向量占平均的份就应该少一些。所以在平均时,将每个三角形的面积作为权值,对每个法向量进行加权平均,并且在求平均时要对向量进行标准化。

定义逐像素的法线(Defining Per-Pixel Normal Vectors)

比如说在三角形的内部已经知道每一个顶点的法线是什么了,如何得到内部一个平滑过渡的法线?
在这里插入图片描述
这里的向量在刚求出来的时候都是方向向量,应该进行归一化处理,即他们的长度都一样。

顶点法线的重心插值(Barycentric interpolation of vertex normmals)
给出顶点的法线,如何插值出中间的法线?这里就需要用到重心坐标,重心坐标等到后面再说。

图形(实时)渲染管线[Graphics(Real-time) Rendering Pipeline]

从场景到最后屏幕上显示的图,在这中间经历了什么样的过程,这个过程就是管线。其实表示的是一系列不同的操作,过程如下:
在这里插入图片描述

  • 首先输入了1,2,3,4四个顶点的数据
  • Vertex Processing : 经过变换、投影等操作,将这些点投影到屏幕上。
  • Triangle Processing : 投影到屏幕上的一个个点都是离散的,将其连接起来,成为三角形
  • Rasterization : 形成三角形之后要将三角形画在屏幕上,屏幕是由一个个像素组成的,是离散的,所以要经过光栅化将三角形离散成一个个像素(这里fragment是opengl中的概念,片段的意思,在这里我们就把它理解成像素)
  • Fragment Processing : 对每个像素进行着色
  • Framebuffer Operations : 得到屏幕上最终显示出来的图像

具体操作如下:
模型,视图,投影变换:
在这里插入图片描述
光栅化,进行采样:
在这里插入图片描述
深度缓冲可视化测试:
在这里插入图片描述
最后进行着色,如果是逐顶点进行着色,就可以在第一步顶点处理的时候就预处理,这个步骤也就是Shder:
在这里插入图片描述

Shader Programs

  • 程序顶点和片段处理阶段(Program vertex and fragmen processing stages)
  • 描述单个顶点的操作/片段(Describe operation on a single vertex(ro fragment))

在这里插入图片描述
在这里插入图片描述

收获一个网站shadertoy
在这里插入图片描述

纹理映射(Texture mapping)

在着色之前,我们希望对物体的不同位置定义这个位置的一些属性,来计算着色结果(类似之前提到的La,Ls,Ld等系数)。对于三维物体的表面, 其实是展开成2D的表面的,从而可以与一个二维的纹理进行一一对应。
在这里插入图片描述
下面是一个独眼巨人模型的例子:
在这里插入图片描述

  • 定义纹理上的坐标系,UV坐标系:空间上的三角形可以通过UV坐标映射到纹理上的某一个位置,从而我们可以从根据这个坐标从纹理上采样到我们需要的数据。
  • 顶点的U、V取值范围一般都是在0到1之内。
    在这里插入图片描述
    在这里插入图片描述
    贴图可以被多次重复使用
    在这里插入图片描述
    通过下图可以知道上图中的地板的纹理是重复使用的。
    在这里插入图片描述

这种帖图被设计的很好,上下左右又能与自身进行无缝衔接,成为tile贴图。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值