void cullindirect_app::startup() { GLuint first, count; object.load("media/objects/asteroids.sbm"); glGenBuffers(1, &buffers.parameters); glBindBuffer(GL_PARAMETER_BUFFER_ARB, buffers.parameters); glBufferStorage(GL_PARAMETER_BUFFER_ARB, 256, nullptr, 0); glGenBuffers(1, &buffers.drawCandidates); glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffers.drawCandidates); CandidateDraw* pDraws = new CandidateDraw[CANDIDATE_COUNT]; int i; for (i = 0; i < CANDIDATE_COUNT; i++) { object.get_sub_object_info(i % object.get_sub_object_count(), first, count); pDraws[i].sphereCenter = vmath::vec3(0.0f); pDraws[i].sphereRadius = 4.0f; pDraws[i].firstVertex = first; pDraws[i].vertexCount = count; } glBufferStorage(GL_SHADER_STORAGE_BUFFER, CANDIDATE_COUNT * sizeof(CandidateDraw), pDraws, 0); delete [] pDraws; glGenBuffers(1, &buffers.drawCommands); glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffers.drawCommands); glBufferStorage(GL_SHADER_STORAGE_BUFFER, CANDIDATE_COUNT * sizeof(DrawArraysIndirectCommand), nullptr, GL_MAP_READ_BIT); glGenBuffers(1, &buffers.modelMatrices); glBindBuffer(GL_UNIFORM_BUFFER, buffers.modelMatrices); glBufferStorage(GL_UNIFORM_BUFFER, 1024 * sizeof(vmath::mat4), nullptr, GL_MAP_WRITE_BIT); glGenBuffers(1, &buffers.transforms); glBindBuffer(GL_UNIFORM_BUFFER, buffers.transforms); glBufferStorage(GL_UNIFORM_BUFFER, sizeof(TransformBuffer), nullptr, GL_MAP_WRITE_BIT); load_shaders(); overlay.init(128, 50); texture = sb7::ktx::file::load("media/textures/rocks.ktx"); }