首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libgdx -交叉衰落的双粒子

libgdx -交叉衰落的双粒子
EN

Stack Overflow用户
提问于 2014-07-11 04:10:50
回答 1查看 357关注 0票数 0

我有两个精灵,我想从一个消失到另一个,就像:

代码语言:javascript
复制
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看起来很好,但它会混淆两个精灵的颜色。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-11 12:57:27

我不认为他们会“几乎完全”透明,而只是部分透明。如果你有两个50%透明的物体在彼此面前,你仍然可以看穿他们对。如果你做的是全屏交叉褪色,你正确的做法是在另一个精灵后面100%的地方画两个精灵中的一个,只修改前面的精灵的阿尔法。然而,当两个精灵都有一个alpha通道时,这就不那么容易了。

一种方法是多纹理化,这实际上不是SpriteBatch的设计方式。如果您使用SpriteBatch进行多纹理处理,则需要确保两个精灵与各自纹理的相同TextureRegion对齐,或者您可以将它们放置在相同的纹理中,并在着色器中使用已知的偏移量来分离它们。然后,您可以使用自定义着色器混合两个精灵在着色器之前,绘制他们。

如果你的精灵将保持单色,这就变得容易多了。您只需将两个精灵组合成一个精灵,方法是在图像的R和G通道中放置一个精灵的颜色和α,在B和A频道中放置另一个精灵的颜色和α。然后使用自定义着色器与这样的片段着色器:

代码语言:javascript
复制
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组件来表示混合值,那么您可以避免这种情况。然后阴影就会变成

代码语言:javascript
复制
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" //
        + "}";
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24689982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档