学习OpenGL(二)双缓冲绘图

【前言】

上一节中我们使用的glut,当时不太理解为什么学opengl非得用这个开发包,后来看完第一章才明白。

由于opengl是跨平台的,并且用于窗口界面中的绘制。但窗口与系统有关心,那么将无法统一,所以opengl是核心库,它只负责绘制。窗口操作交给其他程序接口去负责,windows上使用了glut来封装opengl使其能与系统交互。

以上是个人理解,仅供参考。

【正文】

上一节中我们在glutInitDisplayMode函数里设置了GLUT_DOUBLE,这就是双缓冲标识。

双缓冲使得窗口显示一个缓存内容时,另一个缓存加载下一次要显示的内容。这样来回切换时,衔接会很顺畅感觉舒服。

双缓冲在动画上体现得多,下面我们用代码例子来感受一下。

【例子】

static GLfloat spin = 0.0;
static GLfloat col = 0.0;

void init()
{
	glClearColor(0.0, 0.0, 0.0, 0.0);
	glShadeModel(GL_FLAT);
}

void display()
{
	glClear(GL_COLOR_BUFFER_BIT);
	glPushMatrix();
	glRotated(spin, 0.0, 0.0, 1.0);
	glColor3f(col, 1, 1);
	glRectf(-25, -25, 25, 25);
	glPopMatrix();
	glutSwapBuffers();
}

void spinDisplay()
{
	spin += 2.0;
	if(spin >= 360.0)
		spin -= 360.0;
	col += 0.1;
	if(col > 1.0)
		col -= 1.0;
	glutPostRedisplay();
}

void reshape(GLsizei w,GLsizei h)
{
	glViewport(0,0,w,h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	//改变投影矩阵
	glOrtho(-50,50,-50,50,-1.0, 1.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

void mouse(int button, int state, int x, int y)
{
	switch(button)
	{
	case GLUT_LEFT_BUTTON:
		if(state == GLUT_DOWN)
			glutIdleFunc(spinDisplay);
		break;
	case GLUT_RIGHT_BUTTON:
		break;
	case GLUT_MIDDLE_BUTTON:
		if(state == GLUT_DOWN)
			glutIdleFunc(NULL);
		break;
	default:
		break;
	}
}

int _tmain(int argc, char* argv[])
{
	glutInit(&argc, argv);   
	glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
	glutInitWindowPosition(500, 250);   
	glutInitWindowSize(400, 400);   
	glutCreateWindow("OpenGL程序");   
	glutDisplayFunc(&display);
	glutReshapeFunc(&reshape);
	glutMouseFunc(&mouse);
	glutMainLoop();   
	return 0;  
}
【效果】

【总结】

本节主要了解glut和双缓冲的意义。

掌握以下几个函数的使用:

glutSwapBuffers()

glutPostRedisplay()

glutIdleFunc()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值