Added normal mapping
Former-commit-id: 7e54b1f01de7d5cf99c42d08d13ba606f73c453d
This commit is contained in:
parent
946754d7be
commit
e3293c6fe1
|
|
@ -50,6 +50,8 @@ class NAZARA_API NzMaterial : public NzResource
|
||||||
nzBlendFunc GetDstBlend() const;
|
nzBlendFunc GetDstBlend() const;
|
||||||
nzFaceCulling GetFaceCulling() const;
|
nzFaceCulling GetFaceCulling() const;
|
||||||
nzFaceFilling GetFaceFilling() const;
|
nzFaceFilling GetFaceFilling() const;
|
||||||
|
const NzTexture* GetHeightMap() const;
|
||||||
|
const NzTexture* GetNormalMap() const;
|
||||||
float GetShininess() const;
|
float GetShininess() const;
|
||||||
NzColor GetSpecularColor() const;
|
NzColor GetSpecularColor() const;
|
||||||
const NzTexture* GetSpecularMap() const;
|
const NzTexture* GetSpecularMap() const;
|
||||||
|
|
@ -75,6 +77,8 @@ class NAZARA_API NzMaterial : public NzResource
|
||||||
void SetDstBlend(nzBlendFunc func);
|
void SetDstBlend(nzBlendFunc func);
|
||||||
void SetFaceCulling(nzFaceCulling culling);
|
void SetFaceCulling(nzFaceCulling culling);
|
||||||
void SetFaceFilling(nzFaceFilling filling);
|
void SetFaceFilling(nzFaceFilling filling);
|
||||||
|
void SetHeightMap(const NzTexture* map);
|
||||||
|
void SetNormalMap(const NzTexture* map);
|
||||||
void SetSamplerWrap(nzSamplerWrap wrapMode);
|
void SetSamplerWrap(nzSamplerWrap wrapMode);
|
||||||
void SetShininess(float shininess);
|
void SetShininess(float shininess);
|
||||||
void SetSpecularColor(const NzColor& specular);
|
void SetSpecularColor(const NzColor& specular);
|
||||||
|
|
@ -100,6 +104,8 @@ class NAZARA_API NzMaterial : public NzResource
|
||||||
NzTextureSampler m_diffuseSampler;
|
NzTextureSampler m_diffuseSampler;
|
||||||
NzTextureSampler m_specularSampler;
|
NzTextureSampler m_specularSampler;
|
||||||
const NzTexture* m_diffuseMap;
|
const NzTexture* m_diffuseMap;
|
||||||
|
const NzTexture* m_heightMap;
|
||||||
|
const NzTexture* m_normalMap;
|
||||||
const NzTexture* m_specularMap;
|
const NzTexture* m_specularMap;
|
||||||
bool m_alphaBlendingEnabled;
|
bool m_alphaBlendingEnabled;
|
||||||
bool m_zTestEnabled;
|
bool m_zTestEnabled;
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,8 @@ bool NzMaterialParams::IsValid() const
|
||||||
|
|
||||||
NzMaterial::NzMaterial() :
|
NzMaterial::NzMaterial() :
|
||||||
m_diffuseMap(nullptr),
|
m_diffuseMap(nullptr),
|
||||||
|
m_heightMap(nullptr),
|
||||||
|
m_normalMap(nullptr),
|
||||||
m_specularMap(nullptr)
|
m_specularMap(nullptr)
|
||||||
{
|
{
|
||||||
Reset();
|
Reset();
|
||||||
|
|
@ -28,6 +30,12 @@ NzResource()
|
||||||
if (m_diffuseMap)
|
if (m_diffuseMap)
|
||||||
m_diffuseMap->AddResourceReference();
|
m_diffuseMap->AddResourceReference();
|
||||||
|
|
||||||
|
if (m_heightMap)
|
||||||
|
m_heightMap->AddResourceReference();
|
||||||
|
|
||||||
|
if (m_normalMap)
|
||||||
|
m_normalMap->AddResourceReference();
|
||||||
|
|
||||||
if (m_specularMap)
|
if (m_specularMap)
|
||||||
m_specularMap->AddResourceReference();
|
m_specularMap->AddResourceReference();
|
||||||
}
|
}
|
||||||
|
|
@ -37,6 +45,12 @@ NzMaterial::NzMaterial(NzMaterial&& material)
|
||||||
if (m_diffuseMap)
|
if (m_diffuseMap)
|
||||||
m_diffuseMap->RemoveResourceReference();
|
m_diffuseMap->RemoveResourceReference();
|
||||||
|
|
||||||
|
if (m_heightMap)
|
||||||
|
m_heightMap->AddResourceReference();
|
||||||
|
|
||||||
|
if (m_normalMap)
|
||||||
|
m_normalMap->AddResourceReference();
|
||||||
|
|
||||||
if (m_specularMap)
|
if (m_specularMap)
|
||||||
m_specularMap->RemoveResourceReference();
|
m_specularMap->RemoveResourceReference();
|
||||||
|
|
||||||
|
|
@ -44,6 +58,8 @@ NzMaterial::NzMaterial(NzMaterial&& material)
|
||||||
|
|
||||||
// Comme ça nous volons la référence du matériau
|
// Comme ça nous volons la référence du matériau
|
||||||
material.m_diffuseMap = nullptr;
|
material.m_diffuseMap = nullptr;
|
||||||
|
material.m_heightMap = nullptr;
|
||||||
|
material.m_normalMap = nullptr;
|
||||||
material.m_specularMap = nullptr;
|
material.m_specularMap = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -52,6 +68,12 @@ NzMaterial::~NzMaterial()
|
||||||
if (m_diffuseMap)
|
if (m_diffuseMap)
|
||||||
m_diffuseMap->RemoveResourceReference();
|
m_diffuseMap->RemoveResourceReference();
|
||||||
|
|
||||||
|
if (m_heightMap)
|
||||||
|
m_heightMap->RemoveResourceReference();
|
||||||
|
|
||||||
|
if (m_normalMap)
|
||||||
|
m_normalMap->RemoveResourceReference();
|
||||||
|
|
||||||
if (m_specularMap)
|
if (m_specularMap)
|
||||||
m_specularMap->RemoveResourceReference();
|
m_specularMap->RemoveResourceReference();
|
||||||
}
|
}
|
||||||
|
|
@ -91,6 +113,32 @@ void NzMaterial::Apply() const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_heightMap)
|
||||||
|
{
|
||||||
|
int heightMapLocation = shader->GetUniformLocation("MaterialHeightMap");
|
||||||
|
if (heightMapLocation != -1)
|
||||||
|
{
|
||||||
|
nzUInt8 textureUnit;
|
||||||
|
if (shader->SendTexture(heightMapLocation, m_heightMap, &textureUnit))
|
||||||
|
NzRenderer::SetTextureSampler(textureUnit, m_diffuseSampler);
|
||||||
|
else
|
||||||
|
NazaraWarning("Failed to send height map");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_normalMap)
|
||||||
|
{
|
||||||
|
int normalMapLocation = shader->GetUniformLocation("MaterialNormalMap");
|
||||||
|
if (normalMapLocation != -1)
|
||||||
|
{
|
||||||
|
nzUInt8 textureUnit;
|
||||||
|
if (shader->SendTexture(normalMapLocation, m_normalMap, &textureUnit))
|
||||||
|
NzRenderer::SetTextureSampler(textureUnit, m_diffuseSampler);
|
||||||
|
else
|
||||||
|
NazaraWarning("Failed to send normal map");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (shininessLocation != -1)
|
if (shininessLocation != -1)
|
||||||
shader->SendFloat(shininessLocation, m_shininess);
|
shader->SendFloat(shininessLocation, m_shininess);
|
||||||
|
|
||||||
|
|
@ -106,7 +154,7 @@ void NzMaterial::Apply() const
|
||||||
if (shader->SendTexture(specularMapLocation, m_specularMap, &textureUnit))
|
if (shader->SendTexture(specularMapLocation, m_specularMap, &textureUnit))
|
||||||
NzRenderer::SetTextureSampler(textureUnit, m_specularSampler);
|
NzRenderer::SetTextureSampler(textureUnit, m_specularSampler);
|
||||||
else
|
else
|
||||||
NazaraWarning("Failed to send diffuse map");
|
NazaraWarning("Failed to send specular map");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -183,6 +231,16 @@ nzFaceFilling NzMaterial::GetFaceFilling() const
|
||||||
return m_faceFilling;
|
return m_faceFilling;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const NzTexture* NzMaterial::GetHeightMap() const
|
||||||
|
{
|
||||||
|
return m_diffuseMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
const NzTexture* NzMaterial::GetNormalMap() const
|
||||||
|
{
|
||||||
|
return m_diffuseMap;
|
||||||
|
}
|
||||||
|
|
||||||
float NzMaterial::GetShininess() const
|
float NzMaterial::GetShininess() const
|
||||||
{
|
{
|
||||||
return m_shininess;
|
return m_shininess;
|
||||||
|
|
@ -256,6 +314,18 @@ void NzMaterial::Reset()
|
||||||
m_diffuseMap = nullptr;
|
m_diffuseMap = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_heightMap)
|
||||||
|
{
|
||||||
|
m_heightMap->RemoveResourceReference();
|
||||||
|
m_heightMap = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_normalMap)
|
||||||
|
{
|
||||||
|
m_normalMap->RemoveResourceReference();
|
||||||
|
m_normalMap = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
if (m_specularMap)
|
if (m_specularMap)
|
||||||
{
|
{
|
||||||
m_specularMap->RemoveResourceReference();
|
m_specularMap->RemoveResourceReference();
|
||||||
|
|
@ -318,6 +388,26 @@ void NzMaterial::SetFaceFilling(nzFaceFilling filling)
|
||||||
m_faceFilling = filling;
|
m_faceFilling = filling;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NzMaterial::SetHeightMap(const NzTexture* map)
|
||||||
|
{
|
||||||
|
if (m_heightMap)
|
||||||
|
m_heightMap->RemoveResourceReference();
|
||||||
|
|
||||||
|
m_heightMap = map;
|
||||||
|
if (m_heightMap)
|
||||||
|
m_heightMap->AddResourceReference();
|
||||||
|
}
|
||||||
|
|
||||||
|
void NzMaterial::SetNormalMap(const NzTexture* map)
|
||||||
|
{
|
||||||
|
if (m_normalMap)
|
||||||
|
m_normalMap->RemoveResourceReference();
|
||||||
|
|
||||||
|
m_normalMap = map;
|
||||||
|
if (m_normalMap)
|
||||||
|
m_normalMap->AddResourceReference();
|
||||||
|
}
|
||||||
|
|
||||||
void NzMaterial::SetShininess(float shininess)
|
void NzMaterial::SetShininess(float shininess)
|
||||||
{
|
{
|
||||||
m_shininess = shininess;
|
m_shininess = shininess;
|
||||||
|
|
|
||||||
|
|
@ -79,23 +79,30 @@ namespace
|
||||||
|
|
||||||
if (flags & nzShaderBuilder_Lighting)
|
if (flags & nzShaderBuilder_Lighting)
|
||||||
{
|
{
|
||||||
|
if (flags & nzShaderBuilder_NormalMapping)
|
||||||
|
sourceCode += "uniform sampler2D MaterialNormalMap;\n";
|
||||||
|
|
||||||
sourceCode += "uniform float MaterialShininess;\n"
|
sourceCode += "uniform float MaterialShininess;\n"
|
||||||
"uniform vec4 MaterialSpecular;\n";
|
"uniform vec4 MaterialSpecular;\n";
|
||||||
}
|
|
||||||
|
|
||||||
if (flags & nzShaderBuilder_SpecularMapping)
|
if (flags & nzShaderBuilder_SpecularMapping)
|
||||||
sourceCode += "uniform sampler2D MaterialSpecularMap;\n";
|
sourceCode += "uniform sampler2D MaterialSpecularMap;\n";
|
||||||
|
|
||||||
if (flags & nzShaderBuilder_Lighting)
|
|
||||||
sourceCode += "uniform vec4 SceneAmbient;\n";
|
sourceCode += "uniform vec4 SceneAmbient;\n";
|
||||||
|
}
|
||||||
|
|
||||||
sourceCode += '\n';
|
sourceCode += '\n';
|
||||||
|
|
||||||
/********************Entrant********************/
|
/********************Entrant********************/
|
||||||
if (flags & nzShaderBuilder_Lighting)
|
if (flags & nzShaderBuilder_Lighting)
|
||||||
sourceCode += inKW + " vec3 vNormal;\n";
|
{
|
||||||
|
if (flags & nzShaderBuilder_NormalMapping)
|
||||||
|
sourceCode += inKW + " mat3 vLightToWorld;\n";
|
||||||
|
|
||||||
if (flags & nzShaderBuilder_DiffuseMapping)
|
sourceCode += inKW + " vec3 vNormal;\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & nzShaderBuilder_DiffuseMapping || flags & nzShaderBuilder_NormalMapping)
|
||||||
sourceCode += inKW + " vec2 vTexCoord;\n";
|
sourceCode += inKW + " vec2 vTexCoord;\n";
|
||||||
|
|
||||||
if (flags & nzShaderBuilder_Lighting)
|
if (flags & nzShaderBuilder_Lighting)
|
||||||
|
|
@ -120,8 +127,12 @@ namespace
|
||||||
if (flags & nzShaderBuilder_SpecularMapping)
|
if (flags & nzShaderBuilder_SpecularMapping)
|
||||||
sourceCode += "vec3 si = vec3(0.0, 0.0, 0.0);\n";
|
sourceCode += "vec3 si = vec3(0.0, 0.0, 0.0);\n";
|
||||||
|
|
||||||
sourceCode += "vec3 normal = normalize(vNormal);\n"
|
if (flags & nzShaderBuilder_NormalMapping)
|
||||||
"\n"
|
sourceCode += "vec3 normal = normalize(vLightToWorld * (2.0 * vec3(texture2D(MaterialNormalMap, vTexCoord)) - 1.0));\n";
|
||||||
|
else
|
||||||
|
sourceCode += "vec3 normal = normalize(vNormal);\n";
|
||||||
|
|
||||||
|
sourceCode += "\n"
|
||||||
"for (int i = 0; i < LightCount; ++i)\n"
|
"for (int i = 0; i < LightCount; ++i)\n"
|
||||||
"{\n";
|
"{\n";
|
||||||
|
|
||||||
|
|
@ -303,10 +314,10 @@ namespace
|
||||||
sourceCode += inKW + " vec3 VertexPosition;\n";
|
sourceCode += inKW + " vec3 VertexPosition;\n";
|
||||||
|
|
||||||
if (flags & nzShaderBuilder_Lighting)
|
if (flags & nzShaderBuilder_Lighting)
|
||||||
|
{
|
||||||
sourceCode += inKW + " vec3 VertexNormal;\n";
|
sourceCode += inKW + " vec3 VertexNormal;\n";
|
||||||
|
|
||||||
if (flags & nzShaderBuilder_Lighting)
|
|
||||||
sourceCode += inKW + " vec3 VertexTangent;\n";
|
sourceCode += inKW + " vec3 VertexTangent;\n";
|
||||||
|
}
|
||||||
|
|
||||||
if (flags & nzShaderBuilder_DiffuseMapping)
|
if (flags & nzShaderBuilder_DiffuseMapping)
|
||||||
sourceCode += inKW + " vec2 VertexTexCoord0;\n";
|
sourceCode += inKW + " vec2 VertexTexCoord0;\n";
|
||||||
|
|
@ -315,9 +326,14 @@ namespace
|
||||||
|
|
||||||
/********************Sortant********************/
|
/********************Sortant********************/
|
||||||
if (flags & nzShaderBuilder_Lighting)
|
if (flags & nzShaderBuilder_Lighting)
|
||||||
sourceCode += outKW + " vec3 vNormal;\n";
|
{
|
||||||
|
if (flags & nzShaderBuilder_NormalMapping)
|
||||||
|
sourceCode += outKW + " mat3 vLightToWorld;";
|
||||||
|
|
||||||
if (flags & nzShaderBuilder_DiffuseMapping)
|
sourceCode += outKW + " vec3 vNormal;\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & nzShaderBuilder_DiffuseMapping || flags & nzShaderBuilder_NormalMapping)
|
||||||
sourceCode += outKW + " vec2 vTexCoord;\n";
|
sourceCode += outKW + " vec2 vTexCoord;\n";
|
||||||
|
|
||||||
if (flags & nzShaderBuilder_Lighting)
|
if (flags & nzShaderBuilder_Lighting)
|
||||||
|
|
@ -331,9 +347,23 @@ namespace
|
||||||
"gl_Position = WorldViewProjMatrix * vec4(VertexPosition, 1.0);\n";
|
"gl_Position = WorldViewProjMatrix * vec4(VertexPosition, 1.0);\n";
|
||||||
|
|
||||||
if (flags & nzShaderBuilder_Lighting)
|
if (flags & nzShaderBuilder_Lighting)
|
||||||
sourceCode += "vNormal = normalize(mat3(WorldMatrix) * VertexNormal);\n";
|
{
|
||||||
|
sourceCode += "mat3 RotationMatrix = mat3(WorldMatrix);\n";
|
||||||
|
|
||||||
if (flags & nzShaderBuilder_DiffuseMapping)
|
if (flags & nzShaderBuilder_NormalMapping)
|
||||||
|
{
|
||||||
|
sourceCode += "\n"
|
||||||
|
"vec3 binormal = cross(VertexNormal, VertexTangent);\n"
|
||||||
|
"vLightToWorld[0] = VertexTangent * RotationMatrix;\n"
|
||||||
|
"vLightToWorld[1] = binormal * RotationMatrix;\n"
|
||||||
|
"vLightToWorld[2] = normalize(VertexNormal * RotationMatrix);\n"
|
||||||
|
"\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
sourceCode += "vNormal = normalize(RotationMatrix * VertexNormal);\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & nzShaderBuilder_DiffuseMapping || flags & nzShaderBuilder_NormalMapping)
|
||||||
sourceCode += "vTexCoord = VertexTexCoord0;\n";
|
sourceCode += "vTexCoord = VertexTexCoord0;\n";
|
||||||
|
|
||||||
if (flags & nzShaderBuilder_Lighting)
|
if (flags & nzShaderBuilder_Lighting)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue