游戏引擎:Class 参数

Game Engine: Class parameter

我正在为游戏引擎做大学工作,我们需要做一个不可知的代码。他们告诉我们自己做剩下的事情,我走在正确的轨道上,但是,当我尝试传递函数的参数时,它说它没有传递参数?我认为这是由于我在那里的 class 参数造成的。我是白痴还是?

错误:(没有缓冲区布局)函数参数不匹配。或者使用代码,您可以看到它显示“Expected an expression”

请帮忙!

顶点缓冲区

/* \file OpenGLVertexBuffer.cpp */
#include "engine_pch.h"
#include <glad/glad.h>
#include "include/independent/platform/OpenGL/OpenGLVertexBuffer.h"


namespace Engine
{
    void BufferLayout::addElement(BufferElement element)
    {
        m_elements.push_back(element);
        calcStrideAndOffset();
    }

    void BufferLayout::calcStrideAndOffset()
    {
       uint32_t l_offset = 0;

        for (auto& element : m_elements)
        {
            element.m_offset = l_offset;
            l_offset += element.m_size;
        }

        m_stride = l_offset;
    }


    OpenGLVertexBuffer::OpenGLVertexBuffer(void * vertices, uint32_t size, BufferLayout layout) : m_layout(layout)
    {
        glCreateBuffers(1, &m_OpenGL_ID);
        glBindBuffer(GL_ARRAY_BUFFER, m_OpenGL_ID);
        glBufferData(GL_ARRAY_BUFFER, size, vertices, GL_DYNAMIC_DRAW);
    }

    OpenGLVertexBuffer::~OpenGLVertexBuffer()
    {
        glDeleteBuffers(1, &m_OpenGL_ID);

    }

    void OpenGLVertexBuffer::edit(void * vertices, uint32_t size, uint32_t offset)
    {
        glBindBuffer(GL_ARRAY_BUFFER, m_OpenGL_ID);
        glBufferSubData(GL_ARRAY_BUFFER, offset, size, vertices);
    }

}

渲染API

/* \file renderAPI.cpp */

#include "engine_pch.h"

#include "rendering/RenderAPI.h"
#include "rendering/indexBuffer.h"
#include "rendering/vertexBuffer.h"

#include "platform/OpenGL/OpenGLIndexBuffer.h"
#include "platform/OpenGL/OpenGLVertexBuffer.h"

#include "systems/log.h"

namespace Engine
{
    RenderAPI::API Engine::RenderAPI::s_API = RenderAPI::API::OpenGL;

    IndexBuffer * IndexBuffer::create(uint32_t * indices, uint32_t count)
    {
        switch (RenderAPI::getAPI())
        {
        case RenderAPI::API::None:
            Log::error("No supported Rendering API");

        case RenderAPI::API::OpenGL:
            return new OpenGLIndexBuffer(indices, count);

        case RenderAPI::API::Direct3D:
            Log::error("Direct3D not currently Supported!");

        case RenderAPI::API::Vulkan:
            Log::error("Vulkan not currently Supported!");


        }
    
    }

    VertexBuffer * VertexBuffer::edit(void* vertices, uint32_t size, uint32_t offset)
    {
        switch (RenderAPI::getAPI())
        {
        case RenderAPI::API::None:
            Log::error("No Supported Rendering API");

        case RenderAPI::API::OpenGL:
            //return new OpenGLVertexBuffer(vertices, sizeof(size), offset);
            new OpenGLVertexBuffer(vertices, size, <BufferLayout> offset);
        }
    }

}

对“new OpenGLVertexBuffer”的调用需要三个参数

  • 无效*
  • 一个uint32_t
  • 一个BufferLayout

你通过了

  • 顶点,空心*(好的)
  • sizeof(size) - 错误。它计算变量 (!) size 的大小,即 4(uint32 始终为 32 bits/4 字节)。所以你将常量 4 作为第二个参数传递。不是你想要的。
  • offset - 又错了。第三个参数应为 BufferLayout 类型。您正在尝试传递一个 uint32_t,而您应该传递一个 BufferLayout

一般来说,您需要阅读类型(为什么 uint32_t 不是 BufferLayout)、函数(参数)、构造函数。

您的开关中还缺少 break 语句。研究 switch 语句以了解我的意思。

并且您正在使用指针 (return new something)。如果他们在大学里教你这些,那么你正在上的课程就非常过时了。作为初学者,您永远不必使用指针,永远不要使用 new。您可以使用 std::shared_ptr<VertexBuffer> 的 C++ 标准方式,使用 std::make_shared... 而不是 new。指针的问题在于它们很容易被错误处理。您会忘记在适当的地方调用 delete,这将导致内存泄漏。或者你会在错误的地方调用 delete,这将导致 'use after free' 或 'calling delete for a deleted pointer'。 shared_ptr 和类似的 类 卸下包袱,为您完成工作。

在现代 C++ 中,大大 减少了对指针的需求。

最后:当你post提问时,请附上 a: exact 编译器错误 b: 确切 位置,发生此错误的位置。

例如,您可以在示例代码中包含 // ERROR MESSAGE HERE 注释。 这两点都会增加有人回答您问题的可能性。