26)光照模型有4部分:全局环境光,近视点或远视点,双面光照,镜面反射颜色是否和环境颜色,散射颜色分开。要指定全局环境光,可以如下:
GLfloat ambient[] = {0.3,0.3,0.3,1.0};glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambient);
顶点的镜面反射亮度取决于该点的法线,顶点相对于光源的方向以及顶点相对于视点的方向。要使用近视点,可以这样:glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_TRUE);这就将视点放置在(0,0,0)处. glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE)启用双面光照。典型的光照计算中,分别计算环境光,散射光,镜面反射光和发射光的贡献,然后进行叠加,而在这之后进行纹理映射的话,镜面反射区可能被覆盖,为了解决这个问题,可以glLightModelfv(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SEPARATE_SPECULAR_COLOR); 这样,每个顶点光照计算将产生两种颜色,主颜色和辅助颜色,前者包含所以非镜面反射光照的贡献,后者是所以镜面反射光照的总贡献。纹理映射的时候只将主颜色和纹理颜色混合起来,执行万纹理映射后,再将主颜色和纹理颜色的混合结果与辅助颜色混合起来。
27) 不同材质属性的示例:
{
GLfloatambient[]={1.0,0.0,0.0,1.0};
GLfloatdiffuse[]={1.0,1.0,1.0,1.0};
GLfloatspecular[]={1.0,1.0,1.0,1.0};
GLfloatposition[]={0.0,3.0,2.0,0.0};
GLfloatlmodel_ambient[]={0.4,0.4,0.4,1.0};
GLfloatlocal_view[]={0.0};
glClearColor(0.0,0.1,0.1,0.0);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glLightfv(GL_LIGHT0,GL_AMBIENT,ambient);
glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse);
glLightfv(GL_LIGHT0,GL_POSITION,position);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient);
glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER,local_view);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
}
voiddisplay(void)
{
GLfloatno_mat[]={0.0,0.0,0.0,1.0};
GLfloatmat_ambient[]={0.7,0.7,0.7,1.0};
GLfloatmat_ambient_color[]={0.8,0.8,0.2,1.0};
GLfloatmat_diffuse[]={0.1,0.5,0.8,1.0};
GLfloatmat_specular[]={1.0,1.0,1.0,1.0};
GLfloatno_shininess[]={0.0};
GLfloatlow_shininess[]={5.0};
GLfloathigh_shininess[]={100.0};
GLfloatmat_emission[]={0.3,0.2,0.2,0.0};
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
/*drawsphereinfirstrow,firstcolumn
*diffusereflectiononly;noambientorspecular
*/
glPushMatrix();
glTranslatef(-3.75,3.0,0.0);
glMaterialfv(GL_FRONT,GL_AMBIENT,no_mat);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,no_mat);
glMaterialfv(GL_FRONT,GL_SHININESS,no_shininess);
glMaterialfv(GL_FRONT,GL_EMISSION,no_mat);
glutSolidSphere(1.0,16,16);
glPopMatrix();
/*drawsphereinfirstrow,secondcolumn
*diffuseandspecularreflection;lowshininess;noambient
*/
glPushMatrix();
glTranslatef(-1.25,3.0,0.0);
glMaterialfv(GL_FRONT,GL_AMBIENT,no_mat);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT,GL_SHININESS,low_shininess);
glMaterialfv(GL_FRONT,GL_EMISSION,no_mat);
glutSolidSphere(1.0,16,16);
glPopMatrix();
/*drawsphereinfirstrow,thirdcolumn
*diffuseandspecularreflection;highshininess;noambient
*/
glPushMatrix();
glTranslatef(1.25,3.0,0.0);
glMaterialfv(GL_FRONT,GL_AMBIENT,no_mat);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT,GL_SHININESS,high_shininess);
glMaterialfv(GL_FRONT,GL_EMISSION,no_mat);
glutSolidSphere(1.0,16,16);
glPopMatrix();
/*drawsphereinfirstrow,fourthcolumn
*diffusereflection;emission;noambientorspecularreflection
*/
glPushMatrix();
glTranslatef(3.75,3.0,0.0);
glMaterialfv(GL_FRONT,GL_AMBIENT,no_mat);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,no_mat);
glMaterialfv(GL_FRONT,GL_SHININESS,no_shininess);
glMaterialfv(GL_FRONT,GL_EMISSION,mat_emission);
glutSolidSphere(1.0,16,16);
glPopMatrix();
/*drawsphereinsecondrow,firstcolumn
*ambientanddiffusereflection;nospecular
*/
glPushMatrix();
glTranslatef(-3.75,0.0,0.0);
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,no_mat);
glMaterialfv(GL_FRONT,GL_SHININESS,no_shininess);
glMaterialfv(GL_FRONT,GL_EMISSION,no_mat);
glutSolidSphere(1.0,16,16);
glPopMatrix();
/*drawsphereinsecondrow,secondcolumn
*ambient,diffuseandspecularreflection;lowshininess
*/
glPushMatrix();
glTranslatef(-1.25,0.0,0.0);
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT,GL_SHININESS,low_shininess);
glMaterialfv(GL_FRONT,GL_EMISSION,no_mat);
glutSolidSphere(1.0,16,16);
glPopMatrix();
/*drawsphereinsecondrow,thirdcolumn
*ambient,diffuseandspecularreflection;highshininess
*/
glPushMatrix();
glTranslatef(1.25,0.0,0.0);
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT,GL_SHININESS,high_shininess);
glMaterialfv(GL_FRONT,GL_EMISSION,no_mat);
glutSolidSphere(1.0,16,16);
glPopMatrix();
/*drawsphereinsecondrow,fourthcolumn
*ambientanddiffusereflection;emission;nospecular
*/
glPushMatrix();
glTranslatef(3.75,0.0,0.0);
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,no_mat);
glMaterialfv(GL_FRONT,GL_SHININESS,no_shininess);
glMaterialfv(GL_FRONT,GL_EMISSION,mat_emission);
glutSolidSphere(1.0,16,16);
glPopMatrix();
/*drawsphereinthirdrow,firstcolumn
*coloredambientanddiffusereflection;nospecular
*/
glPushMatrix();
glTranslatef(-3.75,-3.0,0.0);
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient_color);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,no_mat);
glMaterialfv(GL_FRONT,GL_SHININESS,no_shininess);
glMaterialfv(GL_FRONT,GL_EMISSION,no_mat);
glutSolidSphere(1.0,16,16);
glPopMatrix();
/*drawsphereinthirdrow,secondcolumn
*coloredambient,diffuseandspecularreflection;lowshininess
*/
glPushMatrix();
glTranslatef(-1.25,-3.0,0.0);
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient_color);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT,GL_SHININESS,low_shininess);
glMaterialfv(GL_FRONT,GL_EMISSION,no_mat);
glutSolidSphere(1.0,16,16);
glPopMatrix();
/*drawsphereinthirdrow,thirdcolumn
*coloredambient,diffuseandspecularreflection;highshininess
*/
glPushMatrix();
glTranslatef(1.25,-3.0,0.0);
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient_color);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT,GL_SHININESS,high_shininess);
glMaterialfv(GL_FRONT,GL_EMISSION,no_mat);
glutSolidSphere(1.0,16,16);
glPopMatrix();
/*drawsphereinthirdrow,fourthcolumn
*coloredambientanddiffusereflection;emission;nospecular
*/
glPushMatrix();
glTranslatef(3.75,-3.0,0.0);
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient_color);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,no_mat);
glMaterialfv(GL_FRONT,GL_SHININESS,no_shininess);
glMaterialfv(GL_FRONT,GL_EMISSION,mat_emission);
glutSolidSphere(1.0,16,16);
glPopMatrix();
glFlush();
}
28)颜色材质模式,
glColorMaterial(GL_FRONT, GL_DIFFUSE);glEnable(GL_COLOR_MATERIAL);这将导致正面的DIFFUSE总是设置为当前颜色
29)混合时,首先指定源因子和目标因子,然后按照公式进行混合(默认的操作是相加),设置因子有两种方式:glBlenFunc()和glBlendFuncSeparate()(它可以指定4个因子,即可以使用不同的方式来混合RGB和alpha值)。除了默认的加法外,还可以使用glBlendEquation()来指定其他的混合方式(如减法等)。
30) 启用反走样功能:glEnable(GL_POINT_SMOOTH)或glEnable (GL_LINE_SMOOTH);glEnable (GL_BLEND);或者采用glHint(),例如:
glEnable (GL_LINE_SMOOTH);
glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glHint (GL_LINE_SMOOTH_HINT, GL_DONT_CARE);
31)雾的效果示例:
/*Initializedepthbuffer,fog,lightsource,
*materialproperty,andlightingmodel.
*/
staticvoidinit(void)
{
GLfloatposition[]={0.5,0.5,3.0,0.0};
glEnable(GL_DEPTH_TEST);
glLightfv(GL_LIGHT0,GL_POSITION,position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
{
GLfloatmat[3]={0.1745,0.01175,0.01175};
glMaterialfv(GL_FRONT,GL_AMBIENT,mat);
mat[0]=0.61424;mat[1]=0.04136;mat[2]=0.04136;
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat);
mat[0]=0.727811;mat[1]=0.626959;mat[2]=0.626959;
glMaterialfv(GL_FRONT,GL_SPECULAR,mat);
glMaterialf(GL_FRONT,GL_SHININESS,0.6*128.0);
}
glEnable(GL_FOG);
{
GLfloatfogColor[4]={0.5,0.5,0.5,1.0};
fogMode=GL_EXP;
glFogi(GL_FOG_MODE,fogMode);
glFogfv(GL_FOG_COLOR,fogColor);
glFogf(GL_FOG_DENSITY,0.35);
glHint(GL_FOG_HINT,GL_DONT_CARE);
glFogf(GL_FOG_START,1.0);
glFogf(GL_FOG_END,5.0);
}
glClearColor(0.5,0.5,0.5,1.0);/*fogcolor*/
}
staticvoidrenderSphere(GLfloatx,GLfloaty,GLfloatz)
{
glPushMatrix();
glTranslatef(x,y,z);
glutSolidSphere(0.4,16,16);
glPopMatrix();
}
/*display()draws5spheresatdifferentzpositions.
*/
voiddisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
renderSphere(-2.,-0.5,-1.0);
renderSphere(-1.,-0.5,-2.0);
renderSphere(0.,-0.5,-3.0);
renderSphere(1.,-0.5,-4.0);
renderSphere(2.,-0.5,-5.0);
glFlush();
}