1.8 KiB
1.8 KiB
OpenGLVertexArray
OpenGL 顶点数组对象 (VAO) 封装。
头文件
#include <XCEngine/RHI/OpenGL/OpenGLVertexArray.h>
VertexAttribute
struct VertexAttribute {
unsigned int index; // 属性索引 (layout location)
int count; // 组件数量 (1-4)
unsigned int type; // GL 类型 (GL_FLOAT, etc.)
bool normalized; // 是否归一化
size_t stride; // 顶点步长
size_t offset; // 属性偏移
};
公共成员函数
OpenGLVertexArray()
~OpenGLVertexArray()
bool Initialize()
void AddVertexBuffer(unsigned int buffer, const VertexAttribute& attribute)
void SetIndexBuffer(unsigned int buffer, unsigned int type)
void Shutdown()
void Bind() const
void Unbind() const
unsigned int GetID() const
unsigned int GetIndexBuffer() const
unsigned int GetIndexCount() const
内部成员
| 成员 | 类型 | 描述 |
|---|---|---|
m_vao |
unsigned int |
GL VAO ID |
m_indexBuffer |
unsigned int |
索引缓冲区 |
m_indexCount |
unsigned int |
索引数量 |
m_vertexBufferCount |
int |
顶点缓冲区数量 |
使用示例
OpenGLVertexArray vao;
vao.Initialize();
// Position attribute
VertexAttribute pos;
pos.index = 0;
pos.count = 3;
pos.type = GL_FLOAT;
pos.normalized = false;
pos.stride = sizeof(Vertex);
pos.offset = 0;
vao.AddVertexBuffer(vb.GetID(), pos);
// UV attribute
VertexAttribute uv;
uv.index = 1;
uv.count = 2;
uv.type = GL_FLOAT;
uv.normalized = false;
uv.stride = sizeof(Vertex);
uv.offset = sizeof(float) * 3;
vao.AddVertexBuffer(vb.GetID(), uv);
// Index buffer
vao.SetIndexBuffer(ib.GetID(), GL_UNSIGNED_SHORT);
vao.Bind();
glDrawElements(GL_TRIANGLES, vao.GetIndexCount(), GL_UNSIGNED_SHORT, 0);