#c #game-engine
Вопрос:
Я работаю в университете над игровым движком, и нам нужно было написать агностический код. Они сказали нам сделать все остальное самостоятельно, и я на правильном пути, однако, когда я пытаюсь передать параметры функции, она говорит, что не передает аргументы? Я считаю, что это связано с параметром класса, который у меня там есть. Я веду себя как идиот или ?
Ошибка: (без компоновки буфера) аргументы функции не совпадают. Или с помощью кода, который вы можете видеть, написано «Ожидаемое выражение».
Пожалуйста, помогите!
Буфер вершин
/* file OpenGLVertexBuffer.cpp */ #include "engine_pch.h" #include lt;glad/glad.hgt; #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 (autoamp; 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, amp;m_OpenGL_ID); glBindBuffer(GL_ARRAY_BUFFER, m_OpenGL_ID); glBufferData(GL_ARRAY_BUFFER, size, vertices, GL_DYNAMIC_DRAW); } OpenGLVertexBuffer::~OpenGLVertexBuffer() { glDeleteBuffers(1, amp;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, lt;BufferLayoutgt; offset); } } }
Ответ №1:
Вызов «нового OpenGLVertexBuffer» ожидает трех аргументов
- пустота*
- uint32_t
- a
BufferLayout
Вы проходите
- вершины, пустота* (хорошо)
- sizeof(размер) — неверно. Он вычисляет размер переменной(!)
size
, который равен 4 (uint32 всегда 32 бита/4 байта). Таким образом, вы передаете константу 4 в качестве второго параметра. Не то, чего ты хочешь. - смещение — опять неправильно. Ожидается, что третий параметр будет иметь тип
BufferLayout
. Вы пытаетесь пройти аuint32_t
, где вы должны были пройти аBufferLayout
.
В общем, вам нужно прочитать о типах (почему uint32_t не a BufferLayout
), функциях (параметрах), конструкторах.
Кроме того break
, в вашем коммутаторе отсутствуют операторы. Изучите это switch
утверждение, чтобы понять, что я имею в виду.
И вы используете указатели (возврат new something
). Если вас этому учат в университете, то курс, который вы проходите, очень устарел. Как новичку, вам НИКОГДА не придется использовать указатели, НИКОГДА НЕ работайте с new
ними . Вместо этого вы могли бы использовать стандартные способы C std::shared_ptrlt;VertexBuffergt;
, используя std::make_shared...
вместо new
. Проблема с указателями заключается в том, что с ними слишком легко неправильно обращаться. Вы забудете позвонить delete
в нужное место(ы), что приведет к утечке памяти. Или вы будете звонить delete
в неправильных местах, что приведет к «использованию после бесплатного» или «вызову удаления для удаленного указателя». shared_ptr
и подобные занятия снимут с вас бремя и сделают всю работу за вас.
Потребность в указателях значительно уменьшилась в современном C .
Наконец: Когда вы публикуете вопрос, пожалуйста, укажите a: точную ошибку компилятора b: точное место, где возникает эта ошибка.
Вы могли бы, например, включить // ERROR MESSAGE HERE
комментарий в свой пример кода. Оба пункта повысят вероятность того, что кто-то ответит на ваши вопросы.
Комментарии:
1. Спасибо! У меня действительно есть базовое понимание, но мне нужно больше практиковаться с ними, чтобы по-настоящему разобраться в этом.