OpenGL最简单框架 代码随笔练习,防止健忘

  1 #include "stdafx.h"
  2 
  3 #include <stdlib.h>
  4 #include <GL/glut.h>
  5 
  6 static int spin = 0;
  7 
  8 void init (void)
  9 {
 10     glClearColor (0.0, 0.0, 0.0, 0.0);
 11     glShadeModel (GL_SMOOTH);//圆滑模式
 12     glEnable(GL_LIGHTING);//启用 光源
 13     //glEnable(GL_LIGHT0); //支持0到7号(8个)光源
 14     //glEnable(GL_LIGHT7);
 15     glEnable(GL_LIGHT0);
 16     glEnable(GL_LIGHT1);
 17     GLfloat ambient[] = { 0.8, 0.0, 0.0, 1.0 };
 18     GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
 19     GLfloat position[] = { 1.0, 1.0, 0.0, 0.0 };
 20     glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);//强度
 21     glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);//环境(漫反射)
 22     glLightfv(GL_LIGHT1, GL_POSITION, position);//位置
 23 
 24 
 25     glEnable(GL_DEPTH_TEST);
 26     glDisable(GL_CULL_FACE);
 27     //glEnable(GL_NORMALIZE);
 28 }
 29 
 30 void display (void)
 31 {
 32     //glPushMatrix ();//压栈
 33     //glPopMatrix ();//出栈
 34     //glBegin(mode);//绘图开始
 35     //glEnd();//绘图结束
 36     //glTranslate*(x,y,z);//位移
 37     //glRotate* (angel,x,y,z);//旋转
 38 
 39     
 40     glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清空上帧缓冲区
 41     /*
 42     #define GL_POINTS                         0x0000 //点
 43     #define GL_LINES                          0x0001 //线
 44     #define GL_LINE_LOOP                      0x0002 //线(循环) 起始点与终点相连
 45     #define GL_LINE_STRIP                     0x0003 //相连线段
 46     #define GL_TRIANGLES                      0x0004 //三角形
 47     #define GL_TRIANGLE_STRIP                 0x0005 //相连三角形
 48     #define GL_TRIANGLE_FAN                   0x0006 //起点绘制多个三角形
 49     #define GL_QUADS                          0x0007 //四边形
 50     #define GL_QUAD_STRIP                     0x0008 //相连四边形
 51     #define GL_POLYGON                        0x0009 //起点绘制多个四边形
 52     */
 53     //二维
 54     //glBegin(GL_TRIANGLE_FAN);
 55     //    glColor3f (0.0, 1.0, 1.0);
 56     //    glVertex3f(0.0,0.0,0.0);
 57     //    glColor3f (1.0, 1.0, 1.0);
 58     //    glVertex3f(1.0,1.0,1.0);
 59     //    glColor3f (0.0, 1.0, 0.0);
 60     //    glVertex3f(-1.0,1.0,1.0);
 61     //    glColor3f (1.0, 0.0, 0.0);
 62     //    glVertex3f(-1.0,-1.0,1.0);
 63     //glEnd();
 64     /*
 65     GLUTAPI void APIENTRY glutWireSphere(GLdouble radius, GLint slices, GLint stacks);//glut白线球体
 66     GLUTAPI void APIENTRY glutSolidSphere(GLdouble radius, GLint slices, GLint stacks);//glut实体球体
 67     GLUTAPI void APIENTRY glutWireCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);//glut白线圆锥
 68     GLUTAPI void APIENTRY glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);//glut实体圆锥
 69     GLUTAPI void APIENTRY glutWireCube(GLdouble size);//glut白线正立方体
 70     GLUTAPI void APIENTRY glutSolidCube(GLdouble size);//glut实体正立方体
 71     GLUTAPI void APIENTRY glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);//glut白线圆环
 72     GLUTAPI void APIENTRY glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);//glut实体圆环
 73     GLUTAPI void APIENTRY glutWireDodecahedron(void);//glut白线十二面体
 74     GLUTAPI void APIENTRY glutSolidDodecahedron(void);//glut实体十二面体
 75     GLUTAPI void APIENTRY glutWireTeapot(GLdouble size);//glut白线茶壶
 76     GLUTAPI void APIENTRY glutSolidTeapot(GLdouble size);//glut实体茶壶
 77     GLUTAPI void APIENTRY glutWireOctahedron(void);//glut白线八面体
 78     GLUTAPI void APIENTRY glutSolidOctahedron(void);//glut实体八面体
 79     GLUTAPI void APIENTRY glutWireTetrahedron(void);//glut白线四面体
 80     GLUTAPI void APIENTRY glutSolidTetrahedron(void);//glut实体四面体
 81     GLUTAPI void APIENTRY glutWireIcosahedron(void);//glut白线二十面体
 82     GLUTAPI void APIENTRY glutSolidIcosahedron(void);//glut实体二十面体
 83     */
 84     //三维
 85     glPushMatrix ();
 86         gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);//相机(眼睛)定位
 87         glPushMatrix ();
 88             glRotated ((GLdouble) spin, 1.0, 0.0, 0.0);
 89             GLfloat position[] = { 0.0, 0.0, 1.5, 1.0 };
 90             glLightfv (GL_LIGHT0, GL_POSITION, position);
 91             //glTranslated (0.0, 0.0, 1.5);
 92             glTranslated(position[0],position[1],position[2]);
 93             glDisable (GL_LIGHTING);
 94             glColor3f (0.0, 1.0, 1.0);
 95             glutWireCube (0.1);
 96             glEnable (GL_LIGHTING);
 97         glPopMatrix ();
 98         //glutSolidTorus (0.275, 0.85, 8, 15);
 99         glutSolidSphere(0.5,20,20);
100     glPopMatrix ();
101     glFlush ();//强制绘图完成上述
102     glutSwapBuffers();//交换缓冲帧(画面)
103 }
104 
105 void reshape(int w, int h)
106 {
107     glViewport (0, 0, (GLsizei) w, (GLsizei) h);//视图 等同于 画布
108     glMatrixMode (GL_PROJECTION);//对投影矩阵应用随后的矩阵操作.
109     //glLoadIdentity ();
110     //              x          width         y        height
111     //gluOrtho2D(0.0, (GLdouble) w, 0.0, (GLdouble) h);//正投影(二维)
112     //               src        宽高比                zNear    zFar    
113     gluPerspective(40.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);//透视投影(三维)
114     glMatrixMode(GL_MODELVIEW);//对模型视景矩阵堆栈应用随后的矩阵操作.
115     glLoadIdentity();//恢复原位
116 }
117 
118 void mouse(int button, int state, int x, int y)
119 {
120     switch (button) {
121       case GLUT_LEFT_BUTTON://左键
122           if (state == GLUT_DOWN) {
123               spin = (spin + 30) % 360;
124               glutPostRedisplay();
125           }
126           break;
127       case GLUT_MIDDLE_BUTTON://中键
128           break;
129       case GLUT_RIGHT_BUTTON://右键
130           break;
131       default:
132           break;
133     }
134     switch(state){
135         case GLUT_UP://松开
136             break;
137         case GLUT_DOWN://按下
138             break;
139         default:
140             break;
141     }
142 }
143 
144 void keyboard(unsigned char key, int x, int y)
145 {
146     switch (key) {
147       case 27://ESC 
148           exit(0);//退出
149           break;
150     }
151 }
152 
153 int _tmain(int argc, char** argv)
154 {
155     //输出OpenGL版本相关信息
156     //const char* verstr = (const char*)glGetString( GL_VERSION ); 
157     //printf("%s",verstr);
158     //system( "@pause" );
159 
160     glutInit(&argc, argv);//初始化
161     //显示模式                双缓冲区    RGB颜色        深度        多线程
162     glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH | GLUT_MULTISAMPLE);
163     glutInitWindowSize(200, 200);//窗口大小
164     glutInitWindowPosition (100, 100);//窗口位置(左上角在显示屏位置)
165     glutCreateWindow("Title");//标题
166     //glutCreateWindow (argv[0]);
167     glutCreateMenu(NULL);
168     //glutFullScreen();//全屏
169     
170     init ();//初始化
171     /*
172     GLUTAPI void APIENTRY glutDisplayFunc(void (GLUTCALLBACK *func)(void));//注册渲染函数
173     GLUTAPI void APIENTRY glutReshapeFunc(void (GLUTCALLBACK *func)(int width, int height));//注册窗口改变大小时函数
174     GLUTAPI void APIENTRY glutKeyboardFunc(void (GLUTCALLBACK *func)(unsigned char key, int x, int y));//注册键盘按键函数
175     GLUTAPI void APIENTRY glutMouseFunc(void (GLUTCALLBACK *func)(int button, int state, int x, int y));//注册鼠标按键函数
176     GLUTAPI void APIENTRY glutMotionFunc(void (GLUTCALLBACK *func)(int x, int y));//注册鼠标按键拖动函数
177     GLUTAPI void APIENTRY glutPassiveMotionFunc(void (GLUTCALLBACK *func)(int x, int y));//注册鼠标松开拖动函数
178     GLUTAPI void APIENTRY glutEntryFunc(void (GLUTCALLBACK *func)(int state));//
179     GLUTAPI void APIENTRY glutVisibilityFunc(void (GLUTCALLBACK *func)(int state));//
180     GLUTAPI void APIENTRY glutIdleFunc(void (GLUTCALLBACK *func)(void));//注册空闲函数
181     GLUTAPI void APIENTRY glutTimerFunc(unsigned int millis, void (GLUTCALLBACK *func)(int value), int value);//注册计时器函数
182     GLUTAPI void APIENTRY glutMenuStateFunc(void (GLUTCALLBACK *func)(int state));//
183     */
184     glutReshapeFunc (reshape);
185     glutDisplayFunc(display);
186     glutKeyboardFunc (keyboard);
187     glutMouseFunc(mouse);
188     
189     glutMainLoop();// 进入glut事件处理循环
190     return 0; 
191 }

 

posted on 2013-06-26 20:44  乐天工作室  阅读(377)  评论(0)    收藏  举报

导航