136 lines
3.3 KiB
Markdown
136 lines
3.3 KiB
Markdown
# OpenGLBuffer
|
||
|
||
OpenGL 缓冲区的实现,封装 OpenGL buffer object。
|
||
|
||
## 头文件
|
||
|
||
```cpp
|
||
#include <XCEngine/RHI/OpenGL/OpenGLBuffer.h>
|
||
```
|
||
|
||
## 继承关系
|
||
|
||
```
|
||
RHIBuffer (interface)
|
||
└── OpenGLBuffer (implementation)
|
||
```
|
||
|
||
## OpenGLBufferType 枚举
|
||
|
||
| 值 | 描述 |
|
||
|----|------|
|
||
| `Vertex` | 顶点缓冲区 |
|
||
| `Index` | 索引缓冲区 |
|
||
| `Uniform` | Uniform 缓冲区 (UBO) |
|
||
| `CopyRead` | 复制源缓冲区 |
|
||
| `CopyWrite` | 复制目标缓冲区 |
|
||
| `AtomicCounter` | 原子计数器缓冲区 |
|
||
| `DispatchIndirect` | 间接计算调用缓冲区 |
|
||
| `DrawIndirect` | 间接绘制缓冲区 |
|
||
| `ShaderBindingTable` | 光线追踪 Shader 绑定表 |
|
||
|
||
## 公共成员函数
|
||
|
||
### 构造函数与析构函数
|
||
|
||
#### `OpenGLBuffer()`
|
||
|
||
#### `~OpenGLBuffer() override`
|
||
|
||
### 初始化
|
||
|
||
#### `bool Initialize(OpenGLBufferType type, size_t size, const void* data = nullptr, bool dynamic = false)`
|
||
通用初始化。
|
||
- `type`: 缓冲区类型
|
||
- `size`: 大小(字节)
|
||
- `data`: 初始数据(可选)
|
||
- `dynamic`: 是否动态更新
|
||
|
||
#### `bool InitializeVertexBuffer(const void* data, size_t size)`
|
||
初始化顶点缓冲区。
|
||
|
||
#### `bool InitializeIndexBuffer(const void* data, size_t size)`
|
||
初始化索引缓冲区。
|
||
|
||
#### `void Shutdown() override`
|
||
|
||
### 绑定操作
|
||
|
||
#### `void Bind() const`
|
||
绑定缓冲区到当前 target。
|
||
|
||
#### `void Unbind() const`
|
||
解除绑定。
|
||
|
||
#### `void BindBase(unsigned int target, unsigned int index) const`
|
||
绑定到指定的 binding point(用于 UBO、SSBO 等)。
|
||
|
||
### 数据操作
|
||
|
||
#### `void* Map() override`
|
||
映射缓冲区到 CPU。
|
||
|
||
#### `void Unmap() override`
|
||
解除映射。
|
||
|
||
#### `void SetData(const void* data, size_t size, size_t offset = 0) override`
|
||
更新缓冲区数据。
|
||
|
||
### 属性
|
||
|
||
#### `unsigned int GetID() const`
|
||
获取 OpenGL buffer ID。
|
||
|
||
#### `uint64_t GetSize() const override`
|
||
获取缓冲区大小。
|
||
|
||
#### `OpenGLBufferType GetType() const`
|
||
获取缓冲区类型。
|
||
|
||
#### `bool IsDynamic() const`
|
||
是否动态缓冲区。
|
||
|
||
#### `BufferType GetBufferType() const override / void SetBufferType(BufferType type) override`
|
||
|
||
#### `uint32_t GetStride() const override / void SetStride(uint32_t stride) override`
|
||
|
||
#### `void* GetNativeHandle() override`
|
||
返回 `reinterpret_cast<void*>(static_cast<uintptr_t>(m_buffer))`
|
||
|
||
#### `ResourceStates GetState() const override`
|
||
返回 `ResourceStates::Common`(OpenGL 无显式状态)
|
||
|
||
#### `const std::string& GetName() const override / void SetName(...) override`
|
||
|
||
## 内部成员
|
||
|
||
| 成员 | 类型 | 描述 |
|
||
|------|------|------|
|
||
| `m_buffer` | `unsigned int` | GL buffer ID |
|
||
| `m_size` | `size_t` | 大小 |
|
||
| `m_isIndexBuffer` | `bool` | 是否索引缓冲区 |
|
||
| `m_dynamic` | `bool` | 是否动态 |
|
||
| `m_type` | `OpenGLBufferType` | 缓冲区类型 |
|
||
| `m_bufferType` | `BufferType` | RHI 缓冲区类型 |
|
||
| `m_stride` | `uint32_t` | 顶点步长 |
|
||
| `m_name` | `std::string` | 名称 |
|
||
|
||
## 使用示例
|
||
|
||
```cpp
|
||
OpenGLBuffer vb;
|
||
float vertices[] = { ... };
|
||
vb.InitializeVertexBuffer(vertices, sizeof(vertices));
|
||
vb.SetBufferType(BufferType::Vertex);
|
||
vb.SetStride(sizeof(float) * 5);
|
||
|
||
OpenGLBuffer ib;
|
||
uint16_t indices[] = { 0, 1, 2, ... };
|
||
ib.InitializeIndexBuffer(indices, sizeof(indices));
|
||
|
||
// Bind and draw
|
||
vb.Bind();
|
||
ib.Bind();
|
||
glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_SHORT, 0);
|
||
```
|