天天看點

OpenGL-霧Fog-執行個體

2.OpenGL---霧

2.1 glEnable(GL_FOG);//啟用霧效果

2.2 glFog*()函數,設定用于控制霧濃度的方程式;

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);  //設定霧結束位置,
           

GL_FOG_MODE:設定霧的模式:GL_EXP(預設)、GL_EXP2、GL_LINEAR(最好的霧渲染模式)

2.3 glHint(target,mod);

·        GL_FOG_HINT值,指定霧化計算的精度;

·        GL_FASTEST:選擇速度最快選項。

·        GL_NICEST:選擇最高品質選項。

·        GL_DONT_CARE:對選項不做考慮。

執行個體代碼:

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);  /* fog color */
}
static void renderSphere (GLfloat x, GLfloat y, GLfloat z)
{
   glPushMatrix();
   glTranslatef (x, y, z);
   glutSolidSphere(0.4, 16, 16);
   glPopMatrix();
}

/* display() draws 5 spheres at different z positions.
 */
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();
}
void reshape(int w, int h)
{
	glViewport(0, 0, (GLsizei) w, (GLsizei) h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	if (w <= h)
		glOrtho (-2.5, 2.5, -2.5*(GLfloat)h/(GLfloat)w,
		2.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0);
	else
		glOrtho (-2.5*(GLfloat)w/(GLfloat)h,
		2.5*(GLfloat)w/(GLfloat)h, -2.5, 2.5, -10.0, 10.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity ();
}
void keyboard(unsigned char key, int x, int y)
{
	switch (key) {
	  case 'f':
	  case 'F':
		  if (fogMode == GL_EXP) {
			  fogMode = GL_EXP2;
			  printf ("Fog mode is GL_EXP2\n");
		  }
		  else if (fogMode == GL_EXP2) {
			  fogMode = GL_LINEAR;
			  printf ("Fog mode is GL_LINEAR\n");
		  }
		  else if (fogMode == GL_LINEAR) {
			  fogMode = GL_EXP;
			  printf ("Fog mode is GL_EXP\n");
		  }
		  glFogi (GL_FOG_MODE, fogMode);
		  glutPostRedisplay();
		  break;
	  default:
		  break;
	}
}
           

exp和exp2:

OpenGL-霧Fog-執行個體
OpenGL-霧Fog-執行個體

liner:

OpenGL-霧Fog-執行個體

繼續閱讀