Почему GlbuffersUbdata в розыгрыше косвенного буфера вызывает аварию? [закрыто]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему GlbuffersUbdata в розыгрыше косвенного буфера вызывает аварию? [закрыто]

Сообщение 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);
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... se-a-crash
Ответить

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

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

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

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

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