66 lines
2.4 KiB
Markdown
66 lines
2.4 KiB
Markdown
# OpenGLVertexArray
|
||
|
||
**命名空间**: `XCEngine::RHI`
|
||
|
||
**类型**: `class`
|
||
|
||
**头文件**: `XCEngine/RHI/OpenGL/OpenGLVertexArray.h`
|
||
|
||
**描述**: OpenGL 后端的轻量 VAO 封装,用于保存顶点属性布局和索引缓冲绑定。
|
||
|
||
## 概览
|
||
|
||
`OpenGLVertexArray` 是一个非常直接的原生 VAO 包装器。它主要负责三件事:
|
||
|
||
- 创建 VAO
|
||
- 往 VAO 里写顶点属性描述
|
||
- 记录一个索引缓冲对象 ID
|
||
|
||
它不是完整的现代输入装配系统,也不是跨后端 `InputLayout` 的全部落地点。当前引擎里更完整的绘制路径仍然依赖 `OpenGLCommandList`、`OpenGLPipelineState` 和更高层的输入布局描述。
|
||
|
||
## 当前实现的真实行为
|
||
|
||
- [Initialize](Initialize.md) 只调用 `glGenVertexArrays`
|
||
- [AddVertexBuffer](AddVertexBuffer.md) 统一走 `glVertexAttribPointer`
|
||
- [SetIndexBuffer](SetIndexBuffer.md) 会绑定 `GL_ELEMENT_ARRAY_BUFFER`,但 `type` 参数当前被忽略
|
||
- [GetIndexCount](GetIndexCount.md) 当前没有实际意义,因为 `m_indexCount` 从未更新
|
||
- [Shutdown](Shutdown.md) 只删除 VAO,不会清空 `m_indexBuffer`、`m_indexCount` 或 `m_vertexBufferCount`
|
||
|
||
## 设计背景
|
||
|
||
VAO 属于典型的 OpenGL 原生状态对象。把它保留为一个单独的小封装,有两个实际好处:
|
||
|
||
- 测试和 OpenGL 专用样例代码可以直接操作它
|
||
- 上层不必每次都重复写一遍 VAO 创建与属性配置样板代码
|
||
|
||
但从商业级引擎角度看,它更像“后端工具层”,而不是长期唯一的输入装配抽象。
|
||
|
||
## 生命周期
|
||
|
||
- [OpenGLVertexArray()](Constructor.md) 初始化为空对象
|
||
- [Initialize](Initialize.md) 创建原生 VAO
|
||
- [AddVertexBuffer](AddVertexBuffer.md) / [SetIndexBuffer](SetIndexBuffer.md) 写入状态
|
||
- [Bind](Bind.md) / [Unbind](Unbind.md) 切换当前 VAO
|
||
- [Shutdown](Shutdown.md) 删除原生 VAO
|
||
|
||
## 当前限制
|
||
|
||
- 不区分浮点、整数、双精度属性专用写入路径
|
||
- 不维护真实索引数量
|
||
- `type` 参数只保留接口形状,没有参与行为
|
||
- 缺少错误处理和状态校验
|
||
|
||
## 关键方法
|
||
|
||
- [Initialize](Initialize.md)
|
||
- [AddVertexBuffer](AddVertexBuffer.md)
|
||
- [SetIndexBuffer](SetIndexBuffer.md)
|
||
- [Bind](Bind.md)
|
||
- [Shutdown](Shutdown.md)
|
||
|
||
## 相关文档
|
||
|
||
- [OpenGLCommandList](../OpenGLCommandList/OpenGLCommandList.md)
|
||
- [OpenGLBuffer](../OpenGLBuffer/OpenGLBuffer.md)
|
||
- [OpenGLPipelineState](../OpenGLPipelineState/OpenGLPipelineState.md)
|