Added Alpha Test
Former-commit-id: 59dc6ef8f1dbff49bb13cf452bf75326ad7a6257
This commit is contained in:
@@ -67,6 +67,7 @@ bool NzGLSLShader::Compile()
|
||||
CacheUniform(CameraPosition);
|
||||
CacheUniform(LightCount);
|
||||
CacheUniform(MaterialAlphaMap);
|
||||
CacheUniform(MaterialAlphaThreshold);
|
||||
CacheUniform(MaterialAmbient);
|
||||
CacheUniform(MaterialDiffuse);
|
||||
CacheUniform(MaterialDiffuseMap);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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";
|
||||
|
||||
|
||||
Reference in New Issue
Block a user