Я пытаюсь использовать glmultidrawelements indirect () , чтобы нарисовать некоторые примитивы. Когда я пытаюсь позвонить в glbuffersubdata () , чтобы обновить косвенный буфер, приложение сбоя. Он работает нормально, когда я размещаю обновление буфера в BloseRawCommands () , но он все еще ничего не делает. Однако, когда я переключаюсь на gldrawelements () я получаю примитивный рендеринг, как и ожидалось.struct DrawElementsIndirectCommand {
uint32_t count;
uint32_t instanceCount;
uint32_t firstIndex;
int baseVertex;
uint32_t baseInstance;
};
struct {
uint32_t vao;
uint32_t vbo;
uint32_t ebo;
uint32_t ibo;
const int MAX_VERTEX = 300000;
const int MAX_INDICES = 900000;
const int MAX_DRAW_COMMANDS = 100;
DrawElementsIndirectCommand* commands;
int commandPtr = 0;
int indexCount = 0;
int vertexCount = 0;
int currentVertexCount = 0;
int currentIndexCount = 0;
}rendererData;
void Initialize()
{
glGenVertexArrays(1, &rendererData.vao);
glBindVertexArray(rendererData.vao);
glGenBuffers(1, &rendererData.vbo);
glGenBuffers(1, &rendererData.ebo);
glGenBuffers(1, &rendererData.ibo);
glBindBuffer(GL_ARRAY_BUFFER, rendererData.vbo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, rendererData.ebo);
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, rendererData.ibo);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertice) * rendererData.MAX_VERTEX, nullptr, GL_STATIC_DRAW);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(uint32_t) * rendererData.MAX_INDICES, nullptr, GL_STATIC_DRAW);
glBufferData(GL_DRAW_INDIRECT_BUFFER, sizeof(DrawElementsIndirectCommand) * rendererData.MAX_DRAW_COMMANDS, nullptr, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertice), 0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertice), (void*)offsetof(Vertice,n));
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertice), (void*)offsetof(Vertice,uv));
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(Vertice), (void*)offsetof(Vertice,tan));
glVertexAttribPointer(4, 3, GL_FLOAT, GL_FALSE, sizeof(Vertice), (void*)offsetof(Vertice,bitan));
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glEnableVertexAttribArray(3);
glEnableVertexAttribArray(4);
rendererData.commands = (DrawElementsIndirectCommand*)malloc(sizeof(DrawElementsIndirectCommand) * rendererData.MAX_DRAW_COMMANDS);
rendererData.commandPtr = 0;
rendererData.indexCount = 0;
rendererData.vertexCount = 0;
rendererData.currentIndexCount = 0;
}
void Shutdown()
{
glDeleteVertexArrays(1, &rendererData.vao);
glDeleteBuffers(1, &rendererData.vbo);
glDeleteBuffers(1, &rendererData.ebo);
glDeleteBuffers(1, &rendererData.ibo);
free(rendererData.commands);
IAONNIS_LOG_INFO("Renderer has shutdown");
}
void submitDrawCommandData(DrawData data)
{
glBindVertexArray(rendererData.vao);
glBindBuffer(GL_ARRAY_BUFFER, rendererData.vbo);
glBufferSubData(GL_ARRAY_BUFFER, rendererData.vertexCount * sizeof(Vertice), sizeof(Vertice) * data.vertexCount, data.vertexPtr);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, rendererData.ebo);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, rendererData.indexCount * sizeof(uint32_t), sizeof(uint32_t) * data.indexCount, data.indexPtr);
rendererData.currentVertexCount += data.vertexCount;
rendererData.currentIndexCount += data.indexCount;
}
void closeDrawCommands()
{
rendererData.commands[rendererData.commandPtr].baseInstance = 0;
rendererData.commands[rendererData.commandPtr].baseVertex = rendererData.vertexCount;
rendererData.commands[rendererData.commandPtr].count = rendererData.currentIndexCount;
rendererData.commands[rendererData.commandPtr].firstIndex = rendererData.indexCount;
rendererData.commands[rendererData.commandPtr].instanceCount = 1;
rendererData.commandPtr++;
rendererData.vertexCount += rendererData.currentVertexCount;
rendererData.indexCount += rendererData.currentIndexCount;
rendererData.currentIndexCount = 0;
rendererData.currentVertexCount = 0;
glBufferData(GL_DRAW_INDIRECT_BUFFER, rendererData.commandPtr * sizeof(DrawElementsIndirectCommand), &rendererData.commands, GL_DYNAMIC_DRAW);
}
void drawCommands()
{
glBindVertexArray(rendererData.vao);
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, rendererData.ibo);
glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_INT, 0, rendererData.commandPtr, 0);
//glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
}
< /code>
main.cpp:
//..Initial code above...
uint32_t program = CreateShaderProgram("vertex.glsl", "fragment.glsl");
glUseProgram(program);
Renderer3D::Vertice vertices[] = {
{{0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 1.0f}, {0.0f, 0.0f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f}},
{{1.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 1.0f}, {1.0f, 0.0f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f}},
{{1.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}, {1.0f, 1.0f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f}},
{{0.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}, {0.0f, 1.0f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f}}
};
uint32_t indices[] =
{
0,1,2,
0,2,3,
};
Renderer3D::Initialize();
Renderer3D::DrawData data;
data.vertexCount = 4;
data.vertexPtr = vertices;
data.indexCount = 6;
data.indexPtr = indices;
Iaonnis::Renderer3D::submitDrawCommandData(data);
Renderer3D::closeDrawCommands();
glViewport(0, 0, 800, 800);
glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
while (!glfwWindowShouldClose(window))
{
glClearColor(0.0, 0.5, 0.1, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Renderer3D::drawCommands();
glfwSwapBuffers(window);
glfwPollEvents();
}
Renderer3D::Shutdown();
glfwTerminate();
glfwDestroyWindow(window);
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... se-a-crash
Почему GlbuffersUbdata в розыгрыше косвенного буфера вызывает аварию? [закрыто] ⇐ C++
Программы на C++. Форум разработчиков
1759427357
Anonymous
Я пытаюсь использовать glmultidrawelements indirect () , чтобы нарисовать некоторые примитивы. Когда я пытаюсь позвонить в glbuffersubdata () , чтобы обновить косвенный буфер, приложение сбоя. Он работает нормально, когда я размещаю обновление буфера в BloseRawCommands () , но он все еще ничего не делает. Однако, когда я переключаюсь на gldrawelements () я получаю примитивный рендеринг, как и ожидалось.struct DrawElementsIndirectCommand {
uint32_t count;
uint32_t instanceCount;
uint32_t firstIndex;
int baseVertex;
uint32_t baseInstance;
};
struct {
uint32_t vao;
uint32_t vbo;
uint32_t ebo;
uint32_t ibo;
const int MAX_VERTEX = 300000;
const int MAX_INDICES = 900000;
const int MAX_DRAW_COMMANDS = 100;
DrawElementsIndirectCommand* commands;
int commandPtr = 0;
int indexCount = 0;
int vertexCount = 0;
int currentVertexCount = 0;
int currentIndexCount = 0;
}rendererData;
void Initialize()
{
glGenVertexArrays(1, &rendererData.vao);
glBindVertexArray(rendererData.vao);
glGenBuffers(1, &rendererData.vbo);
glGenBuffers(1, &rendererData.ebo);
glGenBuffers(1, &rendererData.ibo);
glBindBuffer(GL_ARRAY_BUFFER, rendererData.vbo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, rendererData.ebo);
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, rendererData.ibo);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertice) * rendererData.MAX_VERTEX, nullptr, GL_STATIC_DRAW);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(uint32_t) * rendererData.MAX_INDICES, nullptr, GL_STATIC_DRAW);
glBufferData(GL_DRAW_INDIRECT_BUFFER, sizeof(DrawElementsIndirectCommand) * rendererData.MAX_DRAW_COMMANDS, nullptr, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertice), 0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertice), (void*)offsetof(Vertice,n));
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertice), (void*)offsetof(Vertice,uv));
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(Vertice), (void*)offsetof(Vertice,tan));
glVertexAttribPointer(4, 3, GL_FLOAT, GL_FALSE, sizeof(Vertice), (void*)offsetof(Vertice,bitan));
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glEnableVertexAttribArray(3);
glEnableVertexAttribArray(4);
rendererData.commands = (DrawElementsIndirectCommand*)malloc(sizeof(DrawElementsIndirectCommand) * rendererData.MAX_DRAW_COMMANDS);
rendererData.commandPtr = 0;
rendererData.indexCount = 0;
rendererData.vertexCount = 0;
rendererData.currentIndexCount = 0;
}
void Shutdown()
{
glDeleteVertexArrays(1, &rendererData.vao);
glDeleteBuffers(1, &rendererData.vbo);
glDeleteBuffers(1, &rendererData.ebo);
glDeleteBuffers(1, &rendererData.ibo);
free(rendererData.commands);
IAONNIS_LOG_INFO("Renderer has shutdown");
}
void submitDrawCommandData(DrawData data)
{
glBindVertexArray(rendererData.vao);
glBindBuffer(GL_ARRAY_BUFFER, rendererData.vbo);
glBufferSubData(GL_ARRAY_BUFFER, rendererData.vertexCount * sizeof(Vertice), sizeof(Vertice) * data.vertexCount, data.vertexPtr);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, rendererData.ebo);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, rendererData.indexCount * sizeof(uint32_t), sizeof(uint32_t) * data.indexCount, data.indexPtr);
rendererData.currentVertexCount += data.vertexCount;
rendererData.currentIndexCount += data.indexCount;
}
void closeDrawCommands()
{
rendererData.commands[rendererData.commandPtr].baseInstance = 0;
rendererData.commands[rendererData.commandPtr].baseVertex = rendererData.vertexCount;
rendererData.commands[rendererData.commandPtr].count = rendererData.currentIndexCount;
rendererData.commands[rendererData.commandPtr].firstIndex = rendererData.indexCount;
rendererData.commands[rendererData.commandPtr].instanceCount = 1;
rendererData.commandPtr++;
rendererData.vertexCount += rendererData.currentVertexCount;
rendererData.indexCount += rendererData.currentIndexCount;
rendererData.currentIndexCount = 0;
rendererData.currentVertexCount = 0;
glBufferData(GL_DRAW_INDIRECT_BUFFER, rendererData.commandPtr * sizeof(DrawElementsIndirectCommand), &rendererData.commands, GL_DYNAMIC_DRAW);
}
void drawCommands()
{
glBindVertexArray(rendererData.vao);
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, rendererData.ibo);
glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_INT, 0, rendererData.commandPtr, 0);
//glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
}
< /code>
main.cpp:
//..Initial code above...
uint32_t program = CreateShaderProgram("vertex.glsl", "fragment.glsl");
glUseProgram(program);
Renderer3D::Vertice vertices[] = {
{{0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 1.0f}, {0.0f, 0.0f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f}},
{{1.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 1.0f}, {1.0f, 0.0f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f}},
{{1.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}, {1.0f, 1.0f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f}},
{{0.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}, {0.0f, 1.0f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f}}
};
uint32_t indices[] =
{
0,1,2,
0,2,3,
};
Renderer3D::Initialize();
Renderer3D::DrawData data;
data.vertexCount = 4;
data.vertexPtr = vertices;
data.indexCount = 6;
data.indexPtr = indices;
Iaonnis::Renderer3D::submitDrawCommandData(data);
Renderer3D::closeDrawCommands();
glViewport(0, 0, 800, 800);
glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
while (!glfwWindowShouldClose(window))
{
glClearColor(0.0, 0.5, 0.1, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Renderer3D::drawCommands();
glfwSwapBuffers(window);
glfwPollEvents();
}
Renderer3D::Shutdown();
glfwTerminate();
glfwDestroyWindow(window);
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79780331/why-does-glbuffersubdata-on-a-draw-indirect-buffer-cause-a-crash[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия