OpenGL光源
代碼:
1 #define GLUT_DISABLE_ATEXIT_HACK 2 #include "gl/glut.h" 3 4 void OnDisplay(void); 5 void OnReShape(int,int); 6 void OnKey(GLubyte,GLint,GLint); 7 void SetupRC(); 8 void SetupLights(); 9 10 void main(int argc,char* argv[]) 11 { 12 glutInit(&argc,argv); 13 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 14 glutInitWindowSize(600,480); 15 glutCreateWindow("OpenGL光源"); 16 17 glutReshapeFunc(OnReShape); 18 glutDisplayFunc(OnDisplay); 19 glutKeyboardFunc(OnKey); 20 21 SetupRC(); 22 SetupLights(); 23 24 glutMainLoop(); 25 } 26 27 //顯示 回調函數 28 void OnDisplay(void) 29 { 30 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 31 32 glMatrixMode(GL_MODELVIEW); 33 glLoadIdentity(); 34 35 glColor3f(0.7f,0.7f,0.7f); 36 glutSolidSphere(50.0f,50.0f,50.0f); //繪制一個淺灰色的球體 37 38 glutSwapBuffers(); 39 40 } 41 //窗口尺寸變化后的回調函數 42 void OnReShape(int w,int h) 43 { 44 glViewport(0,0,w,h); 45 46 glMatrixMode(GL_PROJECTION); //將當前矩陣指定為投影模式 47 glLoadIdentity(); 48 49 GLfloat aspect =(float)w/(float)h; 50 51 if(w<=h) 52 { 53 glOrtho(-100.0f,100.0f,-100.0f/aspect,100.0f/aspect,-100.0f,100.0f); 54 } 55 else 56 { 57 glOrtho(-100.0f*aspect,100.0f*aspect,-100.0f,100.0f,-100.0f,100.0f); 58 } 59 } 60 61 62 //按鍵處理回調函數 63 void OnKey(GLubyte key,GLint x,GLint y) 64 { 65 switch(key){ 66 67 case 0x31: //打開紅色射燈 68 glDisable(GL_LIGHT2); 69 glDisable(GL_LIGHT3); 70 glEnable(GL_LIGHT1); 71 break; 72 73 case 0x32: //打開綠色射燈 74 glDisable(GL_LIGHT1); 75 glDisable(GL_LIGHT3); 76 glEnable(GL_LIGHT2); 77 break; 78 79 case 0x33: //打開藍色射燈 80 glDisable(GL_LIGHT2); 81 glDisable(GL_LIGHT1); 82 glEnable(GL_LIGHT3); 83 break; 84 85 case 0x34: //打開紅色主光源 86 glDisable(GL_LIGHT0); 87 glEnable(GL_LIGHT4); 88 break; 89 90 default: //關閉所有射燈并將主光源換成白色 91 glDisable(GL_LIGHT1); 92 glDisable(GL_LIGHT2); 93 glDisable(GL_LIGHT3); 94 glDisable(GL_LIGHT4); 95 glEnable(GL_LIGHT0); 96 break; 97 98 } 99 glutPostRedisplay(); 100 } 101 102 //設置渲染環境 103 void SetupRC() 104 { 105 glClearColor(0.0f,0.0f,0.0f,1.0f); 106 107 glEnable(GL_DEPTH_TEST); 108 glShadeModel(GL_SMOOTH); 109 } 110 111 //設置光照 112 void SetupLights() 113 { 114 GLfloat ambientLight[]={0.2f,0.2f,0.2f,1.0f};//白色主光源環境光 115 GLfloat diffuseLight[]={0.8f,0.8f,0.8f,1.0f};//白色主光源漫反射 116 GLfloat specularLight[]={1.0f,1.0f,1.0f,1.0f};//白色主光源鏡面光 117 118 GLfloat redAmbiLight[]={0.2f,0.0f,0.0f,1.0f};//紅色主光源環境光 119 GLfloat redDiffLight[]={0.8f,0.0f,0.0f,1.0f};//紅色主光源漫反射 120 GLfloat redSpecLight[]={1.0f,0.0f,0.0f,1.0f};//紅色主光源鏡面光 121 122 GLfloat lightPos[]={50.0f,120.0f,120.0f,1.0f}; //光源位置 123 GLfloat spotLightPos[]={0.0f,0.0f,200.0f,1.0f}; //射燈位置 124 GLfloat spotDir[]={0.0f,0.0f,-1.0f}; //射燈方向 125 126 GLfloat redLight[]={1.0f,0.0f,0.0f,1.0f}; //紅色光源 127 GLfloat greenLight[]={0.0f,1.0f,0.0f,1.0f}; //綠色光源 128 GLfloat blueLight[]={0.0f,0.0f,1.0f,1.0f}; //藍色光源 129 130 131 glEnable(GL_LIGHTING); //啟用光照 132 glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight); //設置環境光源 133 glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight); //設置漫反射光源 134 glLightfv(GL_LIGHT0,GL_SPECULAR,specularLight); //設置鏡面光源 135 glLightfv(GL_LIGHT0,GL_POSITION,lightPos); //設置燈光位置 136 glEnable(GL_LIGHT0); //打開白色主光源 137 138 glLightfv(GL_LIGHT4,GL_AMBIENT,redAmbiLight); 139 glLightfv(GL_LIGHT4,GL_DIFFUSE,redDiffLight); 140 glLightfv(GL_LIGHT4,GL_SPECULAR,redSpecLight); 141 glLightfv(GL_LIGHT4,GL_POSITION,lightPos); 142 143 glLightfv(GL_LIGHT1,GL_SPECULAR,redLight); //紅色射燈 144 glLightfv(GL_LIGHT1,GL_POSITION,spotLightPos); 145 glLightfv(GL_LIGHT1,GL_SPOT_DIRECTION,spotDir); 146 glLightf(GL_LIGHT1,GL_SPOT_CUTOFF,85.0f); 147 148 glLightfv(GL_LIGHT2,GL_SPECULAR,greenLight); //綠色射燈 149 glLightfv(GL_LIGHT2,GL_POSITION,spotLightPos); 150 glLightfv(GL_LIGHT2,GL_SPOT_DIRECTION,spotDir); 151 glLightf(GL_LIGHT2,GL_SPOT_CUTOFF,85.0f); 152 153 glLightfv(GL_LIGHT3,GL_SPECULAR,blueLight); //藍色射燈 154 glLightfv(GL_LIGHT3,GL_POSITION,spotLightPos); 155 glLightfv(GL_LIGHT3,GL_SPOT_DIRECTION,spotDir); 156 glLightf(GL_LIGHT3,GL_SPOT_CUTOFF,85.0f); 157 158 159 glEnable(GL_COLOR_MATERIAL); //啟用材質的顏色跟蹤 160 glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE); //指定材料著色的面 161 glMaterialfv(GL_FRONT,GL_SPECULAR,specularLight); //指定材料對鏡面光的反應 162 glMateriali(GL_FRONT,GL_SHININESS,100); //指定反射系數 163 164 165 }?
轉載于:https://www.cnblogs.com/xiacl/archive/2012/04/13/2446086.html
總結
- 上一篇: WOrd ,excel实现打印功能
- 下一篇: 程序Crash后的调试技巧