hello guys,
I’m trying to create a game that has tons of cubes ( around millions or even more ), so i have read about instancing and i have done what the tutorial said.
but when i add 100,000 cubes to the scene i have insane lags ( can’t move the mouse or exit ).
here is my source:
Cube:
void Cube::Add(std::vector<glm::vec3> position)
{
glGenVertexArrays(1, &instanceVBO);
glBindVertexArray(instanceVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * position.size(), &position[0], GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(glm::vec3), &vertices[0], GL_STREAM_DRAW);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, Texture);
glUniform1i(TextureID, 0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, uvBuffer);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(2);
glBindBuffer(GL_ARRAY_BUFFER, instanceVBO);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (void*)2);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glVertexAttribDivisor(2, 1);
size = position.size();
}
void Cube::Draw(GLuint& programID)
{
// Use Shaders
glUseProgram(programID);
// Bind Texture to Cube
glBindVertexArray(VAO);
glDrawArraysInstanced(GL_TRIANGLES, 0, vertices.size(), size);
glBindVertexArray(0);
}
Cube Vertex Shaer:
#version 330 core
layout (location = 0) in vec3 position;
layout (location = 1) in vec2 vertexUV;
layout (location = 2) in vec3 offset;
out vec2 UV;
uniform mat4 MVP;
void main()
{
gl_Position = MVP * vec4(position + offset, 1);
UV = vertexUV;
}
Camera Update:
void Camera::Update(glm::vec3 const& scale,
glm::vec3 const& position)
{
Camera::computeMatricesFromInputs();
glm::mat4 Model = glm::mat4();
Model = glm::scale(Model, scale);
Model = glm::translate(Model, position);
glm::mat4 mvp = ProjectionMatrix * ViewMatrix * Model;
glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &mvp[0][0]);
}
Main:
int main()
{
Functions funcs;
Window window(WIDTH, HEIGHT, "Minecraft Mechanics");
// Creating Shader
GLuint programID = funcs.LoadShaders("src/shaders/cube.vert", "src/shaders/cube.frag");
// Creating Cube
Cube cube(programID);
std::vector<glm::vec3> pos;
int cx = 0, cz = 0;
for(unsigned int x = 0; x < 100; x++)
{
pos.push_back(glm::vec3(cx, 0, cz));
for(unsigned int z = 0; z < 100; z++)
{
pos.push_back(glm::vec3(cx, 0, cz));
cz += CUBEDIST;
}
cx += CUBEDIST;
cz = 0;
}
cube.Add(pos);
pos.clear();
Camera camera(glm::vec3(0, 10, 0), 90.f, 0.001f);
camera.Setup(*window.getWindow(), programID);
glClearColor(0.53f, 0.81f, 0.98f, 1.0f);
double lastTime = glfwGetTime();
int nbFrames = 0;
while(window.Running())
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// ----- FPS ------ //
double currentTime = glfwGetTime();
nbFrames++;
if ( currentTime - lastTime >= 1.0 )
{
printf("%f ms/frame
", 1000.0/double(nbFrames));
nbFrames = 0;
lastTime += 1.0;
}
// Cube
for(unsigned int i = 0; i < cube.getSize(); i++)
{
cube.Draw(programID);
camera.Update(cube.getScale(), pos[i]);
}
window.SwapBuffers();
}
glDeleteProgram(programID);
return 0;
}
And i have added what the profiler said:
[ATTACH=CONFIG]1629[/ATTACH]
For couple of days I’ve been trying to fix this.
What am i doing wrong ?
Thanks for help!