计算及图形学要做opengl的实验作业,作为完全初入门的小白,一边做实验一边记录学到的函数,记录了一些非常基础的操作。
#include <GL/glut.h>
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);// https://blog.csdn.net/hebbely/article/details/69951068
glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
glFlush();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv); //初始化参数
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
//设置展示模式,,其中GLUT_RGB表示使用RGB颜色,与之对应的还有GLUT_INDEX(表示使用索引颜色)。GLUT_SINGLE表示使用单缓冲,与之对应的还有GLUT_DOUBLE(使用双缓冲)。
glutInitWindowPosition(100, 100); //设置窗口位置
glutInitWindowSize(400, 400);//设置窗口大小
glutCreateWindow("第一个OpenGL程序");
//设置窗口名称,注意:窗口被创建后,并不立即显示到屏幕上。需要调用glutMainLoop才能看到窗口
glutDisplayFunc(&myDisplay); //设置一个函数,当需要进行画图时,这个函数就会被调用
glutMainLoop();
//进行一个消息循环。(这个可能初学者也不太明白,现在只需要知道这个函数可以显示窗口,并且等待窗口关闭后才会返回,这就足够了。)
return 0;
}
单缓冲:(上)
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glFlush();
GLUT_SINGLE单缓冲,屏幕显示调用glFlush(),将图像在当前显示缓存中直接渲染,会有图形跳动(闪烁)问题
双缓冲:(下)
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutSwapBuffers();
GLUT_DOUBLE双缓冲,屏幕显示调用glutSwapBuffers(),将图像先绘制在另外的缓存中,渲染完毕之后,将其整个缓存贴到当前的窗口,能消除闪烁,一般动画要用双缓冲.
// ConsoleApplication3.cpp : 定义控制台应用程序的入口点。
//
#include <GL/glut.h>
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
static int year = 0, spin = 0, day = 0;
static GLint fogMode;
const int n = 100;
const GLfloat R = 1.0f;
const GLfloat Pi = 3.1415926536f;
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(0.0, 1.0, 1.0);
glPushMatrix(); //记住自己的位置
glutSolidSphere(1.0, 20, 16); /* 画太阳半径、20经度、纬度*/
glRotatef(spin / 50, 0.0, 1.0, 0.0); //自转,绕着一个向量以给定角度旋转(正的为逆时针)
glTranslatef(2.0, 1.0, 0.0);
glRotatef(spin / 50, 1.0, 0.0, 0.0); //公转
glRectf(0.1, 0.1, 0.5, 0.5);
glColor3f(0.0, 0.0, 1.0);
glutWireSphere(0.2, 8, 8); /* 画第一颗小行星*/
glColor3f(1.0, 0.0, 0.0);
glTranslatef(2.0, 1.0, 0.0);
glRotatef(2 * spin / 50, 0.0, 1.0, 0.0);
glutSolidSphere(0.5, 16, 8);
glPopMatrix();//回到原来的位置
glutSwapBuffers();
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 0.5, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0, 10.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(400, 400);
glutInitWindowPosition(100, 100);
glutCreateWindow("OpengGL test");
//glutDisplayFunc(DrawCircle);
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
图形 | 函数 | 释义/例子 |
空心圆 | glutWireSphere(半径,经线数量,纬线数量) | glutWireSphere(8.0f, 20, 20) |
实心球 | glutSolidSphere (半径,经线数量,纬线数量) | glutSolidSphere(8.0f, 20, 20) |
空心椎体 | glutWireCone(半径,高,经线数量,纬线数量) | glutWireCone(4.0f, 8.0f, 20, 20) |
实心椎体 | glutSolidCone (半径,高,经线数量,纬线数量) | glutSolidCone (4.0f, 8.0f, 20, 20) |
空心立方体 | glutWireCube(边长) | glutWireCube(8.0f) |
实心立方体 | glutSolidCube(边长) | glutSolidCube(8.0f) |
长方体 |
| 长方体就是在立方体的基础上,放大glScalef(缩小)某一个维度的值 glScled(c,k,g) |
空心甜甜圈 | glutWireTorus (内半径,外半径,横向圆圈数,纵向圆圈数) | glutWireTorus(3.0f, 6.0f, 20, 20) |
实心甜甜圈 | glutSolidTorus (内半径,外半径,横向圆圈数,纵向圆圈数) | glutSolidTorus(3.0f, 6.0f, 20, 20) |
空心茶壶 | glutWireTeapot(半径) | glutWireTeapot(8.0f) |
实心茶壶 | glutSolidTeapot(半径) | glutSolidTeapot(8.0f) |
空心十二面体 | glutWireDodecahedron(半径) | glutWireDodecahedron(8.0f) (默认1) |
实心十二面体 | glutSolidDodecahedron(半径) | glutSolidDodecahedron(8.0f);半径8 (默认1) |
glutWireIcosahedron(半径); 线框20面体 glutSolidIcosahedron(半径); 实心20面体 glutWireOctahedron(半径); 线框8面体 glutSolidOctahedron(半径); 实心8面体 glutWireTetrahedron(半径); 线框4面体 glutSolidTetrahedron(半径); 实心4面体 | ||
圆柱 | void gluCylinder( GLUquadricObj *qobj, GLdouble baseRadius, GLdouble topRadius, GLdouble height, GLint slices, GLint stacks) | Qobj:指定二次曲面对象(使用gluNewQuadric创建)。 baseRadius:指定圆柱体在z = 0处的半径。topRadius:指定圆柱体在z =高度处的半径 height:指定圆柱体的高度 slice:指定围绕z轴的子分区数。 Stacks:指定沿z轴的子分区数。 示例: GLUquadric *gluQ = gluNewQuadric(); gluCylinder(gluQ, 0.5, 0.5, 1.0, 20, 20); glutSwapBuffers(); gluDeleteQuadric(gluQ); |
glVertex2d,glVertex2f,glVertex3f,glVertex3fv,等等。
数字表示参数的个数,2表示有两个参数,3表示三个,4表示四个。
参数表示占比:例如glVertex2f(0.5,0.5),那么代表的是当前窗口中心点左上区坐标的中心点,(1.0,1.0)则代表的是右上角的坐标。
https://blog.csdn.net/qq844352155/article/details/28465919
- (2) 绘制
https://baike.baidu.com/item/glBegin/9516300?fr=aladdin
glBegin(GL_TR??)
for(int i=0; i<n; i++)
glVertex3f(vl[t[i][0]],vl[t[i][1]],vl[t[i][2]]);
glEnd();
- a.函数原型:
void glBegin(GLenummode)
void glEnd(void)
- b.参数说明:
mode:创建图元的类型。可以是以下数值
GL_POINTS:把每一个顶点作为一个点进行处理,顶点n即定义了点n,共绘制N个点
GL_LINES:把每一个顶点作为一个独立的线段,顶点2n-1和2n之间共定义了n条线段,总共绘制N/2条线段
GL_LINE_STRIP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,第n和n+1个顶点定义了线段n,总共绘制n-1条线段
GL_LINE_LOOP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,然后最后一个顶点和第一个顶点相连,第n和n+1个顶点定义了线段n,总共绘制n条线段
GL_TRIANGLES:把每个顶点作为一个独立的三角形,顶点3n-2、3n-1和3n定义了第n个三角形,总共绘制N/3个三角形
GL_TRIANGLE_STRIP:绘制一组相连的三角形,对于奇数n,顶点n、n+1和n+2定义了第n个三角形;对于偶数n,顶点n+1、n和n+2定义了第n个三角形,总共绘制N-2个三角形
GL_TRIANGLE_FAN:绘制一组相连的三角形,三角形是由第一个顶点及其后给定的顶点确定,顶点1、n+1和n+2定义了第n个三角形,总共绘制N-2个三角形
GL_QUADS:绘制由四个顶点组成的一组单独的四边形。顶点4n-3、4n-2、4n-1和4n定义了第n个四边形。总共绘制N/4个四边形
GL_QUAD_STRIP:绘制一组相连的四边形。每个四边形是由一对顶点及其后给定的一对顶点共同确定的。顶点2n-1、2n、2n+2和2n+1定义了第n个四边形,总共绘制N/2-1个四边形
GL_POLYGON:绘制一个凸多边形。顶点1到n定义了这个多边形。
- c.函数说明:
glBegin和glEnd函数限定了一组或多组图元的定点定义。
-
2. 示例
- (1) 圆柱
void Circle()
{
glBegin(GL_TRIANGLE_FAN);//扇形连续填充三角形串
glVertex3f(0.0f, 0.0f, 0.0f);
int i = 0;
for (i = 0; i <= 390; i += 15)
{
float p = i * 3.14 / 180;
glVertex3f(sin(p), cos(p), 0.0f);
}
glEnd();
}
void Cylinder()
{
glBegin(GL_QUAD_STRIP);//连续填充四边形串
int i = 0;
for (i = 0; i <= 390; i+=15)
{
float p = i * 3.14 / 180;
glVertex3f(sin(p), cos(p), 1.0f);
glVertex3f(sin(p), cos(p), 0.0f);
}
glEnd();
Circle();
glTranslatef(0, 0, 1);
Circle();
}
注意:要通过glutReshapeFunc(reshape);函数变换视角,否则看不出是圆柱
void reshape(int w, int h)
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1,1,-1,1,1.5,20);
gluLookAt(1,0,8,1,0,-1,0,1,0);
}
-
三、设置颜色
- 示例
glClearColor(0.9*light, 1 * light, 1 * light, 0.5);//淡蓝色背景
GLfloat light_position[] = { -10.0*cos(float(day)*c), -10.0*sin(float(day)*c), 10.0, 0.0 };
GLfloat white_light[] = { 0.8*light, 0.8*light, 0.8*light, 1.0 }; //灯位置(1,1,1), 最后1-开关
GLfloat Light_Model_Ambient[] = { 0.8*light , 0.8*light , 0.8*light , 1.0 }; //环境光参数
//cout << light<<" "<<day<<endl;
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light); //散射光属性
glLightfv(GL_LIGHT0, GL_SPECULAR, white_light); //镜面反射光
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, Light_Model_Ambient); //环境光参数
glEnable(GL_LIGHTING); //开关:使用光
glEnable(GL_LIGHT0); //打开0#灯
固有坐标系,不可改变,没有偏差。
gluOrtho2D(x_mix, x_max, y_mix, y_max)
用于截取世界坐标系相应区域。在世界坐标系中以从(x_mix, x_max)到(y_mix, y_max)的直线为对角线的矩形部分截取图像,该截图可以被用于显示。
https://blog.csdn.net/dcrmg/article/details/53106457
gluLookAt用来定义观察者(相机)的状态,包括观察者在世界坐标系中所处的位置、看向世界坐标系中的方向(可以理解为眼睛所看向的方向)、观察者头部的朝向(可以在一个平面上360°旋转)。
函数解:”
void gluLookAt ( GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz); 第一二三个参数定义相机在世界坐标系中的位置坐标 第四五六个参数定义相机正对着的世界坐标系中的点的位置坐标,成像后这一点会位于画板的中心位置 第七八九参数,定义相机本身的朝向。这三个坐标是在世界坐标系中的坐标点,可以理解为人站立在相机处头的朝向。这三个坐标是世界坐标系中的坐标点,不是相机坐标系的,只是用来定义方向,注意这个不是视线(镜头)的朝向,而是摆放时相机本身的朝向,跟视线朝向方向是垂直的。 第一组数据就是脑袋的位置 第二组数据就是眼睛看的物体的位置 第三组就是头顶朝向的方向(因为你可以歪着头看同一个物体) |
- 2. 相机内参数
gluPerspective定义的就是相机的内在镜头参数了。
函数解释:
gluPerspective ( GLdouble flvy, GLdouble aspect, GLdouble zNear, GLdouble zFar); 第一个参数flvy,定义可视角的大小,flvy值小,表示从相机(人眼)出发的光线的角度小,此时同等距离下,可观察到的视野范围较小,反之则大。从物体显示在画板的大小来反映,如果flvy值较大,则物体在画板中所占比例就较少,看起来比较小,反之则显示比较大。 第二个参数aspect,定义物体显示在画板上的x和y方向上的比例。aspect小于1,则物体显示出来比实际更高,大于1,显示出来比实际看起来更宽,设为1,会按实际反应长宽比。 第三个参数zNear,定义距离相机(人眼)最近处物体截面相距的距离。这个值越大,表示观测点距离物体距离越远,看起来物体就比较小,反之则比较大。如果物体运动到距离观测点的距离小于了设定的zNear,则物体不会被绘制在画板上。 第四个参数zFar,定义可观测到的物体的最远处截面相距相机的距离。如果物体运动到距离观测点的距离大于了设定的zFar,则物体不会被绘制的画板上。 |
glutInitWindowSize(int width, int height)
width、宽、横;height、高、竖
部分电脑屏幕有1920*1080个像素(比如说我的),该语句用于创建width*height个像素的窗口
以上两个值之间无关。
截图不会适配窗口并直接拉伸,而是需要在视口中显示并拉伸,视口是截图在窗口中显示的区域,即图像只在视口中显示。
视口大小用于把截图和窗口联系起来。
glViewport(int x, int y, GlLsizei w, Glsizei h)可以设定截取的图像在窗口的哪一部分显示。
(x, y)是视口左下角在窗口里位置的坐标;(0, 0)是窗口左下角;w、h是视口的宽和高。截图就在这一部分显示。
“视口”在有些地方也叫“视区”。
平移:glTranslatef(X,Y,Z);
旋转:glRotatef(旋转角度,X,Y,Z); x,y,z表达要围绕哪个坐标轴旋转, 旋转是逆时针的
缩放:glScalef(X,Y,Z)
glPushMatrix(); 固定模型坐标系 X X 绘图、变换、等等 X glPopMatrix(); 回到原坐标系
|
https://blog.csdn.net/xie_zi/article/details/1911891
-
(一)Main中调用函数
glutSpecialFunc(Special);
1、默认按键
变量名 | 按键名 |
GLUT_KEY_F1(-12) | F1(-12) |
GLUT_KEY_LEFT | 左键 |
| 右键 |
| 上键 |
| 下键 |
GLUT_KEY_PAGE_UP | Page up |
| Home |
| end |
| Insert |
| …… |
2、组合按键
- 函数定义
int glutGetModifiers(void); 这个函数的返回值是三个glut.h里预定义的常量里的一个,或它们的或组合。这三个常量是: 1:GLUT_ACTIVE_SHIFT: 返回它,当按下SHIFT键或以按下CAPS LOCK,注意两者同时按下时,不会返回这个值。 2:GLUT_ACTIVE_CTRL: 返回它,当按下CTRL键。 3:GLUT_ACTIVE_ATL:返回它,当按下ATL键。 注意,窗口系统可能会截取一些组合键(modifiers),这是就没有回调发生。 |
- 用法(示例):
- 1、两个键(R+ALT时,变成红色)
void processNormalKeys(unsigned char key, int x, int y) {
if (key == 27)
exit(0);
else if (key=='r') {
int mod = glutGetModifiers();
if (mod == GLUT_ACTIVE_ALT)
red = 0.0;
else
red = 1.0;
}
}
- 2、三个键(CTRL+ALT+F1时,变成红色)
void processSpecialKeys(int key, int x, int y) {
int mod;
switch(key)
{
case GLUT_KEY_F1 :
mod = glutGetModifiers();
if (mod == (GLUT_ACTIVE_CTRL|GLUT_ACTIVE_ALT)) {
red = 1.0; green = 0.0; blue = 0.0;
}
break;
case GLUT_KEY_F2 :
red = 0.0;
green = 1.0;
blue = 0.0;
break;
case GLUT_KEY_F3 :
red = 0.0;
green = 0.0;
blue = 1.0;
break;
}
}
https://blog.csdn.net/hippig/article/details/7755721
- OpenGL 鼠标3D旋转简单实现
#include <GL/glut.h>
#include <math.h>
#include <stdio.h>
static float c=3.14159/180.0f; //弧度和角度转换参数
static int du=90,oldmy=-1,oldmx=-1; //du是视点绕y轴的角度,opengl里默认y轴是上方向
static float r=1.5f,h=0.0f; //r是视点绕y轴的半径,h是视点高度即在y轴上的坐标
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//printf("At:%.2f %.2f %.2f\n",r*cos(c*du),h,r*sin(c*du)); //这就是视点的坐标
glLoadIdentity();
gluLookAt(r*cos(c*du), h, r*sin(c*du), 0, 0, 0, 0, 1, 0); //从视点看远点,y轴方向(0,1,0)是上方向
glColor3f(1.0f, 0.0f, 0.0f);
glutWireTeapot(0.5f);
glFlush();
glutSwapBuffers();
}
void Mouse(int button, int state, int x, int y) //处理鼠标点击
{
if(state==GLUT_DOWN) //第一次鼠标按下时,记录鼠标在窗口中的初始坐标
oldmx=x,oldmy=y;
}
void onMouseMove(int x,int y) //处理鼠标拖动
{
//printf("%d\n",du);
du+=x-oldmx; //鼠标在窗口x轴方向上的增量加到视点绕y轴的角度上,这样就左右转了
h +=0.03f*(y-oldmy); //鼠标在窗口y轴方向上的改变加到视点的y坐标上,就上下转了
if(h>1.0f) h=1.0f; //视点y坐标作一些限制,不会使视点太奇怪
else if(h<-1.0f) h=-1.0f;
oldmx=x,oldmy=y; //把此时的鼠标坐标作为旧值,为下一次计算增量做准备
}
void init()
{
glEnable(GL_DEPTH_TEST);
}
void reshape(int w,int h)
{
glViewport( 0, 0, w, h );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective(75.0f, (float)w/h, 1.0f, 1000.0f);
glMatrixMode( GL_MODELVIEW );
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("OpenGL");
init();
glutReshapeFunc( reshape );
glutDisplayFunc(display);
glutIdleFunc(display); //设置不断调用显示函数
glutMouseFunc(Mouse);
glutMotionFunc(onMouseMove);
glutMainLoop();
return 0;
}
https://blog.csdn.net/wl_soft50/article/details/7802810
glutTimerFunc(unsigned int millis, void (*func)(int value), int value);
glutTimerFunc(毫秒数, 回调函数指针, 区别值);
eg. glutTimerFunc(500, Timerfuc, 1);
void Timerfuc(int value)
{
angle += step;//任意改变
glutPostRedisplay();
glutTimerFunc(100,Timerfuc,1);
}
void SpecialKey(GLint key,GLint x,GLint y);
其中key对应4个方向按键,上下左右按键分别对应于GLUT_KEY_UP、GLUT_KEY_DOWN、GLUT_KEY_LEFT和GLUT_KEY_RIGHT;
x和y是捕捉的当按键事件发生时显示窗口上鼠标点所处的位置,需要注意的是x和y是以左上角为起点(0,0),右下角为终点(windowWidth,windowHeight)。
void Special(int key,int x,int y)
{
if(GLUT_KEY_RIGHT == key)
step = 0.5;
else if(GLUT_KEY_LEFT == key)
step = -0.5;
glutPostRedisplay();
}
glLightfv(GL_LIGHT0, GL_POSITION, LightPosition);
glLightfv(GL_LIGHT0, GL_AMBIENT /*模糊,环境*/, ambientLight);
glLightfv(GL_LIGHT0, GL_DIFFUSE/*漫反射*/, DiffuseLight);
glLightfv(GL_LIGHT0, GL_SPECULAR, SpecularLight);
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
用法:
GLfloat mat_emission[] = {1, 0.8, 0.3};
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
注意结束使用后,要用
GLfloat no_mat[] = { 0.0, 0.0, 0.0, 1.0 };
glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
将自发光取消
https://www.2cto.com/kf/201608/539406.html
- 1、使用:
- 2、示例代码:
(在文件中加入bmp类型图片HeHe.bmp,要求像素为2的指数次方)
https://www.cnblogs.com/evilkant/p/5978572.html
- 3、使用
// ConsoleApplication3.cpp : 定义控制台应用程序的入口点。
//
#include<iostream>
using namespace std;
#include <GL/glew.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include <GL/SOIL.h>
#pragma comment (lib,"glew32.lib")
GLuint texture_earth;
void Initial() {
glewInit();
glEnable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
int earthHeight, earthWidth;
unsigned char *earth = SOIL_load_image("HeHe.bmp", &earthWidth, &earthHeight, 0, SOIL_LOAD_RGB);
glGenTextures(1, &texture_earth);
glBindTexture(GL_TEXTURE_2D, texture_earth);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, earthWidth, earthHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, earth);
SOIL_free_image_data(earth);
}
void ChangeSize(int w, int h) {
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
//截取的图像在窗口的哪一部分显示,可多次调用,建立很多窗口
glMatrixMode(GL_PROJECTION);//投影
glLoadIdentity();
GLfloat fAspect;
fAspect = (GLfloat)w / (GLfloat)h;
gluPerspective(60.0, fAspect, 0.5, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void RenderScene(void) {
GLUquadricObj *quadPlanet = gluNewQuadric();
static float angle = 0.0f;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -10.0f);
glGenerateMipmap(GL_TEXTURE_2D);
gluQuadricTexture(quadPlanet, GLU_TRUE);
glRotatef(angle, 0.0f, 1.0f, 0.0f);
gluSphere(quadPlanet, 1, 50, 50);
angle += 10.0f;
if (angle > 360.0f)
angle = 0.0f;
glutSwapBuffers();
gluDeleteQuadric(quadPlanet);
}
void TimerFunc(int value) {
glutPostRedisplay();
glutTimerFunc(100, TimerFunc, 1);
}
int main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutCreateWindow("sphereTexture");
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);
glutTimerFunc(500, TimerFunc, 1);
Initial();
glutMainLoop();
return 0;
}
4. 效果: