/// <summary>
/// The OpenGL Attribute flags.
/// </summary>
[Flags]
public enum AttributeMask : uint
{
None = 0,
Current = OpenGL.GL_CURRENT_BIT,
Point = OpenGL.GL_POINT_BIT,
Line = OpenGL.GL_LINE_BIT,
Polygon = OpenGL.GL_POLYGON_BIT,
PolygonStipple = OpenGL.GL_POLYGON_STIPPLE_BIT,
PixelMode = OpenGL.GL_PIXEL_MODE_BIT,
Lighting = OpenGL.GL_LIGHTING_BIT,
Fog = OpenGL.GL_FOG_BIT,
DepthBuffer = OpenGL.GL_DEPTH_BUFFER_BIT,
AccumBuffer = OpenGL.GL_ACCUM_BUFFER_BIT,
StencilBuffer = OpenGL.GL_STENCIL_BUFFER_BIT,
Viewport = OpenGL.GL_VIEWPORT_BIT,
Transform = OpenGL.GL_TRANSFORM_BIT,
Enable = OpenGL.GL_ENABLE_BIT,
ColorBuffer = OpenGL.GL_COLOR_BUFFER_BIT,
Hint = OpenGL.GL_HINT_BIT,
Eval = OpenGL.GL_EVAL_BIT,
List = OpenGL.GL_LIST_BIT,
Texture = OpenGL.GL_TEXTURE_BIT,
Scissor = OpenGL.GL_SCISSOR_BIT,
All = OpenGL.GL_ALL_ATTRIB_BITS,
}
这段代码定义了一个名为 AttributeMask 的枚举类型,它是用来表示 OpenGL 的各种属性标志。标志是通过位操作来控制不同的 OpenGL 状态。这些标志主要用于指定 OpenGL 状态的启用、禁用或者修改,通常与 glPushAttrib 和 glPopAttrib 等函数一起使用,来保存和恢复 OpenGL 的状态。
1. AttributeMask 枚举的定义:
该枚举使用了 [Flags] 特性,这表示每个枚举值都可以与其他值进行按位“或”运算(|)。这意味着可以组合多个标志来表示多个属性。这种方式在 OpenGL 中非常常见,尤其是在操作状态位时。
2. 枚举值解析:
public enum AttributeMask : uint
{
None = 0, // 没有任何属性
Current = OpenGL.GL_CURRENT_BIT, // 当前颜色、顶点等(例如:glColor, glVertex)
Point = OpenGL.GL_POINT_BIT, // 点样式(例如:glPointSize)
Line = OpenGL.GL_LINE_BIT, // 线条样式(例如:glLineWidth)
Polygon = OpenGL.GL_POLYGON_BIT, // 多边形样式(例如:glPolygonMode)
PolygonStipple = OpenGL.GL_POLYGON_STIPPLE_BIT, // 多边形纹理样式(例如:glPolygonStipple)
PixelMode = OpenGL.GL_PIXEL_MODE_BIT, // 像素模式(例如:glPixelStorei)
Lighting = OpenGL.GL_LIGHTING_BIT, // 光照(例如:glEnable(GL_LIGHTING))
Fog = OpenGL.GL_FOG_BIT, // 雾化效果(例如:glEnable(GL_FOG))
DepthBuffer = OpenGL.GL_DEPTH_BUFFER_BIT, // 深度缓冲(例如:glEnable(GL_DEPTH_TEST))
AccumBuffer = OpenGL.GL_ACCUM_BUFFER_BIT, // 累加缓冲区(例如:glAccum)
StencilBuffer = OpenGL.GL_STENCIL_BUFFER_BIT, // 模板缓冲区(例如:glStencilFunc)
Viewport = OpenGL.GL_VIEWPORT_BIT, // 视口设置(例如:glViewport)
Transform = OpenGL.GL_TRANSFORM_BIT, // 变换(例如:glTranslate, glRotate)
Enable = OpenGL.GL_ENABLE_BIT, // 启用/禁用状态(例如:glEnable(GL_BLEND))
ColorBuffer = OpenGL.GL_COLOR_BUFFER_BIT, // 颜色缓冲区(例如:glClearColor)
Hint = OpenGL.GL_HINT_BIT, // 提示(例如:glHint)
Eval = OpenGL.GL_EVAL_BIT, // 评估(例如:glMap1f, glMap2f)
List = OpenGL.GL_LIST_BIT, // 显示列表(例如:glNewList)
Texture = OpenGL.GL_TEXTURE_BIT, // 纹理(例如:glEnable(GL_TEXTURE_2D))
Scissor = OpenGL.GL_SCISSOR_BIT, // 剪裁(例如:glScissor)
All = OpenGL.GL_ALL_ATTRIB_BITS, // 所有标志
}
每个枚举值对应于 OpenGL 的一个属性标志,这些标志通常用在 OpenGL 的上下文状态管理中,标志的作用是对 OpenGL 的状态进行细粒度控制。常见的做法是使用这些标志来保存当前状态(使用 glPushAttrib)和恢复状态(使用 glPopAttrib),从而避免在不同的 OpenGL 操作中手动管理和修改每一个状态。
3. 一些标志的具体说明:
None = 0: 没有任何标志。
Current: 控制当前的颜色、顶点等属性。这通常涉及到当前顶点、颜色、法线等的状态。
Point: 控制点的渲染样式,比如点的大小 (glPointSize)。
Line: 控制线的渲染样式,比如线的宽度 (glLineWidth)。
Polygon: 控制多边形的渲染样式,例如设置面剔除、填充模式等。
Lighting: 控制 OpenGL 中的光照系统。光照的启用或禁用会影响到所有光源的计算。
Fog: 控制雾化效果。启用或禁用雾效果。
DepthBuffer: 控制深度测试。深度测试可以用来决定哪些像素被渲染,哪些被丢弃。
StencilBuffer: 控制模板缓冲区的使用,通常用于图形遮罩、轮廓检测等效果。
Viewport: 控制视口的设置,即窗口中 OpenGL 绘制区域的尺寸和位置。
Enable: 启用或禁用特定的 OpenGL 功能,例如启用或禁用抗锯齿、混合等。
ColorBuffer: 颜色缓冲区的设置,通常涉及清除或更新颜色缓冲。
Texture: 纹理的使用(启用纹理映射)。
Scissor: 剪裁区域的设置(glScissor),用于控制在渲染时只绘制指定的区域。
4. All 标志:
All 标志表示所有属性的组合,即所有这些 OpenGL 状态都会被同时保存或恢复。使用 All 时,相当于启用了所有与 OpenGL 渲染相关的属性标志。
5. 常见的用途:
glPushAttrib 和 glPopAttrib:glPushAttrib 将当前的 OpenGL 状态保存到栈中,而 glPopAttrib 则从栈中恢复这些状态。你可以使用 AttributeMask 枚举来指定要保存的 OpenGL 状态的类型。
例如:
glPushAttrib(AttributeMask.ColorBuffer | AttributeMask.DepthBuffer);
// 执行需要修改颜色缓冲区和深度缓冲区的操作
glPopAttrib(); // 恢复颜色缓冲区和深度缓冲区的状态
这样可以更精确地控制 OpenGL 状态的保存与恢复,而不是保存所有的状态。
总结:
AttributeMask 枚举提供了一种方便的方式来控制和保存 OpenGL 的不同渲染状态,标志通过位运算组合使用。使用这些标志,可以精确地管理渲染时的状态,并避免对不必要的状态进行修改。