Я пишу средство рендеринга на 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
GlBufferData в GL_DRAW_INDIRECT_BUFFER вызывает ошибки рендеринга ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1730655929
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
Подробнее здесь: [url]https://stackoverflow.com/questions/79153224/glbufferdata-on-gl-draw-indirect-buffer-causes-rendering-errors[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия