NormalMaps Working and started work on specular maps.
This commit is contained in:
+116
-2
@@ -22,6 +22,8 @@ Model::Model(OBJ &obj, ResourceManager* rm)
|
||||
auto texture = std::shared_ptr<Texture>(rm->Load<Texture>("Texture", currentMaterial->DiffuseTexture.FileName));
|
||||
// TODO: Load normal map
|
||||
std::shared_ptr<Texture> normalMap = nullptr;
|
||||
if (!currentMaterial->NormalMap.FileName.empty())
|
||||
normalMap = std::shared_ptr<Texture>(rm->Load<Texture>("Texture", currentMaterial->NormalMap.FileName));
|
||||
// Load specular map
|
||||
std::shared_ptr<Texture> specularMap = nullptr;
|
||||
if (!currentMaterial->SpecularMap.FileName.empty())
|
||||
@@ -63,7 +65,9 @@ Model::Model(OBJ &obj, ResourceManager* rm)
|
||||
|
||||
if (Vertices.size() > 0)
|
||||
{
|
||||
CreateBuffers(Vertices, Normals, TextureCoords);
|
||||
CreateTangents();
|
||||
getSimilarVertexIndex();
|
||||
CreateBuffers(Vertices, Normals, TangentNormals, BiTangentNormals, TextureCoords);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -71,7 +75,7 @@ Model::Model(OBJ &obj, ResourceManager* rm)
|
||||
}
|
||||
}
|
||||
|
||||
void Model::CreateBuffers( std::vector<glm::vec3> vertices, std::vector<glm::vec3> normals, std::vector<glm::vec2>textureCoords)
|
||||
void Model::CreateBuffers( std::vector<glm::vec3> vertices, std::vector<glm::vec3> normals, std::vector<glm::vec3> tangents, std::vector<glm::vec3> biTangents, std::vector<glm::vec2>textureCoords)
|
||||
{
|
||||
|
||||
LOG_INFO("Generating VertexBuffer");
|
||||
@@ -100,6 +104,32 @@ void Model::CreateBuffers( std::vector<glm::vec3> vertices, std::vector<glm::vec
|
||||
LOG_WARNING("Created empty normal buffer!");
|
||||
}
|
||||
|
||||
LOG_INFO("Generating TangentNormalsBuffer");
|
||||
glGenBuffers(1, &TangentNormalsBuffer);
|
||||
if (tangents.size() > 0)
|
||||
{
|
||||
glBindBuffer(GL_ARRAY_BUFFER, TangentNormalsBuffer);
|
||||
glBufferData(GL_ARRAY_BUFFER, tangents.size() * sizeof(glm::vec3), &tangents[0], GL_STATIC_DRAW);
|
||||
GLERROR("GLEW: BufferFail, TangentNormalsBuffer");
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_WARNING("Created empty tangent buffer!");
|
||||
}
|
||||
|
||||
LOG_INFO("Generating BiTangentNormalsBuffer");
|
||||
glGenBuffers(1, &BiTangentNormalsBuffer);
|
||||
if (biTangents.size() > 0)
|
||||
{
|
||||
glBindBuffer(GL_ARRAY_BUFFER, BiTangentNormalsBuffer);
|
||||
glBufferData(GL_ARRAY_BUFFER, biTangents.size() * sizeof(glm::vec3), &biTangents[0], GL_STATIC_DRAW);
|
||||
GLERROR("GLEW: BufferFail, BiTangentNormalsBuffer");
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_WARNING("Created empty biTangent buffer!");
|
||||
}
|
||||
|
||||
|
||||
LOG_INFO("Generating textureCoordBuffer");
|
||||
glGenBuffers(1, &TextureCoordBuffer);
|
||||
@@ -130,10 +160,94 @@ void Model::CreateBuffers( std::vector<glm::vec3> vertices, std::vector<glm::vec
|
||||
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, 0);
|
||||
GLERROR("GLEW: BufferFail5");
|
||||
|
||||
glBindBuffer(GL_ARRAY_BUFFER, TangentNormalsBuffer);
|
||||
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, 0, 0);
|
||||
GLERROR("GLEW: BufferFail5");
|
||||
|
||||
glBindBuffer(GL_ARRAY_BUFFER, BiTangentNormalsBuffer);
|
||||
glVertexAttribPointer(4, 3, GL_FLOAT, GL_FALSE, 0, 0);
|
||||
GLERROR("GLEW: BufferFail5");
|
||||
|
||||
glEnableVertexAttribArray(0);
|
||||
glEnableVertexAttribArray(1);
|
||||
glEnableVertexAttribArray(2);
|
||||
glEnableVertexAttribArray(3);
|
||||
glEnableVertexAttribArray(4);
|
||||
GLERROR("GLEW: BufferFail5");
|
||||
}
|
||||
|
||||
bool Model::IsNear( float v1, float v2 )
|
||||
{
|
||||
return fabs(v1 - v2) < 0.01f;
|
||||
}
|
||||
|
||||
void Model::getSimilarVertexIndex()
|
||||
{
|
||||
for(int i = 0; i < Vertices.size(); i++)
|
||||
{
|
||||
for(int t = 0; t < Vertices.size(); t++)
|
||||
{
|
||||
if(i != t)
|
||||
{
|
||||
if(IsNear(Vertices[i].x, Vertices[t].x)
|
||||
& IsNear(Vertices[i].y, Vertices[t].y)
|
||||
& IsNear(Vertices[i].z, Vertices[t].z)
|
||||
)
|
||||
{
|
||||
glm::vec3 tempNormal, tempTangent, tempBiTangent;
|
||||
|
||||
tempNormal = glm::normalize(Normals[i] + Normals[t]);
|
||||
tempTangent = glm::normalize(TangentNormals[i] + TangentNormals[t]);
|
||||
tempBiTangent = glm::normalize(BiTangentNormals[i] + BiTangentNormals[t]);
|
||||
|
||||
Normals[i] = tempNormal;
|
||||
Normals[t] = tempNormal;
|
||||
|
||||
TangentNormals[i] = tempTangent;
|
||||
TangentNormals[t] = tempTangent;
|
||||
|
||||
BiTangentNormals[i] = tempBiTangent;
|
||||
BiTangentNormals[t] = tempBiTangent;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Model::CreateTangents()
|
||||
{
|
||||
for(int i = 0; i < Vertices.size(); i += 3)
|
||||
{
|
||||
glm::vec3 v0 = Vertices[i];
|
||||
glm::vec3 v1 = Vertices[i+1];
|
||||
glm::vec3 v2 = Vertices[i+2];
|
||||
|
||||
glm::vec2 uv0 = TextureCoords[i];
|
||||
glm::vec2 uv1 = TextureCoords[i+1];
|
||||
glm::vec2 uv2 = TextureCoords[i+2];
|
||||
|
||||
//Calculate the edge of the triangle
|
||||
glm::vec3 edge1 = v1-v0;
|
||||
glm::vec3 edge2 = v2-v0;
|
||||
|
||||
glm::vec2 deltaUV1 = uv1 - uv0;
|
||||
glm::vec2 deltaUV2 = uv2 - uv0;
|
||||
|
||||
float r = 1.0f / (deltaUV1.x * deltaUV2.y - deltaUV1.y * deltaUV2.x);
|
||||
glm::vec3 tangent, biTangent;
|
||||
|
||||
tangent = (edge1 * deltaUV2.y - edge2 * deltaUV1.y) * r;
|
||||
biTangent = (edge2 * deltaUV1.x - edge1 * deltaUV2.x) * r;
|
||||
|
||||
TangentNormals.push_back(tangent);
|
||||
TangentNormals.push_back(tangent);
|
||||
TangentNormals.push_back(tangent);
|
||||
|
||||
BiTangentNormals.push_back(biTangent);
|
||||
BiTangentNormals.push_back(biTangent);
|
||||
BiTangentNormals.push_back(biTangent);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user