我有两个精灵,我想从一个消失到另一个,就像:
Sprite sprite1, sprite2;
float alpha = 1;
...
public void render(float delta) {
alpha -= 0.01f;
if (alpha<0) alpha = 0;
sprite1.setAlpha(alpha);
sprite2.setAlpha(1-alpha);
sprite1.draw(batch);
sprite2.draw(batch);
}但是当我这样做的时候,混合是不对的,组合的图像在α为0.5的地方变得几乎完全透明。我在这里做了一个关于这个问题的视频:http://vimeo.com/100472883 - sprite1是锐利的云图像,sprite2是模糊的云图像,而我正在从一个到另一个逐渐消失。
如果我在绘制精灵之前使用batch.setBlendFunction(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_CONSTANT_ALPHA);,图像的alpha看起来很好,但它会混淆两个精灵的颜色。
发布于 2014-07-11 12:57:27
我不认为他们会“几乎完全”透明,而只是部分透明。如果你有两个50%透明的物体在彼此面前,你仍然可以看穿他们对。如果你做的是全屏交叉褪色,你正确的做法是在另一个精灵后面100%的地方画两个精灵中的一个,只修改前面的精灵的阿尔法。然而,当两个精灵都有一个alpha通道时,这就不那么容易了。
一种方法是多纹理化,这实际上不是SpriteBatch的设计方式。如果您使用SpriteBatch进行多纹理处理,则需要确保两个精灵与各自纹理的相同TextureRegion对齐,或者您可以将它们放置在相同的纹理中,并在着色器中使用已知的偏移量来分离它们。然后,您可以使用自定义着色器混合两个精灵在着色器之前,绘制他们。
如果你的精灵将保持单色,这就变得容易多了。您只需将两个精灵组合成一个精灵,方法是在图像的R和G通道中放置一个精灵的颜色和α,在B和A频道中放置另一个精灵的颜色和α。然后使用自定义着色器与这样的片段着色器:
String fragmentShader = "#ifdef GL_ES\n" //
+ "#define LOWP lowp\n" //
+ "precision mediump float;\n" //
+ "#else\n" //
+ "#define LOWP \n" //
+ "#endif\n" //
+ "varying LOWP vec4 v_color;\n" //
+ "varying vec2 v_texCoords;\n" //
+ "uniform sampler2D u_texture;\n" //
+ "uniform float u_crossfade;\n" //
+ "void main()\n"//
+ "{\n" //
+ " vec4 texture = texture2D(u_texture, v_texCoords);\n" //
+ " float sprite1Alpha = (1 - u_crossfade) * texture.g * v_color.a;\n" //
+ " float sprite2Alpha = u_crossfade * texture.a * v_color.a;\n" //
+ " gl_FragColor = v_color * vec4(vec3(sprite1Alpha*texture.r + sprite2Alpha*texture.b), sprite1Alpha + sprite2Alpha);\n" //
+ "}";这应该用blendfunc GL_ONE,GL_ONE_MINUS_SRC_ALPHA绘制,因为它预先乘以了alpha.您需要在customShader.setUniformf("u_crossfade", crossfadeBlendValue);和spriteBatch.begin()之间调用end()。这意味着,如果每个精灵需要不同的交叉点,一次只能批处理一个雪碧。
如果您不打算用精灵色调的R组件来表示混合值,那么您可以避免这种情况。然后阴影就会变成
String fragmentShader = "#ifdef GL_ES\n" //
+ "#define LOWP lowp\n" //
+ "precision mediump float;\n" //
+ "#else\n" //
+ "#define LOWP \n" //
+ "#endif\n" //
+ "varying LOWP vec4 v_color;\n" //
+ "varying vec2 v_texCoords;\n" //
+ "uniform sampler2D u_texture;\n" //
+ "void main()\n"//
+ "{\n" //
+ " vec4 texture = texture2D(u_texture, v_texCoords);\n" //
+ " float sprite1Alpha = (1 - v_color.r) * texture.g * v_color.a;\n" //
+ " float sprite2Alpha = v_color.r * texture.a * v_color.a;\n" //
+ " gl_FragColor = vec4(vec3(sprite1Alpha*texture.r + sprite2Alpha*texture.b), sprite1Alpha + sprite2Alpha);\n" //
+ "}";https://stackoverflow.com/questions/24689982
复制相似问题