Added Alpha Test

Former-commit-id: 59dc6ef8f1dbff49bb13cf452bf75326ad7a6257
This commit is contained in:
Lynix
2013-06-27 19:02:31 +02:00
parent 9d8ce1ce4b
commit 30cb518c74
5 changed files with 71 additions and 23 deletions

View File

@@ -67,6 +67,7 @@ bool NzGLSLShader::Compile()
CacheUniform(CameraPosition);
CacheUniform(LightCount);
CacheUniform(MaterialAlphaMap);
CacheUniform(MaterialAlphaThreshold);
CacheUniform(MaterialAmbient);
CacheUniform(MaterialDiffuse);
CacheUniform(MaterialDiffuseMap);

View File

@@ -42,6 +42,7 @@ NzMaterial::NzMaterial(NzMaterial&& material)
void NzMaterial::Apply(const NzShader* shader) const
{
int alphaThresholdLocation = shader->GetUniformLocation(nzShaderUniform_MaterialAlphaThreshold);
int ambientColorLocation = shader->GetUniformLocation(nzShaderUniform_MaterialAmbient);
int diffuseColorLocation = shader->GetUniformLocation(nzShaderUniform_MaterialDiffuse);
int shininessLocation = shader->GetUniformLocation(nzShaderUniform_MaterialShininess);
@@ -60,6 +61,9 @@ void NzMaterial::Apply(const NzShader* shader) const
}
}
if (alphaThresholdLocation != -1)
shader->SendFloat(alphaThresholdLocation, m_alphaThreshold);
if (ambientColorLocation != -1)
shader->SendColor(ambientColorLocation, m_ambientColor);
@@ -153,6 +157,15 @@ void NzMaterial::Enable(nzRendererParameter renderParameter, bool enable)
m_states.parameters[renderParameter] = enable;
}
void NzMaterial::EnableAlphaTest(bool alphaTest)
{
m_alphaTestEnabled = alphaTest;
if (m_alphaTestEnabled)
m_shaderFlags |= nzShaderFlags_AlphaTest;
else
m_shaderFlags &= ~nzShaderFlags_AlphaTest;
}
void NzMaterial::EnableLighting(bool lighting)
{
m_lightingEnabled = lighting;
@@ -167,6 +180,11 @@ NzTexture* NzMaterial::GetAlphaMap() const
return m_alphaMap;
}
float NzMaterial::GetAlphaThreshold() const
{
return m_alphaThreshold;
}
NzColor NzMaterial::GetAmbientColor() const
{
return m_ambientColor;
@@ -290,6 +308,11 @@ bool NzMaterial::IsEnabled(nzRendererParameter parameter) const
return m_states.parameters[parameter];
}
bool NzMaterial::IsAlphaTestEnabled() const
{
return m_alphaTestEnabled;
}
bool NzMaterial::IsLightingEnabled() const
{
return m_lightingEnabled;
@@ -320,6 +343,8 @@ void NzMaterial::Reset()
m_normalMap.Reset();
m_specularMap.Reset();
m_alphaThreshold = 0.2f;
m_alphaTestEnabled = false;
m_ambientColor = NzColor(128, 128, 128);
m_diffuseColor = NzColor::White;
m_diffuseSampler = NzTextureSampler();
@@ -359,6 +384,11 @@ void NzMaterial::SetAlphaMap(NzTexture* map)
m_shaderFlags &= ~nzShaderFlags_AlphaMapping;
}
void NzMaterial::SetAlphaThreshold(float alphaThreshold)
{
m_alphaThreshold = alphaThreshold;
}
void NzMaterial::SetAmbientColor(const NzColor& ambient)
{
m_ambientColor = ambient;

View File

@@ -77,6 +77,9 @@ namespace
if (flags & nzShaderFlags_AlphaMapping)
sourceCode += "uniform sampler2D MaterialAlphaMap;\n";
if (flags & nzShaderFlags_AlphaTest)
sourceCode += "uniform float MaterialAlphaThreshold;\n";
sourceCode += "uniform vec4 MaterialDiffuse;\n";
if (flags & nzShaderFlags_DiffuseMapping)
@@ -128,6 +131,18 @@ namespace
sourceCode += "void main()\n"
"{\n";
sourceCode += "float alpha = MaterialDiffuse.a";
if (flags & nzShaderFlags_AlphaMapping)
sourceCode += '*' + textureLookupKW + "(MaterialAlphaMap, vTexCoord).r";
sourceCode += ";\n";
if (flags & nzShaderFlags_AlphaTest)
{
sourceCode += "if (alpha < MaterialAlphaThreshold)\n"
"discard;\n";
}
if (flags & nzShaderFlags_Lighting)
{
sourceCode += "vec3 light = vec3(0.0, 0.0, 0.0);\n";
@@ -281,11 +296,6 @@ namespace
sourceCode += ";\n";
if (flags & nzShaderFlags_AlphaMapping)
sourceCode += "float alpha = " + textureLookupKW + "(MaterialAlphaMap, vTexCoord).r;\n";
else
sourceCode += "float alpha = MaterialDiffuse.a;\n";
if (flags & nzShaderFlags_EmissiveMapping)
{
sourceCode += "float intensity = light.r*0.3 + light.g*0.59 + light.b*0.11;\n"
@@ -295,16 +305,15 @@ namespace
else
sourceCode += fragmentColorKW + " = vec4(lighting, alpha);\n";
}
else if (flags & nzShaderFlags_DiffuseMapping)
{
sourceCode += fragmentColorKW + " = MaterialDiffuse*";
if (flags & nzShaderFlags_AlphaMapping)
sourceCode += "vec4(" + textureLookupKW + "(MaterialDiffuseMap, vTexCoord).rgb, " + textureLookupKW + "(MaterialAlphaMap, vTexCoord).r);\n";
else
sourceCode += textureLookupKW + "(MaterialDiffuseMap, vTexCoord);\n";
}
else
sourceCode += fragmentColorKW + " = MaterialDiffuse;\n";
{
sourceCode += fragmentColorKW + " = MaterialDiffuse";
if (flags & nzShaderFlags_DiffuseMapping)
sourceCode += "*vec4(" + textureLookupKW + "(MaterialDiffuseMap, vTexCoord).rgb, alpha);\n";
sourceCode += ";\n";
}
sourceCode += "}\n";