游戏引擎作业中BufferLayout类传参导致函数参数不匹配报错求助
问题排查与修复方案
核心问题总览
你遇到的报错是三处逻辑错误共同导致的:
- 静态工厂函数设计错误,把创建顶点缓冲的
create函数错写为了实例成员才有的edit函数 - 函数参数缺失,创建
OpenGLVertexBuffer必须传入BufferLayout类型参数,你现有代码的工厂函数没有这个入参 - 语法错误,
<BufferLayout> offset是完全不符合C++语法的错误写法,尖括号用于模板参数传递,不能用来做类型转换,所以会报Expected an expression错误
分步修复
1. 修正VertexBuffer类的接口声明
修改头文件rendering/vertexBuffer.h,把错误的静态edit函数替换为正确的工厂函数create,保留实例edit函数用于修改已有缓冲区数据:
class VertexBuffer { public: // 新增正确的静态工厂函数,增加BufferLayout入参 static VertexBuffer* create(void* vertices, uint32_t size, BufferLayout layout); // 实例edit函数保留,用于修改已创建的缓冲区数据 virtual void edit(void* vertices, uint32_t size, uint32_t offset) = 0; // 其他原有类成员保持不变 };
2. 重写renderAPI.cpp中的工厂函数实现
替换原有错误的VertexBuffer::edit静态函数实现,同时补全switch分支的返回逻辑:
VertexBuffer * VertexBuffer::create(void* vertices, uint32_t size, BufferLayout layout) { switch (RenderAPI::getAPI()) { case RenderAPI::API::None: Log::error("No Supported Rendering API"); return nullptr; case RenderAPI::API::OpenGL: return new OpenGLVertexBuffer(vertices, size, layout); case RenderAPI::API::Direct3D: Log::error("Direct3D not currently Supported!"); return nullptr; case RenderAPI::API::Vulkan: Log::error("Vulkan not currently Supported!"); return nullptr; default: return nullptr; } }
3. 正确使用接口
创建顶点缓冲区时先构造BufferLayout对象再传入工厂函数即可:
// 先定义顶点布局 BufferLayout layout = { { ShaderDataType::Float3, "a_Position" }, { ShaderDataType::Float4, "a_Color" } }; // 创建顶点缓冲 VertexBuffer* vbo = VertexBuffer::create(vertices, sizeof(vertices), layout); // 后续修改缓冲数据时调用实例的edit方法 vbo->edit(newVertices, sizeof(newVertices), 0);
内容的提问来源于stack exchange,提问作者TitanDan
相关产品推荐
相关产品推荐

