看opengl写代码(10) 使用属性数组

本文介绍了OpenGL的状态机特性,重点讲解如何利用属性数组来保存和恢复状态。文章提到了20组服务器属性组和2组客户端属性组,并引用外部资源详细列出属性组包含的属性。通过glPushAttrib和glPopAttrib函数的使用示例,展示了在蓝色矩阵和绿色矩阵之间切换的效果,以此实现状态的切换。

众所周知,OPENGL 是一个状态机,有很多 各种 各样的 状态。我们 可以 使用 属性数组 来 保存 / 恢复 一组 状态。总共 有 20组 服务器属性组  和 2组 客户端属性组。

关于 这些属性组 里 有哪些 属性。 这个网站 详细 说明了: http://www.cnblogs.com/oiramario/archive/2010/04/13/1711114.html

glPushAttrib(mask) :参数 mask  代表着 某种属性组; 函数 将 属性组 的 当前 属性 入栈

glPopAttrib(void) : 无参数; 将 栈顶 的 属性 出栈 ,并 将 出栈的  属性 设置 为 OPENGL 当前 状态。


下面的 示例  使用 将 属性组 入栈,出栈 实现了 在 蓝色矩阵 和 绿色 矩阵 之间 进行 切换。

下面 上代码:

// doubleBuffer.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <gl/glut.h>
static bool isChange = false;
static int  changeTimes = 0;
void init(){
	glClearColor(0.0,0.0,0.0,0.0);
	glShadeModel(GL_FLAT);//使用单一着色
	glColor3f(0,1,0);
	glPushAttrib(GL_CURRENT_BIT);
	glColor3f(0,0,1);
}

void display(){
	printf("-----------disPlay-------%d----",changeTimes);
	glClear(GL_COLOR_BUFFER_BIT);
	if (isChange == true){
		if (changeTimes % 2 == 1){
			glPopAttrib();
			printf("change green\n");;
		}
		else{
			glPushAttrib(GL_CURRENT_BIT);
			glColor3f(0,0,1);
			printf("change blue\n");
		}
		isChange = false;
	}
	glRectf(-0.5,-0.5,0.5,0.5);
	glFlush();
}


void changeColor(){
	isChange = true;
	changeTimes ++;
	glutPostRedisplay();  
	printf("----------chilk------------");
}

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



int _tmain(int argc, _TCHAR* argv[])
{
	glutInit(&argc,(char**)argv);
	glutInitWindowSize(500,500);
	glutInitWindowPosition(0,0);
	glutCreateWindow("属性组");
	init();
	glutDisplayFunc(display);
	glutMouseFunc(mouse);
	glutMainLoop();
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值