1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
| void tree::TreesArea::InitVBO(void)
{
GLuint bufferVRAM;
glGenVertexArrays(1,model.getVAO());
glGenBuffers(1,&bufferVRAM);
glBindVertexArray(*model.getVAO());
glBindBuffer(GL_ARRAY_BUFFER,bufferVRAM);
glBufferData(GL_ARRAY_BUFFER,model.getCoordVertex().size()*sizeof(float)+
model.getCoordTex().size()*sizeof(float)+
model.getNormals().size()*sizeof(float)+
model.getNumtex().size()*sizeof(int)+
positions.size()*sizeof(float)+
scales.size()*sizeof(float)+
rotates.size()*sizeof(float),nullptr,GL_DYNAMIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER,0,model.getCoordVertex().size()*sizeof(float),&model.getCoordVertex()[0]);
glBufferSubData(GL_ARRAY_BUFFER,model.getCoordVertex().size()*sizeof(float),model.getCoordTex().size()*sizeof(float),&model.getCoordTex()[0]);
glBufferSubData(GL_ARRAY_BUFFER,model.getCoordVertex().size()*sizeof(float)+model.getCoordTex().size()*sizeof(float),model.getNormals().size()*sizeof(float),&model.getNormals()[0]);
glBufferSubData(GL_ARRAY_BUFFER,model.getCoordVertex().size()*sizeof(float)+model.getCoordTex().size()*sizeof(float)+model.getNormals().size()*sizeof(float),model.getNumtex().size()*sizeof(int),&model.getNumtex()[0]);
glBufferSubData(GL_ARRAY_BUFFER,model.getCoordVertex().size()*sizeof(float)+model.getCoordTex().size()*sizeof(float)+model.getNormals().size()*sizeof(float)+model.getNumtex().size()*sizeof(int),positions.size()*sizeof(float),&positions[0]);
glBufferSubData(GL_ARRAY_BUFFER,model.getCoordVertex().size()*sizeof(float)+model.getCoordTex().size()*sizeof(float)+model.getNormals().size()*sizeof(float)+model.getNumtex().size()*sizeof(int)+positions.size()*sizeof(float),scales.size()*sizeof(float),&scales[0]);
glBufferSubData(GL_ARRAY_BUFFER,model.getCoordVertex().size()*sizeof(float)+model.getCoordTex().size()*sizeof(float)+model.getNormals().size()*sizeof(float)+model.getNumtex().size()*sizeof(int)+positions.size()*sizeof(float)+scales.size()*sizeof(float),rotates.size()*sizeof(float),&rotates[0]);
//Ecriture coordonnées de sommets, coordonnées de texture, normales, index de texture, positions, échelles et angles de rotation
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,3*sizeof(float),(void*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1,2,GL_FLOAT,GL_FALSE,2*sizeof(float),(void*)(model.getCoordVertex().size()*sizeof(float)));
glEnableVertexAttribArray(1);
glVertexAttribPointer(2,3,GL_FLOAT,GL_FALSE,3*sizeof(float),(void*)(model.getCoordVertex().size()*sizeof(float)+model.getCoordTex().size()*sizeof(float)));
glEnableVertexAttribArray(2);
glVertexAttribIPointer(3,1,GL_INT,sizeof(int),(void*)(model.getCoordVertex().size()*sizeof(float)+model.getCoordTex().size()*sizeof(float)+model.getNormals().size()*sizeof(float)));
glEnableVertexAttribArray(3);
glVertexAttribPointer(4,3,GL_FLOAT,GL_FALSE,3*sizeof(float),(void*)(model.getCoordVertex().size()*sizeof(float)+model.getCoordTex().size()*sizeof(float)+model.getNormals().size()*sizeof(float)+model.getNumtex().size()*sizeof(int)));
glEnableVertexAttribArray(4);
glVertexAttribPointer(5,1,GL_FLOAT,sizeof(float),GL_FALSE,(void*)(model.getCoordVertex().size()*sizeof(float)+model.getCoordTex().size()*sizeof(float)+model.getNormals().size()*sizeof(float)+model.getNumtex().size()*sizeof(int)+positions.size()*sizeof(float)));
glEnableVertexAttribArray(5);
glVertexAttribPointer(6,1,GL_FLOAT,sizeof(float),GL_FALSE,(void*)(model.getCoordVertex().size()*sizeof(float)+model.getCoordTex().size()*sizeof(float)+model.getNormals().size()*sizeof(float)+model.getNumtex().size()*sizeof(int)+positions.size()*sizeof(float)+scales.size()*sizeof(float)));
glEnableVertexAttribArray(6);
glVertexAttribDivisor(4,1);
glVertexAttribDivisor(5,1);
glVertexAttribDivisor(6,1);
//Config attributs
glBindBuffer(GL_ARRAY_BUFFER,0);
glBindVertexArray(0);
}
void tree::TreesArea::Draw(glm::mat4 &modelMat,glm::mat4 &viewMat,glm::mat4 &projectionMat,const glm::vec2 &posCam,const float distMax)
{
glUseProgram(shader);
glUniformMatrix4fv(glGetUniformLocation(shader,"projection"),1,false,glm::value_ptr(projectionMat));
glUniformMatrix4fv(glGetUniformLocation(shader,"modele"),1,false,glm::value_ptr(modelMat));
glUniformMatrix4fv(glGetUniformLocation(shader,"vue"),1,false,glm::value_ptr(viewMat));
//Envoi matrices au vertex shader
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,model.getTexWood());
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D,model.getTexLeaf());
glUniform1i(glGetUniformLocation(shader,"texWood"),0);
glUniform1i(glGetUniformLocation(shader,"texLeaf"),1);
//Envoi texture au fragment shader
glBindVertexArray(*model.getVAO());
//Bindage VAO
CamCulling(posCam,distMax);
//Culling (Inopérant pour le moment)
glDrawArraysInstanced(GL_TRIANGLES,0,model.getCoordVertex().size()/3,positions.size());
//Rendu
glBindVertexArray(0);
glActiveTexture(GL_TEXTURE0);
}
void tree::TreesArea::CamCulling(const glm::vec2 &posCam,const float distMax)
{
float *dataGPU=(float*)glMapBuffer(GL_ARRAY_BUFFER,GL_READ_WRITE);
//Récup contenu données (C'est là qu'il y a un problème visiblement)
const unsigned int taille=model.getCoordVertex().size()*sizeof(float)+
model.getCoordTex().size()*sizeof(float)+
model.getNormals().size()*sizeof(float)+
model.getNumtex().size()*sizeof(int)+
positions.size()*sizeof(float)+
scales.size()*sizeof(float)+
rotates.size()*sizeof(float);
//for(int i=0;i<positions.size();i++)
for(int i=0;i<taille;i++)
{
//std::cout << dataGPU[i] << std::endl;
}
std::cout << dataGPU << std::endl; //Affiche systématiquement "0"
glUnmapBuffer(GL_ARRAY_BUFFER);
} |
Partager