OpenGL-雾Fog-实例

本文介绍了如何使用OpenGL实现雾效果,包括雾的启用、颜色、密度等属性设置,并提供了三种雾模式(GL_EXP、GL_EXP2、GL_LINEAR)的使用示例。通过调整这些参数可以创建出不同的视觉效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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:


liner:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值