OpenGL雾化

  1 #include "gl/glut.h"
  2 
  3 #define MODE_NONE 0
  4 #define MODE_LINEAR 1
  5 #define MODE_EXP 2
  6 #define MODE_EXP2 3
  7 
  8 GLint fogMode;
  9 
 10 void Initialization(void);
 11 void OnDisplay(void);
 12 void OnReShape(int,int);
 13 void OnMenu(int);
 14 void CreateMenu(void);
 15 void DrawTeapot(GLfloat,GLfloat,GLfloat);
 16 
 17 void main(int argc,char* argv[])
 18 {
 19     glutInit(&argc,argv);
 20     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
 21     glutInitWindowSize(600,600);
 22     glutCreateWindow("OpenGL雾化");
 23     
 24     glutReshapeFunc(OnReShape);
 25     glutDisplayFunc(OnDisplay);
 26     glutCreateMenu(OnMenu);
 27     
 28     CreateMenu();
 29     Initialization();
 30     
 31     glutMainLoop();
 32 }
 33 
 34 void Initialization(void)
 35 {
 36     GLfloat position[]={0.5f,0.5f,3.0f,0.0f};
 37     glEnable(GL_DEPTH_TEST);
 38     glLightfv(GL_LIGHT0,GL_POSITION,position); //设置光源位置
 39 
 40 
 41     glEnable(GL_LIGHTING);
 42     glEnable(GL_LIGHT0);
 43     {
 44         //为材质指定对光源的反射
 45         GLfloat ambLight[3]={0.17f,0.11f,0.11f};
 46         glMaterialfv(GL_FRONT,GL_AMBIENT,ambLight); 
 47         GLfloat difLight[3]={0.61f,0.24f,0.24f};
 48         glMaterialfv(GL_FRONT,GL_DIFFUSE,difLight);
 49         GLfloat speLight[3]={0.73f,0.63f,0.63f};
 50         glMaterialfv(GL_FRONT,GL_SPECULAR,speLight);
 51         //设置反光系数
 52         glMaterialf(GL_FRONT,GL_SHININESS,100.0f);  
 53     }
 54     
 55     
 56 
 57     
 58     
 59     glEnable(GL_FOG);//启用雾功能
 60     
 61         GLfloat fogColor[4]={0.5f,0.5f,0.5f,1.0f};
 62         fogMode=GL_LINEAR;                    
 63         glFogi(GL_FOG_MODE,fogMode);
 64         glFogfv(GL_FOG_COLOR,fogColor);
 65         glFogf(GL_FOG_DENSITY,0.35f);
 66         glHint(GL_FOG_HINT,GL_DONT_CARE);
 67         glFogf(GL_FOG_START,1.0f);
 68         glFogf(GL_FOG_END,5.0f);
 69     
 70     glClearColor(fogColor[0],fogColor[1],fogColor[2],fogColor[3]);//背景色
 71     
 72 }
 73 
 74 void DrawTeapot(GLfloat x,GLfloat y,GLfloat z)
 75 {
 76     glPushMatrix();
 77     glTranslatef(x,y,z);
 78     glutSolidTeapot(0.8f);
 79     glPopMatrix();
 80 }
 81 
 82 void OnDisplay(void)
 83 {
 84 
 85     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 86     
 87     DrawTeapot(-2.0f,-1.0f,-1.0f);
 88     DrawTeapot(-1.0f,-0.5f,-2.0f);
 89     DrawTeapot(0.0f,0.0f,-3.0f);
 90     DrawTeapot(1.0f,0.5f,-4.0f);
 91     DrawTeapot(2.0f,1.0f,-5.0f);
 92 
 93     glFlush();
 94 
 95 }
 96 
 97 void OnReShape(int w,int h)
 98 {
 99     glViewport(0,0,(GLsizei)w,(GLsizei)h);
100     
101     glMatrixMode(GL_PROJECTION); //将当前矩阵指定为投影模式
102     glLoadIdentity();
103 
104     GLfloat aspect =GLfloat(h)/GLfloat(w);
105 
106     if(w<=h)
107         glOrtho(-2.5f,2.5f,-2.5f*aspect,2.5f*aspect,-10.0f,10.0f);//三维正交投影
108     else
109         glOrtho(-2.5f/aspect,2.5f/aspect,-2.5f,2.5f,-10.0f,10.0f);
110 
111     glMatrixMode(GL_MODELVIEW);
112     glLoadIdentity();
113 
114 }
115 
116 void CreateMenu(void)
117 {
118     glutAddMenuEntry("线性",MODE_LINEAR);
119     glutAddMenuEntry("指数",MODE_EXP);
120     glutAddMenuEntry("指数2",MODE_EXP2);
121     glutAddMenuEntry("无雾",MODE_NONE);
122 
123     glutAttachMenu(GLUT_RIGHT_BUTTON);
124 }
125 
126 void OnMenu(int value)
127 {
128     switch (value)
129     {
130     case MODE_LINEAR:
131         fogMode=GL_LINEAR;
132         break;
133 
134     case MODE_EXP:
135         fogMode=GL_EXP;
136         break;
137 
138     case MODE_EXP2:
139         fogMode=GL_EXP2;
140     }
141 
142     glFogi(GL_FOG_MODE,fogMode);
143     if (value==MODE_NONE)
144         glDisable(GL_FOG);
145     else
146         glEnable(GL_FOG);
147 
148     glutPostRedisplay();
149 }

转载于:https://www.cnblogs.com/xiacl/archive/2012/04/20/2459606.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值