Sprite: Add special case shader for translucent effect
Translucent sprites (opacity < 255) are very common, so using a custom shader instead of the full blown effect one helps a lot, especially on mobile.
This commit is contained in:
parent
a53163660f
commit
3c0a530eba
|
@ -220,6 +220,7 @@ set(EMBEDDED_INPUT
|
|||
shader/simple.frag
|
||||
shader/simpleColor.frag
|
||||
shader/simpleAlpha.frag
|
||||
shader/simpleAlphaUni.frag
|
||||
shader/flashMap.frag
|
||||
shader/simple.vert
|
||||
shader/simpleColor.vert
|
||||
|
|
1
mkxp.pro
1
mkxp.pro
|
@ -193,6 +193,7 @@ EMBED = \
|
|||
shader/simple.frag \
|
||||
shader/simpleColor.frag \
|
||||
shader/simpleAlpha.frag \
|
||||
shader/simpleAlphaUni.frag \
|
||||
shader/flashMap.frag \
|
||||
shader/simple.vert \
|
||||
shader/simpleColor.vert \
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
|
||||
uniform sampler2D texture;
|
||||
uniform lowp float alpha;
|
||||
|
||||
varying vec2 v_texCoord;
|
||||
|
||||
void main()
|
||||
{
|
||||
gl_FragColor = texture2D(texture, v_texCoord);
|
||||
gl_FragColor.a *= alpha;
|
||||
}
|
|
@ -38,6 +38,7 @@
|
|||
#include "simple.frag.xxd"
|
||||
#include "simpleColor.frag.xxd"
|
||||
#include "simpleAlpha.frag.xxd"
|
||||
#include "simpleAlphaUni.frag.xxd"
|
||||
#include "flashMap.frag.xxd"
|
||||
#include "simple.vert.xxd"
|
||||
#include "simpleColor.vert.xxd"
|
||||
|
@ -314,6 +315,27 @@ void SimpleSpriteShader::setSpriteMat(const float value[16])
|
|||
}
|
||||
|
||||
|
||||
AlphaSpriteShader::AlphaSpriteShader()
|
||||
{
|
||||
INIT_SHADER(sprite, simpleAlphaUni, AlphaSpriteShader);
|
||||
|
||||
ShaderBase::init();
|
||||
|
||||
GET_U(spriteMat);
|
||||
GET_U(alpha);
|
||||
}
|
||||
|
||||
void AlphaSpriteShader::setSpriteMat(const float value[16])
|
||||
{
|
||||
gl.UniformMatrix4fv(u_spriteMat, 1, GL_FALSE, value);
|
||||
}
|
||||
|
||||
void AlphaSpriteShader::setAlpha(float value)
|
||||
{
|
||||
gl.Uniform1f(u_alpha, value);
|
||||
}
|
||||
|
||||
|
||||
TransShader::TransShader()
|
||||
{
|
||||
INIT_SHADER(simple, trans, TransShader);
|
||||
|
|
13
src/shader.h
13
src/shader.h
|
@ -121,6 +121,18 @@ private:
|
|||
GLint u_spriteMat;
|
||||
};
|
||||
|
||||
class AlphaSpriteShader : public ShaderBase
|
||||
{
|
||||
public:
|
||||
AlphaSpriteShader();
|
||||
|
||||
void setSpriteMat(const float value[16]);
|
||||
void setAlpha(float value);
|
||||
|
||||
private:
|
||||
GLint u_spriteMat, u_alpha;
|
||||
};
|
||||
|
||||
class TransShader : public ShaderBase
|
||||
{
|
||||
public:
|
||||
|
@ -277,6 +289,7 @@ struct ShaderSet
|
|||
SimpleColorShader simpleColor;
|
||||
SimpleAlphaShader simpleAlpha;
|
||||
SimpleSpriteShader simpleSprite;
|
||||
AlphaSpriteShader alphaSprite;
|
||||
SpriteShader sprite;
|
||||
PlaneShader plane;
|
||||
TilemapShader tilemap;
|
||||
|
|
|
@ -515,7 +515,6 @@ void Sprite::draw()
|
|||
|
||||
bool renderEffect = p->color->hasEffect() ||
|
||||
p->tone->hasEffect() ||
|
||||
p->opacity != 255 ||
|
||||
flashing ||
|
||||
p->bushDepth != 0;
|
||||
|
||||
|
@ -541,6 +540,16 @@ void Sprite::draw()
|
|||
|
||||
base = &shader;
|
||||
}
|
||||
else if (p->opacity != 255)
|
||||
{
|
||||
AlphaSpriteShader &shader = shState->shaders().alphaSprite;
|
||||
shader.bind();
|
||||
|
||||
shader.setSpriteMat(p->trans.getMatrix());
|
||||
shader.setAlpha(p->opacity.norm);
|
||||
shader.applyViewportProj();
|
||||
base = &shader;
|
||||
}
|
||||
else
|
||||
{
|
||||
SimpleSpriteShader &shader = shState->shaders().simpleSprite;
|
||||
|
|
Loading…
Reference in New Issue