GlBufferData в GL_DRAW_INDIRECT_BUFFER вызывает ошибки рендерингаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 GlBufferData в GL_DRAW_INDIRECT_BUFFER вызывает ошибки рендеринга

Сообщение Anonymous »

Я пишу средство рендеринга на C++, используя OpenGL. Недавно я хотел реализовать непрямой пакетный рендеринг с помощью glMultiDrawElementsIndirect. Когда я пытаюсь протестировать эту реализацию, возникает проблема. По большей части я ничего не вижу на экране, за исключением очень специфических обстоятельств. Кажется, что проблема, с которой я столкнулся, возникает только тогда, когда я вызываю glBufferData в своем GL_DRAW_INDIRECT_BUFFER, чтобы заполнить его вызовами отрисовки после того, как я уже написал в него предыдущий вызов glBufferData в том же буфере.
Если я включаю imGUI в цикле рендеринга, я прекрасно вижу, что кадры отображаются на экране, но если графический интерфейс отключен, то, если нет задержки, я не вижу ничего рендеринга.
Я протестировал несколько вещей, которые дали мне дополнительную информацию о возникшей проблеме.
Я попытался имитировать задержку в цикле рендеринга, переводя поток в спящий режим. и это показало мне, что единственная причина, по которой я вообще вижу какие-либо кадры, - это какая-то задержка, возникающая в некоторых кадрах, я не вникал в это, но я уверен, что что-то происходит за кадром из-за чего у меня возникает небольшая задержка, которая позволяет мне видеть кадры, отображаемые на экране. Затем я попытался вызвать glBufferData только в моем косвенном буфере в первом кадре и дождаться заданного количества кадров, чтобы установить его снова. Мне удалось получить рендеринг, как ожидалось, до указанного мной кадра, поэтому я уверен, что в нем что-то есть. это связано с тем, что я пишу в свой косвенный буфер после того, как я уже поместил в него вызовы отрисовки в предыдущем кадре.
Я также пытался использовать RenderDoc, чтобы получить некоторую информацию из моих кадров и я обнаружил, что вызовы отрисовки выполняются правильно в каждом кадре, и я вижу, что сцена рисуется на каждом этапе, но она все еще не отображается на экране или в фактическом захваченном кадре? Хотя я новичок в RenderDoc, поэтому я определенно могу что-то упустить, поэтому дайте мне знать, если я могу предоставить дополнительную информацию из этого приложения!
Я ожидаю, что поведение будет похоже на когда я рендерил сетку за сеткой с помощью glDrawElements, даже несмотря на то, что я не собираюсь записывать в свои буферы каждый кадр, как сейчас, ради производительности, я думаю, что смогу это сделать, потому что в какой-то момент моего приложения я знаю что будут моменты, когда мне придется обновлять буфер несколько раз подряд, возможно, каждый кадр в течение нескольких кадров или кто знает, как долго.
Мой цикл рендеринга в настоящее время находится в состоянии состояние, в котором я просто пытаюсь заставить его работать, поскольку генерация вызовов отрисовки и сбор данных сетки будут абстрагированы, но я хотел бы решить эту проблему, прежде чем двигаться дальше.
Вот мой цикл рендеринга:
// Render loop
while (!glfwWindowShouldClose(window))
{
if (isInput)
{
processInput(window);
}

renderAPI.clear();

// For drawing to scene window
// within gui
if (GUI->isWindowed())
{
sceneBuffer->Bind();
renderAPI.clear();
}

draw(renderAPI);
if (GUI->isWindowed())
sceneBuffer->Unbind();

GUI->drawGUI();

glfwPollEvents();
glfwSwapBuffers(window);

// Handle post render duties
while (PostRenderFunctions.size() > 0)
{
PostRenderFunctions.back()();
PostRenderFunctions.pop_back();
}

Canvas->updateDeltaTime();
}

А вот моя функция вызова отрисовки. У меня есть флаг, с помощью которого я могу просто проверить, работают ли загруженные мной данные, и не помещать их снова в их буферы.
template
void draw(Graphics::RenderAPI& renderAPI)
{
auto shader = renderAPI.getShader("debug");
shader->use();

for
(
std::shared_ptr model
: ResourceManager->getLoadedModels()
)
{

modelMatrix = model->getModelMatrix();
shader->setUniform("view", Camera->getViewMatrix());
shader->setUniform("projection", Camera->getProjectionMatrix());

for (Graphics::Mesh& mesh : model->getMeshes())
{

Graphics::ElementDrawCall call;
shaderName = mesh.getShaderName();

if (!done)
{
vertexData.insert
(
vertexData.end(),
mesh.getVertices().begin(),
mesh.getVertices().end()
);

indexData.insert
(
indexData.end(),
mesh.getIndices().begin(),
mesh.getIndices().end()
);

call.count = mesh.getIndices().size();
call.instanceCount = 1;
call.firstIndex = currentBaseIndex;
call.baseVertex = currentBaseVertex;
call.baseInstance = instanceIndex;

currentBaseIndex += mesh.getIndices().size();
currentBaseVertex += mesh.getVertices().size();
instanceIndex++;

drawCalls.push_back(std::move(call));
}
}
}

renderAPI.loadData
(
vertexData,
indexData,
drawCalls,
"debug"
);

shader->setUniform("model", modelMatrix);

renderAPI.drawElements(drawCalls.size());
done = true;
}

А вот мой код API рендеринга, в котором, как мне кажется, возникает проблема.
void Graphics::OpenGLRenderAPI::loadDataImpl
(
std::vector& vertices,
std::vector& indices,
std::vector& drawCalls,
std::string shaderName
)
{
size_t format = m_Shaders[shaderName]->getFormat().first;
Graphics::RenderConfig& config = getRenderConfig(format, shaderName);

if (CURRENT_FORMAT != config.format && CURRENT_FORMAT != -1)
{
std::cout

Подробнее здесь: https://stackoverflow.com/questions/791 ... ing-errors
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»