Add EMT_STK_GRASS for GLES2 to draw grass material without vertex color

Now EMT_TRANSPARENT_ALPHA_CHANNEL_REF in GLES2 can be used with vertex
color
This commit is contained in:
Benau 2018-11-30 23:33:30 +08:00
parent 874895ba11
commit b3e41db14b
5 changed files with 32 additions and 5 deletions

View File

@ -12,6 +12,7 @@ precision mediump float;
#define TransparentAlphaChannelRef 7 #define TransparentAlphaChannelRef 7
#define TransparentVertexAlpha 8 #define TransparentVertexAlpha 8
#define TransparentReflection2Layer 9 #define TransparentReflection2Layer 9
#define StkGrass 10
/* Uniforms */ /* Uniforms */
@ -101,6 +102,16 @@ vec4 renderTransparent()
return Color; return Color;
} }
vec4 renderTransparentVertexColor()
{
vec4 Color = varVertexColor;
if(uTextureUsage0)
Color *= texture2D(uTextureUnit0, varTexCoord0);
return Color;
}
void main () void main ()
{ {
if (uMaterialType == Solid) if (uMaterialType == Solid)
@ -119,11 +130,16 @@ void main ()
gl_FragColor = renderTransparent(); gl_FragColor = renderTransparent();
else if(uMaterialType == TransparentAlphaChannelRef) else if(uMaterialType == TransparentAlphaChannelRef)
{ {
vec4 Color = renderTransparent(); vec4 Color = renderTransparentVertexColor();
if (Color.a < 0.5)
discard;
gl_FragColor = Color;
}
else if(uMaterialType == StkGrass)
{
vec4 Color = renderTransparent();
if (Color.a < 0.5) if (Color.a < 0.5)
discard; discard;
gl_FragColor = Color; gl_FragColor = Color;
} }
else if(uMaterialType == TransparentVertexAlpha) else if(uMaterialType == TransparentVertexAlpha)
@ -142,4 +158,4 @@ void main ()
} }
else else
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
} }

View File

@ -192,6 +192,9 @@ namespace video
/** Using only first texture. Generic blending method. */ /** Using only first texture. Generic blending method. */
EMT_ONETEXTURE_BLEND, EMT_ONETEXTURE_BLEND,
//! Alphatest material for grass without using vertex color in stk. */
EMT_STK_GRASS,
//! This value is not used. It only forces this enumeration to compile to 32 bit. //! This value is not used. It only forces this enumeration to compile to 32 bit.
EMT_FORCE_32BIT = 0x7fffffff EMT_FORCE_32BIT = 0x7fffffff
}; };

View File

@ -435,7 +435,7 @@ namespace video
addAndDropMaterialRenderer(new COGLES2ParallaxMapRenderer(PMVSData, PMFSData, EMT_PARALLAX_MAP_TRANSPARENT_VERTEX_ALPHA, this)); addAndDropMaterialRenderer(new COGLES2ParallaxMapRenderer(PMVSData, PMFSData, EMT_PARALLAX_MAP_TRANSPARENT_VERTEX_ALPHA, this));
addAndDropMaterialRenderer(new COGLES2FixedPipelineRenderer(FPVSData, FPFSData, EMT_ONETEXTURE_BLEND, this)); addAndDropMaterialRenderer(new COGLES2FixedPipelineRenderer(FPVSData, FPFSData, EMT_ONETEXTURE_BLEND, this));
addAndDropMaterialRenderer(new COGLES2FixedPipelineRenderer(FPVSData, FPFSData, EMT_STK_GRASS, this));
delete[] FPVSData; delete[] FPVSData;
delete[] FPFSData; delete[] FPFSData;
delete[] NMVSData; delete[] NMVSData;

View File

@ -129,6 +129,9 @@ bool COGLES2FixedPipelineRenderer::OnRender(IMaterialRendererServices* service,
case EMT_TRANSPARENT_REFLECTION_2_LAYER: case EMT_TRANSPARENT_REFLECTION_2_LAYER:
materialType = 9; materialType = 9;
break; break;
case EMT_STK_GRASS:
materialType = 10;
break;
default: default:
break; break;
} }

View File

@ -819,6 +819,9 @@ void Material::setMaterialProperties(video::SMaterial *m, scene::IMeshBuffer* m
} }
else if (m_shader_name == "grass") else if (m_shader_name == "grass")
{ {
#ifdef USE_GLES2
m->MaterialType = video::EMT_STK_GRASS;
#else
m->MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF; m->MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
#ifndef SERVER_ONLY #ifndef SERVER_ONLY
@ -831,6 +834,8 @@ void Material::setMaterialProperties(video::SMaterial *m, scene::IMeshBuffer* m
m->EmissiveColor = video::SColor(255, 150, 150, 150); m->EmissiveColor = video::SColor(255, 150, 150, 150);
m->SpecularColor = video::SColor(255, 150, 150, 150); m->SpecularColor = video::SColor(255, 150, 150, 150);
} }
#endif
#endif #endif
} }