You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

游戏引擎作业中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 02:45:03