OpenGL学习笔记(入门笔记)

计算及图形学要做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函数限定了一组或多组图元的定点定义。

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

glutSpecialFunc(Special);

1、默认按键

变量名

按键名

GLUT_KEY_F1(-12)

F1(-12)

GLUT_KEY_LEFT

左键

GLUT_KEY_RIGHT

右键

GLUT_KEY_UP

上键

GLUT_KEY_DOWN

下键

GLUT_KEY_PAGE_UP

Page up

GLUT_KEY_HOME 

Home

GLUT_KEY_END

end

GLUT_KEY_INSERT

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. 效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值