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 }