我将包含openGL顶点缓冲区和数据的结构传递给在GPU上绑定和更新日期的便捷函数。现在,我有以下内容:
struct VertexBufferData {
VertexBuffer vbo;
ElementBuffer ebo;
size_t v_cap;
size_t v_count;
size_t i_cap;
size_t i_count;
GLfloat* vertices; // dynamically allocated
GLuint* indices; // dynamically allocated
};
但有时我在编译时知道一些顶点和索引缓冲区的大小,在这种情况下我想这样做:
struct VertexBufferData {
VertexBuffer vbo;
ElementBuffer ebo;
size_t v_cap;
size_t v_count;
size_t i_cap;
size_t i_count;
GLfloat vertices[SOME_CONST_SIZE_1];
GLuint indices[SOME_CONST_SIZE_2];
};
结构几乎相同,但静态数组和指针/动态分配的内存不同,需要不同的类型,这意味着我需要复制很多代码(函数和其他结构,例如void gl_bind_buffers_and_upload_data(VertexBufferData* vbd, GLenum usage)
)只是为了支持这两个版本的结构。
有没有办法将两个结构都视为相同的类型或优雅的解决方法而无需切换到C ++的继承(我试图避免)。我想将数据保存为POD。模板参数化并不能解决问题,但是否有另一种解决C ++问题的轻松方法? (我愿意使用不使用虚函数的功能。)
我的第一个想法是创建某种包装实体,但这听起来太复杂了。我应该接受重复代码吗?