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