状态机:
1.它有记忆的能力,能够记住自己当前的状态
2.它可以接收输入,根据输入的内容和自己的状态,修改自己的状态,
并且可以得到输出。
3. 当它进入某个特殊的状态的时候,它不再接收输入,停止工作。
理解电脑成为状态机:
1. 电脑的存储器,可以记住电脑自己当前的状态。
2. 电脑的输入设备接收输入,根据输入的内容和自己的状态,修改自己的状态,并
且可以得到输出。
3. 当它进入某个特殊的状态的时候,它不再接收输入,停止工作。
OpenGL 理解为状态机:
1. OpenGL 可以记录自己状态。(比如使用的颜色、开启混合功能)
2. OpenGL可以接收输入,根据输入的内容和自己的状态,修改自己的状态,并且
可以得到输出。
3. OpenGL 可以进入停止状态,不再接收输入
OpenGL 是一个状态机,它保持自身的状态,除非用户输入一条命令让它改变状态。
通过glEnable 来启用转台,通过glDisable 来禁用它们。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glEnable(GL_LIGHTING);
glEnable(GL_TEXTURE_2D);
可以用glIsEnabled 函数来检测这些状态是否被开启
glIsEnabled(GL_DEPTH_TEST);
glIsEnabled(GL_BLEND);
glIsEnabled(GL_CULL_FACE);
glIsEnabled(GL_LIGHTING);
glIsEnabled(GL_TEXTURE_2D);
if(glIsEnabled(GL_BLEND))
{
}
else
{
}
OpenGL 提供四个函数 把状态值 存放到 指针所指向的位置
glGetBooleanv, glGetIntegerv, glGetFloatv, glGetDoublev
GLfloat lw;
glGetFloatv(GL_LINE_WIDTH,&lw);
GLfloat cc[4];
glGetFloatv(GL_CURRENT_COLOR,cc);
GLint viewport[4];
glGetIntegerv(GL_VIEWPORT,viewport);
GLfloat cc[4];
GLdouble dcc[4];
glGetFloatv(GL_CURRENT_COLOR,cc);
glGetDoublev(GL_CURRENT_COLOR,dcc);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
OpenGL 设置状态
OpenGL 提供大量的函数来设置状态:glColor*, glMaterial*,glEnable, glDisable,大多
数OpenGL 函数都是用来设置 OpenGL 状态的。
流程如图:
说明:
1. Vertex data: 顶点数据。比如 指定的颜色、 纹理坐标、法线向量、顶点坐标
等都属于顶点数据。
2. Pixel data: 像素数据。我们在绘制像素、指定纹理时都会用到像素数据。
3. Display list: 显示列表。可以将调用OpenGL函数保存起来
4. Evaluators: 求值器。可以指定贝塞尔曲线或者贝塞尔曲面,可以理解为指定
顶点、纹理坐标、指定法线向量等
5. Per-vertex operations and primitive assembly: 单一的顶点操作以及图元装
配。首先 对单一顶点进行操作,比如变换, 然后把顶点装配为图元(绘制简
单的图形)
6. Pixel operations: 像素操作。例如把内存中的像素数据格式转化为图形硬件所
支持的数据格式。对于纹理,可以替换其中的一部分像素,这也属于像素操
作。
7. . Rasterization: 光栅化。顶点数据和像素数据在这里交汇,形成完整的、可以
显示的一整块。里面包含若干个像素。这一整块被称为 fragment(片段)
8. Per-fragment operations: 片段操作。包括各种片段测试
9. Framebuffer: 帧缓冲。这是一块存储空间,显示设备从这里读取数据,然后显
示到屏幕。
10. . Texture assembly: 纹理装配。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19