instancing but scale is messed up

This commit is contained in:
dompia5 2024-02-07 21:58:19 +01:00
parent 3f757feb4a
commit ac6a01d5be
2 changed files with 57 additions and 34 deletions

View File

@ -214,22 +214,58 @@ void Core::DrawContext(Core::RenderContext& context)
void Core::DrawContextInstanced(Core::RenderContext& context, std::vector<glm::mat4> transformations,std::vector<glm::mat4> Modelmatrices,int numberOfInstances, GLuint program) void Core::DrawContextInstanced(Core::RenderContext& context, std::vector<glm::mat4> transformations, std::vector<glm::mat4> Modelmatrices, int numberOfInstances,GLuint program)
{ {
GLuint VAO = context.vertexArray;
glBindVertexArray(VAO);
GLuint vbo; GLuint vbo;
glGenBuffers(1, &vbo); glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, transformations.size() * sizeof(glm::mat4), transformations.data(), GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, transformations.size() * sizeof(glm::mat4), transformations.data(), GL_STATIC_DRAW);
GLuint VAO = context.vertexArray;
glBindVertexArray(VAO);
std::size_t mat4Size = sizeof(glm::mat4); std::size_t mat4Size = sizeof(glm::mat4);
glEnableVertexAttribArray(6); for (int i = 0; i < 4; i++) {
glVertexAttribPointer(6, 4, GL_FLOAT, GL_FALSE, mat4Size, (void*)0); glEnableVertexAttribArray(6+i);
glVertexAttribDivisor(6, 1); glVertexAttribPointer(6 + i, 4, GL_FLOAT, GL_FALSE, mat4Size, (void*)(sizeof(glm::vec4) * i));
glVertexAttribDivisor(6 + i, 1);
}
GLuint matricesBuffer;
glGenBuffers(1, &matricesBuffer);
glBindBuffer(GL_ARRAY_BUFFER, matricesBuffer);
glBufferData(GL_ARRAY_BUFFER, Modelmatrices.size() * sizeof(glm::mat4), Modelmatrices.data(), GL_STATIC_DRAW);
for (int i = 0; i < 4; i++) {
glEnableVertexAttribArray(10 + i);
glVertexAttribPointer(10 + i, 4, GL_FLOAT, GL_FALSE, mat4Size, (void*)(sizeof(glm::vec4) * i));
glVertexAttribDivisor(10 + i, 1);
}
glUniform3f(glGetUniformLocation(program, "lightPos"), 0, 0, 0);
//Material
glUniform1f(glGetUniformLocation(program, "shininess"), 0);
glUniform3f(glGetUniformLocation(program, "ambientColor"), 0, 0,0 );
glUniform3f(glGetUniformLocation(program, "specularColor"), 0,0 , 0);
glUniform3f(glGetUniformLocation(program, "emissiveColor"), 0,0 ,0 );
glUniform1f(glGetUniformLocation(program, "opticalDensity"),0 );
//glUniform1f(glGetUniformLocation(program, "dissolve"), material.d);
glUniform1i(glGetUniformLocation(program, "illuminationModel"), 0);
glUniform1f(glGetUniformLocation(program, "metallic"), 0.05);
glUniform1f(glGetUniformLocation(program, "roughness"), 0.2);
/* std::size_t vec4Size = sizeof(glm::vec4); glDrawElementsInstanced(
GL_TRIANGLES, // mode
context.size, // count
GL_UNSIGNED_INT, // type
(void*)0, numberOfInstances // element array buffer offset
);
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
/* std::size_t vec4Size = sizeof(glm::vec4);
glEnableVertexAttribArray(3); glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, 4 * vec4Size, (void*)0);* glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, 4 * vec4Size, (void*)0);*
glEnableVertexAttribArray(4); glEnableVertexAttribArray(4);
@ -250,16 +286,4 @@ void Core::DrawContextInstanced(Core::RenderContext& context, std::vector<glm::m
//glBindBuffer(GL_ARRAY_BUFFER, vbo); //glBindBuffer(GL_ARRAY_BUFFER, vbo);
//glVertexAttribPointer(modelMatrixLocation, 3, GL_FLOAT, GL_FALSE,sizeof(glm::mat4), (void*)0); //glVertexAttribPointer(modelMatrixLocation, 3, GL_FLOAT, GL_FALSE,sizeof(glm::mat4), (void*)0);
//glVertexAttribDivisor(modelMatrixLocation, 1); //glVertexAttribDivisor(modelMatrixLocation, 1);
//glBindVertexArray(context.vertexArray); //glBindVertexArray(context.vertexArray);
glDrawElementsInstanced(
GL_TRIANGLES, // mode
context.size, // count
GL_UNSIGNED_INT, // type
(void*)0, numberOfInstances // element array buffer offset
);
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}

View File

@ -155,7 +155,7 @@ bool sortFunction(std::tuple<int, float> objA, std::tuple<int, float> objB)
PlanetParams populatePlanet(PlanetParams planet, std::vector<Plant::Plant> plants) PlanetParams populatePlanet(PlanetParams planet, std::vector<Plant::Plant> plants)
{ {
float probability=0.5f; float probability=0.5f;
int HOW_MANY_PLANTS = 10000; int HOW_MANY_PLANTS = 100;
int PRECISION = 10000; int PRECISION = 10000;
float NOTHING_SPAWNS_CUTOFF = 0.0; float NOTHING_SPAWNS_CUTOFF = 0.0;
int sum = 0; int sum = 0;
@ -320,7 +320,7 @@ glm::mat4 createPerspectiveMatrix()
glm::mat4 perspectiveMatrix; glm::mat4 perspectiveMatrix;
float n = 0.05; float n = 0.05;
float f = 15.; float f = 100.;
float a1 = glm::min(aspectRatio, 1.f); float a1 = glm::min(aspectRatio, 1.f);
float a2 = glm::min(1 / aspectRatio, 1.f); float a2 = glm::min(1 / aspectRatio, 1.f);
perspectiveMatrix = glm::mat4({ perspectiveMatrix = glm::mat4({
@ -417,18 +417,17 @@ void drawObjectTexture_plantInstanced(Core::RenderContext& context, std::vector<
glm::mat4 transformation = viewProjectionMatrix* matrix; glm::mat4 transformation = viewProjectionMatrix* matrix;
transformations.push_back(transformation); transformations.push_back(transformation);
} }
//glUniform3f(glGetUniformLocation(program, "lightPos"), 0, 0, 0);
glUniform3f(glGetUniformLocation(program, "lightPos"), 0, 0, 0); ////Material
//Material //glUniform1f(glGetUniformLocation(program, "shininess"), material.Ns);
glUniform1f(glGetUniformLocation(program, "shininess"), material.Ns); //glUniform3f(glGetUniformLocation(program, "ambientColor"), material.Ka.r, material.Ka.g, material.Ka.b);
glUniform3f(glGetUniformLocation(program, "ambientColor"), material.Ka.r, material.Ka.g, material.Ka.b); //glUniform3f(glGetUniformLocation(program, "specularColor"), material.Ks.r, material.Ks.g, material.Ks.b);
glUniform3f(glGetUniformLocation(program, "specularColor"), material.Ks.r, material.Ks.g, material.Ks.b); //glUniform3f(glGetUniformLocation(program, "emissiveColor"), material.Ke.r, material.Ke.g, material.Ke.b);
glUniform3f(glGetUniformLocation(program, "emissiveColor"), material.Ke.r, material.Ke.g, material.Ke.b); //glUniform1f(glGetUniformLocation(program, "opticalDensity"), material.Ni);
glUniform1f(glGetUniformLocation(program, "opticalDensity"), material.Ni); ////glUniform1f(glGetUniformLocation(program, "dissolve"), material.d);
//glUniform1f(glGetUniformLocation(program, "dissolve"), material.d); //glUniform1i(glGetUniformLocation(program, "illuminationModel"), material.illum);
glUniform1i(glGetUniformLocation(program, "illuminationModel"), material.illum); //glUniform1f(glGetUniformLocation(program, "metallic"), 0.05);
glUniform1f(glGetUniformLocation(program, "metallic"), 0.05); //glUniform1f(glGetUniformLocation(program, "roughness"), 0.2);
glUniform1f(glGetUniformLocation(program, "roughness"), 0.2);
Core::DrawContextInstanced(context, transformations,modelMatrices,count,program); Core::DrawContextInstanced(context, transformations,modelMatrices,count,program);
glUseProgram(0); glUseProgram(0);