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

来源:互联网 发布:mac 桌面壁纸位置 编辑:程序博客网 时间:2024/06/06 12:56

众所周知,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;}



1 0