跳至正文

Shading2(Shading,Pipeline and Texture Mapping)

接上一次文末

现在要把高光项加进去

那什么时候才能看到高光呢?

一般比较光滑的物体 反射都比较接近镜面反射的方向

法线方向和所谓半程向量很接近

相比于漫反射 多考虑了上面这一点 也就是法线到底有多接近半程向量

这里为什么不考虑多少能量被吸收?

是因为这个模型是经验性模型

把这个问题给简化掉了

为什么是考虑法线和半程向量 为什么不考虑镜面反射呢?

也可以 是另外一个模型

采用法线算是一种改进 因为半程向量比较好算

 
 

要对夹角余弦加上指数 因为我们所知的高光范围并没有那么大

在这个模型里其实100200比较正常 64还是不够的

指数P

 
 

最后一项:环境光

做一个大胆的假设 环境光是一个固定的值 然后来自于四面八方

这样就能得到一个近似的环境光

事实上肯定不是这么回事

 
 

最后 所有的项加起来 就可以得到这个模型

 
 

着色模型考虑的是一个点

所以接下来就要考虑所有的点了

 
 

着色频率

所谓着色频率 就是把着色应用在哪些点上

例如第一个 应用在一个面上 然后认为整个平面都一个颜色

第二个 一个平面有四个顶点 那每个顶点我都做一次着色

第三个 每个点 每个像素都做一次着色

 
 

每一个三角形平面都求法线
做一次着色

对于三角形内部就不可能有着色的变化

这样的着色就叫flat shading

在任一顶点上求法线
每个顶点做一次着色

这样的着色就叫Gouraud shading

每一像素进行着色
就叫做phong shading

每一行的模型是相同的 当模型相对复杂的时候 就可以用比较简单的着色模型

 
 

问题1:怎么知道逐顶点的法线是什么?

如果是个球 自然就可以从圆心延伸

但肯定没那么好

任何一个顶点 肯定都和某些三角形关联

那就所有关联的三角形的法线求个平均

如果做加权的平均 那效果会更好

问题2:逐像素的法线又如何定义呢?

顶点与顶点间来找 需要用到重心坐标

 
 

把之前讲到的所有东西合起来 就叫做管线

表示的一系列不同的操作

 
 

着色也可以发生在顶点阶段

控制顶点和像素是如何进行着色的就叫做shader

下一个很快就要讲到的

怎样才能让三角形显示出纹理

就叫做纹理映射

现代的GPU 允许大家自己去编程来解决顶点和像素如何去操作

就需要大家去写shader 它本身是能在硬件上执行的语言

  • shader是每一个顶点或像素都会执行一次 是通用的 不需要写循环
  • 如果我写的是顶点操作 就叫做顶点着色器 同理就叫做像素着色器
  • 计算颜色 并且把它输出出去

代码就是冯模型的反射部分

 
 

推荐:

https://www.shadertoy.com/view/ld3Gz2

在网页上可以直接执行的渲染

 
 

现代图形学的发展

现在的显卡可以在很短时间内处理大量几何

并且着色非常快 高速并行

GPU分两种 独显 集显

本身可以理解为一个高度并行化的处理器

 
 

 
 

纹理映射

刚刚讲到的遗留问题

球上面 可以看到不同位置有不同颜色

他们的基本区别是 共用同一个着色模型 只是漫反射系数发生了改变

所以就希望能有个定义 让他们有自己的属性

这就是引入纹理映射的原因

 
 

物体表面如何理解?

任何一个三维物体的表面都是二维的

把一张图蒙在三维物体表面 就叫做纹理映射

 
 

 
 

在纹理上定义一个坐标系 通常会用UV来表示这个坐标系

UV的范围通常来说 U和V都在0~1之内 算是个约定俗成的事情

纹理的坐标显示出来就是这样的

像铺地砖一样 不断地重复它就可以贴满了

所以说 纹理可以不只用一次

 
 

无缝衔接
那是纹理设计的好

这样的纹理就叫做tiled textures

其中有一种算法就叫做wang tiled

 
 

三角形又要怎么处理呢?

就要说到插值问题了

发表评论

您的电子邮箱地址不会被公开。