众所周知,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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/fuming0210sc/article/details/47012853