Lighting and Rasterization - Shading
学习目标:
1 分类不同类别的光源
2 理解图像形成过程
3 数学建模三种反射类型并了解其属性
4 了解三种渲染方法,并比较它们的优缺点
5 能够使用 OpenGL 对照明和着色进行编程。
1.计算在场景的给定点应该看到的光线的强度和颜色。
2.最终目标是 photorealism
反射的类型:
ia为入射环境光;
ka为环境反射系数,介于0和1之间。
则我们有 :
输入:将对象细分为多边形(标准图形对象)
三种常用的多边形着色方法(Shading中的插值技术)
下图从左到右分别使用的是flat shading ,gouraud shading,phong shading。不难看出 真实性提高了,但计算开销也提高了
计算多边形的单个强度。然后以相同的强度值显示多边形的所有点。
这种着色方法的核心是 在每个多边形上线性插值强度值。
操作步骤
在Phong Shading中,在扫描线对颜色进行填充的时候,不是对颜色插值,而是对法线进行了插值。这样可以保留高光区,真实度最高,但是同时也最慢。
光照部分:
glEnable (GL_LIGHTING); // 打开光源
glLight* (lightName, lightProperty, propertyValue);
GLfloat light1PosType [ ] = {2.0, 0.0, 3.0, 1.0}; //一号光源位置属性
GLfloat light2PosType [ ] = {0.0, 1.0, 0.0, 0.0}; //二号光源位置属性
glLightfv (GL_LIGHT1, GL_POSITION, light1PosType); //设置1号光源的位置属性
glEnable (GL_LIGHT1);//打开光1
glLightfv (GL_LIGHT2, GL_POSITION, light2PosType);
//设置2号光源的位置属性
glEnable (GL_LIGHT2);//打开光2
// glLightfv(光源编号,光源特性,参数数据)设置光源。光源编号可取GL_LIGHT0、GL_LIGHT1、……、GL_LIGHT7共8个值。光源特性主要可取GL_AMBIENT(设置光源的环境光属性,默认值(0,0,0,1))、GL_DIFFUSE(设置光源的散射光属性,默认值(1,1,1,1))、GL_SPECULAR(设置光源的镜面反射光属性,默认值(1,1,1,1))、GL_POSITION(设置光源的位置,默认值(0,0,1,0))。参数数据格式要求为数组形式,即数学上的向量形式。
//GL_POSITION,其位置数组(x,y,z,w)定义了光源在空间中的位置。当w≠0时,它表示光源处于空间中(x,y,z)处,这时的光源称为定点光源;当w=0时,根据齐次坐标的性质,它表示光源位于无穷远处,此时光源称为定向光源,其所有光线几乎是相互平等的,如太阳。其光线方向由点(x,y,z)指向(0,0,0)。
光源颜色:
GLfloat blackColor [ ] = {0.0, 0.0, 0.0, 1.0};
GLfloat whiteColor [ ] = {1.0, 1.0, 1.0, 1.0};
glLightfv (GL_LIGHT3, GL_AMBIENT, blackColor); glLightfv (GL_LIGHT3, GL_DIFFUSE, whiteColor); glLightfv (GL_LIGHT3, GL_SPECULAR, whiteColor);
表面特性:
glMaterial* (surfFace, surfProperty, propertyValue);
diffuseCoeff [ ] = {0.2, 0.4, 0.9, 1.0};
// kdR = 0.2, kdG = 0.4, kdB = 0.9
specularCoeff [ ] = {1.0, 1.0, 1.0, 1.0};
// WR() = 1.0, ...
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,diffuseCoeff );
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specularCoeff);
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 25.0 ); // ns = 25
//glMaterialfv(face,pname,*pname )面可以是GL_FRONT, GL_BACK,等;pname是材质,可以是GL_AMBIENT_AND_DIFFUSE,GL_SPECULAR,等,最后一个参数是系数值
表面渲染:
glShadeModel(surfRenderingMethod);
//参数可以选GL_FLAT,或者GL_SMOOTH
glNormal3* (Nx, Ny, Nz);
//计算法向量
用Gouraud 对三角形着色例程:
glEnable (GL_NORMALIZE); // convert all normal vectors to unit vector
glLightModeli (GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
// set correct V for specular calculations
glBegin (GL_TRIANGLES);
glNormal3fv (normalVector1); // normal vector at vertex1 calculated
glVertex3fv (vertex1);
glNormal3fv (normalVector2);
glVertex3fv (vertex2);
glNormal3fv (normalVector3);
glVertex3fv (vertex3);
glEnd ( );