void MyGLWidget::initializeGL () { FOV = M_PI/2; // NEW 5.1 FOVIni = M_PI/4; // NEW 5.1 // glew és necessari per cridar funcions de les darreres versions d'OpenGL glewExperimental = GL_TRUE; glewInit(); glGetError(); // Reinicia la variable d'error d'OpenGL glEnable(GL_DEPTH_TEST); glClearColor(0.5, 0.7, 1.0, 1.0); // defineix color de fons (d'esborrat) carregaShaders(); m.load("../models/Patricio.obj"); calculaCapsaModel(); createBuffers(); //modelTransform (); projectTransform(); viewTransform(); }
void MyGLWidget::createBuffers () { // Carreguem el model de l'OBJ - Atenció! Abans de crear els buffers! //patr.load("/assig/idi/models/Patricio.obj"); patr.load("/assig/idi/models/Patricio.obj"); // Calculem la capsa contenidora del model calculaCapsaModel (); // Creació del Vertex Array Object del Patricio glGenVertexArrays(1, &VAO_Patr); glBindVertexArray(VAO_Patr); // Creació dels buffers del model patr // Buffer de posicions glGenBuffers(1, &VBO_PatrPos); glBindBuffer(GL_ARRAY_BUFFER, VBO_PatrPos); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*patr.faces().size()*3*3, patr.VBO_vertices(), GL_STATIC_DRAW); // Activem l'atribut vertexLoc glVertexAttribPointer(vertexLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(vertexLoc); // Buffer de normals glGenBuffers(1, &VBO_PatrNorm); glBindBuffer(GL_ARRAY_BUFFER, VBO_PatrNorm); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*patr.faces().size()*3*3, patr.VBO_normals(), GL_STATIC_DRAW); glVertexAttribPointer(normalLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(normalLoc); // En lloc del color, ara passem tots els paràmetres dels materials // Buffer de component ambient glGenBuffers(1, &VBO_PatrMatamb); glBindBuffer(GL_ARRAY_BUFFER, VBO_PatrMatamb); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*patr.faces().size()*3*3, patr.VBO_matamb(), GL_STATIC_DRAW); glVertexAttribPointer(matambLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(matambLoc); // Buffer de component difusa glGenBuffers(1, &VBO_PatrMatdiff); glBindBuffer(GL_ARRAY_BUFFER, VBO_PatrMatdiff); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*patr.faces().size()*3*3, patr.VBO_matdiff(), GL_STATIC_DRAW); glVertexAttribPointer(matdiffLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(matdiffLoc); // Buffer de component especular glGenBuffers(1, &VBO_PatrMatspec); glBindBuffer(GL_ARRAY_BUFFER, VBO_PatrMatspec); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*patr.faces().size()*3*3, patr.VBO_matspec(), GL_STATIC_DRAW); glVertexAttribPointer(matspecLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(matspecLoc); // Buffer de component shininness glGenBuffers(1, &VBO_PatrMatshin); glBindBuffer(GL_ARRAY_BUFFER, VBO_PatrMatshin); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*patr.faces().size()*3, patr.VBO_matshin(), GL_STATIC_DRAW); glVertexAttribPointer(matshinLoc, 1, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(matshinLoc); // Dades del terra // VBO amb la posició dels vèrtexs glm::vec3 posterra[12] = { glm::vec3(-1.0, -1.0, 1.0), glm::vec3(1.0, -1.0, 1.0), glm::vec3(-1.0, -1.0, -1.0), glm::vec3(-1.0, -1.0, -1.0), glm::vec3(1.0, -1.0, 1.0), glm::vec3(1.0, -1.0, -1.0), glm::vec3(-1.0, -1.0, -1.0), glm::vec3(1.0, -1.0, -1.0), glm::vec3(-1.0, 1.0, -1.0), glm::vec3(-1.0, 1.0, -1.0), glm::vec3(1.0, -1.0, -1.0), glm::vec3(1.0, 1.0, -1.0) }; // VBO amb la normal de cada vèrtex glm::vec3 norm1 (0,1,0); glm::vec3 norm2 (0,0,1); glm::vec3 normterra[12] = { norm1, norm1, norm1, norm1, norm1, norm1, // la normal (0,1,0) per als primers dos triangles norm2, norm2, norm2, norm2, norm2, norm2 // la normal (0,0,1) per als dos últims triangles }; // Definim el material del terra glm::vec3 amb(0,0,1); glm::vec3 diff(0,0,1); glm::vec3 spec(1,1,1); float shin = 100; // Fem que aquest material afecti a tots els vèrtexs per igual glm::vec3 matambterra[12] = { amb, amb, amb, amb, amb, amb, amb, amb, amb, amb, amb, amb }; glm::vec3 matdiffterra[12] = { diff, diff, diff, diff, diff, diff, diff, diff, diff, diff, diff, diff }; glm::vec3 matspecterra[12] = { spec, spec, spec, spec, spec, spec, spec, spec, spec, spec, spec, spec }; float matshinterra[12] = { shin, shin, shin, shin, shin, shin, shin, shin, shin, shin, shin, shin }; // Creació del Vertex Array Object del terra glGenVertexArrays(1, &VAO_Terra); glBindVertexArray(VAO_Terra); glGenBuffers(1, &VBO_TerraPos); glBindBuffer(GL_ARRAY_BUFFER, VBO_TerraPos); glBufferData(GL_ARRAY_BUFFER, sizeof(posterra), posterra, GL_STATIC_DRAW); // Activem l'atribut vertexLoc glVertexAttribPointer(vertexLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(vertexLoc); glGenBuffers(1, &VBO_TerraNorm); glBindBuffer(GL_ARRAY_BUFFER, VBO_TerraNorm); glBufferData(GL_ARRAY_BUFFER, sizeof(normterra), normterra, GL_STATIC_DRAW); // Activem l'atribut normalLoc glVertexAttribPointer(normalLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(normalLoc); // En lloc del color, ara passem tots els paràmetres dels materials // Buffer de component ambient glGenBuffers(1, &VBO_TerraMatamb); glBindBuffer(GL_ARRAY_BUFFER, VBO_TerraMatamb); glBufferData(GL_ARRAY_BUFFER, sizeof(matambterra), matambterra, GL_STATIC_DRAW); glVertexAttribPointer(matambLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(matambLoc); // Buffer de component difusa glGenBuffers(1, &VBO_TerraMatdiff); glBindBuffer(GL_ARRAY_BUFFER, VBO_TerraMatdiff); glBufferData(GL_ARRAY_BUFFER, sizeof(matdiffterra), matdiffterra, GL_STATIC_DRAW); glVertexAttribPointer(matdiffLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(matdiffLoc); // Buffer de component especular glGenBuffers(1, &VBO_TerraMatspec); glBindBuffer(GL_ARRAY_BUFFER, VBO_TerraMatspec); glBufferData(GL_ARRAY_BUFFER, sizeof(matspecterra), matspecterra, GL_STATIC_DRAW); glVertexAttribPointer(matspecLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(matspecLoc); // Buffer de component shininness glGenBuffers(1, &VBO_TerraMatshin); glBindBuffer(GL_ARRAY_BUFFER, VBO_TerraMatshin); glBufferData(GL_ARRAY_BUFFER, sizeof(matshinterra), matshinterra, GL_STATIC_DRAW); glVertexAttribPointer(matshinLoc, 1, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(matshinLoc); glBindVertexArray(0); }
void MyGLWidget::createBuffers () { // Carreguem el model de l'OBJ - Atenció! Abans de crear els buffers! patr.load("./models/Patricio.obj"); // Calculem la capsa contenidora del model calculaCapsaModel (); // Creació del Vertex Array Object del Patricio glGenVertexArrays(1, &VAO_Patr); glBindVertexArray(VAO_Patr); // Creació dels buffers del model patr // Buffer de posicions glGenBuffers(1, &VBO_PatrPos); glBindBuffer(GL_ARRAY_BUFFER, VBO_PatrPos); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*patr.faces().size()*3*3, patr.VBO_vertices(), GL_STATIC_DRAW); // Activem l'atribut vertexLoc glVertexAttribPointer(vertexLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(vertexLoc); // Buffer de normals glGenBuffers(1, &VBO_PatrNorm); glBindBuffer(GL_ARRAY_BUFFER, VBO_PatrNorm); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*patr.faces().size()*3*3, patr.VBO_normals(), GL_STATIC_DRAW); glVertexAttribPointer(normalLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(normalLoc); // En lloc del color, ara passem tots els paràmetres dels materials // Buffer de component ambient glGenBuffers(1, &VBO_PatrMatamb); glBindBuffer(GL_ARRAY_BUFFER, VBO_PatrMatamb); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*patr.faces().size()*3*3, patr.VBO_matamb(), GL_STATIC_DRAW); glVertexAttribPointer(matambLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(matambLoc); // Buffer de component difusa glGenBuffers(1, &VBO_PatrMatdiff); glBindBuffer(GL_ARRAY_BUFFER, VBO_PatrMatdiff); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*patr.faces().size()*3*3, patr.VBO_matdiff(), GL_STATIC_DRAW); glVertexAttribPointer(matdiffLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(matdiffLoc); // Buffer de component especular glGenBuffers(1, &VBO_PatrMatspec); glBindBuffer(GL_ARRAY_BUFFER, VBO_PatrMatspec); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*patr.faces().size()*3*3, patr.VBO_matspec(), GL_STATIC_DRAW); glVertexAttribPointer(matspecLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(matspecLoc); // Buffer de component shininness glGenBuffers(1, &VBO_PatrMatshin); glBindBuffer(GL_ARRAY_BUFFER, VBO_PatrMatshin); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*patr.faces().size()*3, patr.VBO_matshin(), GL_STATIC_DRAW); glVertexAttribPointer(matshinLoc, 1, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(matshinLoc); // Dades del terra // VBO amb la posició dels vèrtexs glm::vec3 posterra[4] = { glm::vec3( 10.0, 0.0, -10.0), glm::vec3( 10.0, 0.0, 10.0), glm::vec3(-10.0, 0.0, -10.0), glm::vec3(-10.0, 0.0, 10.0) }; // VBO amb la normal de cada vèrtex glm::vec3 norm (0,1,0); glm::vec3 normterra[4] = { norm, norm, norm, norm }; // Definim el material del terra glm::vec3 amb(0.2,0.2,0.0); glm::vec3 diff(1.,1.,0.0); glm::vec3 spec(0.,0.,0.); float shin = 100; // Fem que aquest material afecti a tots els vèrtexs per igual glm::vec3 matambterra[4] = { amb, amb, amb, amb }; glm::vec3 matdiffterra[4] = { diff, diff, diff, diff }; glm::vec3 matspecterra[4] = { spec, spec, spec, spec }; float matshinterra[4] = { shin, shin, shin, shin }; // Creació del Vertex Array Object del terra glGenVertexArrays(1, &VAO_Terra); glBindVertexArray(VAO_Terra); glGenBuffers(1, &VBO_TerraPos); glBindBuffer(GL_ARRAY_BUFFER, VBO_TerraPos); glBufferData(GL_ARRAY_BUFFER, sizeof(posterra), posterra, GL_STATIC_DRAW); // Activem l'atribut vertexLoc glVertexAttribPointer(vertexLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(vertexLoc); glGenBuffers(1, &VBO_TerraNorm); glBindBuffer(GL_ARRAY_BUFFER, VBO_TerraNorm); glBufferData(GL_ARRAY_BUFFER, sizeof(normterra), normterra, GL_STATIC_DRAW); // Activem l'atribut normalLoc glVertexAttribPointer(normalLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(normalLoc); // En lloc del color, ara passem tots els paràmetres dels materials // Buffer de component ambient glGenBuffers(1, &VBO_TerraMatamb); glBindBuffer(GL_ARRAY_BUFFER, VBO_TerraMatamb); glBufferData(GL_ARRAY_BUFFER, sizeof(matambterra), matambterra, GL_STATIC_DRAW); glVertexAttribPointer(matambLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(matambLoc); // Buffer de component difusa glGenBuffers(1, &VBO_TerraMatdiff); glBindBuffer(GL_ARRAY_BUFFER, VBO_TerraMatdiff); glBufferData(GL_ARRAY_BUFFER, sizeof(matdiffterra), matdiffterra, GL_STATIC_DRAW); glVertexAttribPointer(matdiffLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(matdiffLoc); // Buffer de component especular glGenBuffers(1, &VBO_TerraMatspec); glBindBuffer(GL_ARRAY_BUFFER, VBO_TerraMatspec); glBufferData(GL_ARRAY_BUFFER, sizeof(matspecterra), matspecterra, GL_STATIC_DRAW); glVertexAttribPointer(matspecLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(matspecLoc); // Buffer de component shininness glGenBuffers(1, &VBO_TerraMatshin); glBindBuffer(GL_ARRAY_BUFFER, VBO_TerraMatshin); glBufferData(GL_ARRAY_BUFFER, sizeof(matshinterra), matshinterra, GL_STATIC_DRAW); glVertexAttribPointer(matshinLoc, 1, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(matshinLoc); glm::vec3 colorF(0.8, 0.8, 0.8); PosicionEstandarFoco = glm::vec3(5., 3., 5.); glUniform3fv(colFocusLoc, 1, &colorF[0]); glUniform3fv(posFocusLoc, 1, &PosicionEstandarFoco[0]); glUniform3fv(llumAmbiLoc, 1, &colorF[0]); glBindVertexArray(0); }
void MyGLWidget::createBuffers () { // Carreguem el model de l'OBJ - Atenció! Abans de crear els buffers! caps.load("./models/cow.obj"); // Calculem la capsa contenidora del model calculaCapsaModel (); // Creació del Vertex Array Object del Patricio glGenVertexArrays(1, &VAO_Caps); glBindVertexArray(VAO_Caps); // Creació dels buffers del model patr // Buffer de posicions glGenBuffers(1, &VBO_CapsPos); glBindBuffer(GL_ARRAY_BUFFER, VBO_CapsPos); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*caps.faces().size()*3*3, caps.VBO_vertices(), GL_STATIC_DRAW); // Activem l'atribut vertexLoc glVertexAttribPointer(vertexLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(vertexLoc); // Buffer de normals glGenBuffers(1, &VBO_CapsNorm); glBindBuffer(GL_ARRAY_BUFFER, VBO_CapsNorm); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*caps.faces().size()*3*3, caps.VBO_normals(), GL_STATIC_DRAW); glVertexAttribPointer(normalLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(normalLoc); // En lloc del color, ara passem tots els paràmetres dels materials // Buffer de component ambient glGenBuffers(1, &VBO_CapsMatamb); glBindBuffer(GL_ARRAY_BUFFER, VBO_CapsMatamb); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*caps.faces().size()*3*3, caps.VBO_matamb(), GL_STATIC_DRAW); glVertexAttribPointer(matambLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(matambLoc); // Buffer de component difusa glGenBuffers(1, &VBO_CapsMatdiff); glBindBuffer(GL_ARRAY_BUFFER, VBO_CapsMatdiff); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*caps.faces().size()*3*3, caps.VBO_matdiff(), GL_STATIC_DRAW); glVertexAttribPointer(matdiffLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(matdiffLoc); // Buffer de component especular glGenBuffers(1, &VBO_CapsMatspec); glBindBuffer(GL_ARRAY_BUFFER, VBO_CapsMatspec); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*caps.faces().size()*3*3, caps.VBO_matspec(), GL_STATIC_DRAW); glVertexAttribPointer(matspecLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(matspecLoc); // Buffer de component shininness glGenBuffers(1, &VBO_CapsMatshin); glBindBuffer(GL_ARRAY_BUFFER, VBO_CapsMatshin); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*caps.faces().size()*3, caps.VBO_matshin(), GL_STATIC_DRAW); glVertexAttribPointer(matshinLoc, 1, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(matshinLoc); // Carreguem el model de l'OBJ - Atenció! Abans de crear els buffers! caps2.load("./models/Patricio.obj"); // Calculem la capsa contenidora del model calculaCapsaModel2 (); // Creació del Vertex Array Object del Patricio glGenVertexArrays(1, &VAO_Caps2); glBindVertexArray(VAO_Caps2); // Creació dels buffers del model patr // Buffer de posicions glGenBuffers(1, &VBO_Caps2Pos); glBindBuffer(GL_ARRAY_BUFFER, VBO_Caps2Pos); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*caps2.faces().size()*3*3, caps2.VBO_vertices(), GL_STATIC_DRAW); // Activem l'atribut vertexLoc glVertexAttribPointer(vertexLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(vertexLoc); // Buffer de normals glGenBuffers(1, &VBO_Caps2Norm); glBindBuffer(GL_ARRAY_BUFFER, VBO_Caps2Norm); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*caps2.faces().size()*3*3, caps2.VBO_normals(), GL_STATIC_DRAW); glVertexAttribPointer(normalLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(normalLoc); // En lloc del color, ara passem tots els paràmetres dels materials // Buffer de component ambient glGenBuffers(1, &VBO_Caps2Matamb); glBindBuffer(GL_ARRAY_BUFFER, VBO_Caps2Matamb); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*caps2.faces().size()*3*3, caps2.VBO_matamb(), GL_STATIC_DRAW); glVertexAttribPointer(matambLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(matambLoc); // Buffer de component difusa glGenBuffers(1, &VBO_Caps2Matdiff); glBindBuffer(GL_ARRAY_BUFFER, VBO_Caps2Matdiff); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*caps2.faces().size()*3*3, caps2.VBO_matdiff(), GL_STATIC_DRAW); glVertexAttribPointer(matdiffLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(matdiffLoc); // Buffer de component especular glGenBuffers(1, &VBO_Caps2Matspec); glBindBuffer(GL_ARRAY_BUFFER, VBO_Caps2Matspec); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*caps2.faces().size()*3*3, caps2.VBO_matspec(), GL_STATIC_DRAW); glVertexAttribPointer(matspecLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(matspecLoc); // Buffer de component shininness glGenBuffers(1, &VBO_Caps2Matshin); glBindBuffer(GL_ARRAY_BUFFER, VBO_Caps2Matshin); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*caps2.faces().size()*3, caps2.VBO_matshin(), GL_STATIC_DRAW); glVertexAttribPointer(matshinLoc, 1, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(matshinLoc); // Dades del terra // VBO amb la posició dels vèrtexs glm::vec3 posterra[12] = { glm::vec3(-2.0, -1.0, 2.0), glm::vec3(2.0, -1.0, 2.0), glm::vec3(-2.0, -1.0, -2.0), glm::vec3(-2.0, -1.0, -2.0), glm::vec3(2.0, -1.0, 2.0), glm::vec3(2.0, -1.0, -2.0), glm::vec3(-2.0, -1.0, -2.0), glm::vec3(2.0, -1.0, -2.0), glm::vec3(-2.0, 1.0, -2.0), glm::vec3(-2.0, 1.0, -2.0), glm::vec3(2.0, -1.0, -2.0), glm::vec3(2.0, 1.0, -2.0) }; //________________________________________________________________ //___________________CALCUL MAX I MIN TERRA_______________________ maxTerra.x = minTerra.x = posterra[0].x; maxTerra.y = minTerra.y = posterra[0].y; maxTerra.z = minTerra.z = posterra[0].z; for (unsigned int i = 0; i < 12; i+=1) { if (posterra[i].x < minTerra.x) minTerra.x = posterra[i].x; if (posterra[i].x > maxTerra.x) maxTerra.x = posterra[i].x; if (posterra[i].y < minTerra.y) minTerra.y = posterra[i].y; if (posterra[i].y > maxTerra.y) maxTerra.y = posterra[i].y; if (posterra[i].z < minTerra.z) minTerra.z = posterra[i].z; if (posterra[i].z > maxTerra.z) maxTerra.z = posterra[i].z; } centreTerra.x = (minTerra.x+maxTerra.x)/2.0; centreTerra.y = (minTerra.y+maxTerra.y)/2.0; centreTerra.z = (minTerra.z+maxTerra.z)/2.0; //________________________________________________________ //_______________FI CALCUL________________________________ // VBO amb la normal de cada vèrtex glm::vec3 norm1 (0,1,0); glm::vec3 norm2 (0,0,1); glm::vec3 normterra[12] = { norm1, norm1, norm1, norm1, norm1, norm1, // la normal (0,1,0) per als primers dos triangles norm2, norm2, norm2, norm2, norm2, norm2 // la normal (0,0,1) per als dos últims triangles }; // Definim el material del terra glm::vec3 amb(0.2,0,0.2); glm::vec3 diff(0.8,0,0.8); glm::vec3 spec(0,0,0); float shin = 100; // Fem que aquest material afecti a tots els vèrtexs per igual glm::vec3 matambterra[12] = { amb, amb, amb, amb, amb, amb, amb, amb, amb, amb, amb, amb }; glm::vec3 matdiffterra[12] = { diff, diff, diff, diff, diff, diff, diff, diff, diff, diff, diff, diff }; glm::vec3 matspecterra[12] = { spec, spec, spec, spec, spec, spec, spec, spec, spec, spec, spec, spec }; float matshinterra[12] = { shin, shin, shin, shin, shin, shin, shin, shin, shin, shin, shin, shin }; // Creació del Vertex Array Object del terra glGenVertexArrays(1, &VAO_Terra); glBindVertexArray(VAO_Terra); glGenBuffers(1, &VBO_TerraPos); glBindBuffer(GL_ARRAY_BUFFER, VBO_TerraPos); glBufferData(GL_ARRAY_BUFFER, sizeof(posterra), posterra, GL_STATIC_DRAW); // Activem l'atribut vertexLoc glVertexAttribPointer(vertexLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(vertexLoc); glGenBuffers(1, &VBO_TerraNorm); glBindBuffer(GL_ARRAY_BUFFER, VBO_TerraNorm); glBufferData(GL_ARRAY_BUFFER, sizeof(normterra), normterra, GL_STATIC_DRAW); // Activem l'atribut normalLoc glVertexAttribPointer(normalLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(normalLoc); // En lloc del color, ara passem tots els paràmetres dels materials // Buffer de component ambient glGenBuffers(1, &VBO_TerraMatamb); glBindBuffer(GL_ARRAY_BUFFER, VBO_TerraMatamb); glBufferData(GL_ARRAY_BUFFER, sizeof(matambterra), matambterra, GL_STATIC_DRAW); glVertexAttribPointer(matambLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(matambLoc); // Buffer de component difusa glGenBuffers(1, &VBO_TerraMatdiff); glBindBuffer(GL_ARRAY_BUFFER, VBO_TerraMatdiff); glBufferData(GL_ARRAY_BUFFER, sizeof(matdiffterra), matdiffterra, GL_STATIC_DRAW); glVertexAttribPointer(matdiffLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(matdiffLoc); // Buffer de component especular glGenBuffers(1, &VBO_TerraMatspec); glBindBuffer(GL_ARRAY_BUFFER, VBO_TerraMatspec); glBufferData(GL_ARRAY_BUFFER, sizeof(matspecterra), matspecterra, GL_STATIC_DRAW); glVertexAttribPointer(matspecLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(matspecLoc); // Buffer de component shininness glGenBuffers(1, &VBO_TerraMatshin); glBindBuffer(GL_ARRAY_BUFFER, VBO_TerraMatshin); glBufferData(GL_ARRAY_BUFFER, sizeof(matshinterra), matshinterra, GL_STATIC_DRAW); glVertexAttribPointer(matshinLoc, 1, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(matshinLoc); glBindVertexArray(0); }