我找到了一些转换精灵,想在我的程序中使用它们。这只是一张黑白照片。
如何从这个精灵中获取亮度值以下的每个像素并将这些像素画成黑色,以获得动画?
我试过这样的事情:
sr.begin(ShapeType.Filled);
sr.setColor(0, 0, 0, 1f);
for(int y = 0; y < 320; y ++) {
for(int x = 0; x < 531; x ++) {
transSprite.getTexture().getTextureData().prepare();
int brightness = transSprite.getTexture().getTextureData().consumePixmap().getPixel(x, y);
if(brightness <= alpha * 255) {
sr.rect(x, y, 1, 1);
}
}
}
sr.end();
但这太慢了。
对于动画,我的分辨率为531 x 320像素,且alpha值介于0和1之间。
你有什么想法吗?
答案 0 :(得分:0)
这可以使用着色器完成。创建具有阈值的自定义着色器以与SpriteBatch一起使用。我复制了默认的sprite批处理着色器,但更改了片段着色器部分。
String vertexShader = "attribute vec4 " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" //
+ "attribute vec4 " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" //
+ "attribute vec2 " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n" //
+ "uniform mat4 u_projTrans;\n" //
+ "varying vec4 v_color;\n" //
+ "varying vec2 v_texCoords;\n" //
+ "\n" //
+ "void main()\n" //
+ "{\n" //
+ " v_color = " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" //
+ " v_texCoords = " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n" //
+ " gl_Position = u_projTrans * " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" //
+ "}\n";
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_threshold;\n" //
+ "void main()\n"//
+ "{\n" //
+ " vec4 texture = texture2D(u_texture, v_texCoords);\n" //
+ " gl_FragColor = v_color * step(u_threshold, texture.r);\n" //
+ "}";
customShader = new ShaderProgram(vertexShader, fragmentShader);
然后,您可以通过更改u_threshold
值来为其设置动画。
spriteBatch.setShader(customShader);
spriteBatch.begin();
customShader.setUniformf("u_threshold", brightness); //where brightness is from 0 to 1
spriteBatch.draw(sprite);
spriteBatch.end();