天天看点

OpenGL光照和材质

转自:http://www.cnblogs.com/phinecos/archive/2007/09/19/899107.html

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) 不同材质属性的示例:

OpenGL光照和材质

void init( void)

{

   GLfloat ambient[] = { 1.0, 0.0, 0.0, 1.0 };

   GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 };

   GLfloat specular[] = { 1.0, 1.0, 1.0, 1.0 };

   GLfloat position[] = { 0.0, 3.0, 2.0, 0.0 };

   GLfloat lmodel_ambient[] = { 0.4, 0.4, 0.4, 1.0 };

   GLfloat local_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);

}

void display( void)

{

   GLfloat no_mat[] = { 0.0, 0.0, 0.0, 1.0 };

   GLfloat mat_ambient[] = { 0.7, 0.7, 0.7, 1.0 };

   GLfloat mat_ambient_color[] = { 0.8, 0.8, 0.2, 1.0 };

   GLfloat mat_diffuse[] = { 0.1, 0.5, 0.8, 1.0 };

   GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };

   GLfloat no_shininess[] = { 0.0 };

   GLfloat low_shininess[] = { 5.0 };

   GLfloat high_shininess[] = { 100.0 };

   GLfloat mat_emission[] = {0.3, 0.2, 0.2, 0.0};

   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

   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();

   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();

   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();

   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();

   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();

   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();

   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();

   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();

   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();

   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();

   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();

   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)雾的效果示例:

OpenGL光照和材质

static GLint fogMode;

static  void init( void)

{

   GLfloat position[] = { 0.5, 0.5, 3.0, 0.0 };

   glEnable(GL_DEPTH_TEST);

   glLightfv(GL_LIGHT0, GL_POSITION, position);

   glEnable(GL_LIGHTING);

   glEnable(GL_LIGHT0);

   {

      GLfloat mat[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);

   {

      GLfloat fogColor[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);  

}

static  void renderSphere (GLfloat x, GLfloat y, GLfloat z)

{

   glPushMatrix();

   glTranslatef (x, y, z);

   glutSolidSphere(0.4, 16, 16);

   glPopMatrix();

}

void display( 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();

}