specular term:镜面反射
稍微光滑一点的平面在反射时会出现高光现象
能否观察到高光现象和观测方向有很大关系
p的作用:
p取100到200,让容忍的角度更小。(哪个角度?看前面的图)
ambient light
我们假设环境光是一个常量(这是一个非常粗略的假设)
Blinn-Phong reflection model
L=La+Ld+Ls
环境光+漫反射光+镜面反射光
注意上面的L和光源到point的距离有关,和观测点的距离无关,这点在之后解释。
三种着色方式
shade each triangle ( flat shading )
着色的前提是使用叉积求出每个三角形的法线。
gouraud shading
先求三角形顶点的法线,求出其着色结果
再对三角形内部的点进行插值
顶点的法线怎么求?
周围面的法线的平均作为顶点的法线。
改进:周围面的加权平均作为顶点的法线。权是周围面的面积。
phone shading
简单的方法也可以达到很好的效果
gouraud shading 和 phone shading 的区别
前者对三角形内部的点不求法线,也不直接求它们的着色情况,而是根据顶点的着色情况来推测内部的着色情况。
后者对三角形内部的点采取和顶点一样的策略:先求法线,再直接求着色情况。
phone shading 如何求三角形内部的点的法线?采用重心插值的方法。(之后介绍)
求完法线之后,不要忘记对这些法线进行归一化。
图形管线、实时渲染管线
graphics pipeline
点->三角形->像素->着色->显示
model view procession ;顶点变换属于第一步
光栅化在第三步:像素采样看是不是在三角形内
z-buffer判断是否可见,也属于光栅化的一部分
如果是gouraud shading,着色需要在第一步:针对顶点着色
如果是phone shading,着色需要在第四步:针对像素着色
shader programs
现代gpu允许编程来自定义着色方案
针对某个顶点或像素写了shader函数,那么该函数会自动地应用于其他的顶点或者像素,不需要写for循环遍历所有的顶点或者像素。
opengl的着色语言:GLSL
一个简单的示例
GPU的并行度大于CPU,因为不同像素往往执行相同的着色方法,而GPU内部也是由大量相似的芯片组成的,它们并行地运算,非常适合做计算机图形着色的工作。
texture
出现纹理的关键:物体表面不同位置的满反射系数kd不同
lives in 3d , goes in 2d
所以纹理可以做成2d的,但是可以用(帖)在3d物体的表面。
帖的过程,其实是让2d的纹理中的点和3d物体的表面上的点进行一个“映射”,处理好点的映射,也就处理好了三角形的映射,因为我们已经知道了点和三角形的映射关系。
纹理坐标:texture coordinate
对于一张纹理,不管是长方形还是方形,u和v都在0-1的区间内。
一张纹理可以在场景中应用多次
良好的纹理设计可以让其在场景中多次使用时,无缝衔接。
下节课介绍:
知道三角形顶点信息,如何在三角形内部进行插值