游戏引擎: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
注释。
这两点都会增加有人回答您问题的可能性。
我正在为游戏引擎做大学工作,我们需要做一个不可知的代码。他们告诉我们自己做剩下的事情,我走在正确的轨道上,但是,当我尝试传递函数的参数时,它说它没有传递参数?我认为这是由于我在那里的 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
注释。
这两点都会增加有人回答您问题的可能性。