回顾上节课;
每次着色是在一个shading point,如果我们要得到一张图,我们需要进行多次着色。也就是这节课要讲到的着色频率。
我们继续看这个公式:(Blinn--Phong模型,因为半程太好算了,两个相加,在转单位向量就完事了)
我们接收的光照能量和夹角余弦有关系,。
现在我们看高光:
高光往往是镜面反射导致的,看到高光就是我们看的方式和镜面反射方向接近的时候就会出现。
当我们我们也可以看出,如接近高光区,那也就意味着半程向量和平面法向量十分的接近,如图所示(高光就相当于折射角,是被法向量平分的)
也就是说我们看不看得到高光可以看他的半程向量是否和法向量接近。
为什么要有个p次方呢,是因为余弦变化的太慢了,加上指数可以缩小高光的范围,也变得敏感(正常我们吧p记作100+)
实际对比
下面看环境光:
环境光特别复杂,所有我们做出一个假设,所有点的环境光的大小是一样的
环境光和方向什么的都没关系,可以理解为一个常数,(深入以后再说)
下载我们吧所有光加一起来
环境光+漫反射光+高光项
使用公式
因为这个是对一个点的操作,下一步是对所有的进行操作,在这里我们吧不管你距离物体多远,观察物体的光都是一样的,不会衰减(虽然我们远看会变暗)。现在还不足以解释该问题。
下面我们考虑这个这是三个相等的模型,但是着色后确实不同的,
这个就涉及到了着色频率了,图一是一个平面只做一次shading。图二我们是直对顶点进行着色,内部我们使用差值形式过度,最后一个应用于每一个像素。
每一个三角形着色:(Flat shading)
不考虑三角形内部变化
对每一个顶点着色(Grouraud shading)
(问题,怎么求顶点的法向量之类的)
对每一个像素着色(Phong shading)
下面我们看。难道第一种方法一定垃圾吗?
从这可以看出,在模型面数足够高的情况下,其实差距没那么大,其实就是一个空间和时间作斗争,互相均衡的一个情况。
现在求一个顶点的法向量,,如果是一个球很简单,
如果不是呢:
中间哪一个可以当作四个面的法向量平均,且求一个加权平均(面积)
20201109 21:22份到此结束
渲染管线:
图形管线,我们如何从场景到最后一张图,其中过程就是渲染管线
shader就是每一个顶点像素,都会执行,只需要处理一个像素或者顶点
处理顶点的叫做: vertex shader
处理像素的叫做: fragment shader
这里面 myTesture表示纹理
lightdir是全局光照
norm表示平均法向量
kd是漫反射常数(和纹理有关)
clamp,点乘结果限制数的结果在( 0.0 ,1.0)
gl_fragColor输出颜色
。。。。
推荐一个写shader的网站
现在着色,gpu都是同时着色很多的像素。
现在开始看纹理映射,如果我们只有一个点,那是很好进行计算的,如果有多个光源,我们也可可以简单理解为叠加在一起:
我们现在提出一个说法,任何一个三维物体表面,其实是二维的
也就是三维物体表面可以通过一张图,来贴上去
这就是纹理贴图
我们认为每个三角形对应的位置,是已知的,而且显然面积是不对等的,你看颜色,V越大绿色越严重,u则是红色
范围一般认为都是在(0,1)
再看一个
纹理使用了多次,就像贴瓷砖,有很多重复的,
但是会有缝,所以我们要设计出无缝贴图。
下一个问题,如果我们知道三角形对应uv,那么内部对应uv,使用差值