在 LibGdx 中创建拼图游戏的最佳方式。有一种替代方法可以通过使用遮罩从 LibGdx 中的图像中获取片段。遮罩是通过创建一个着色器程序来实现的,即对于这个问题,我们必须编写一个
1.顶点着色器
2.片段着色器
3.创建着色器程序
4.创建自定义精灵批次。
有关着色器的更多信息:https://github.com/libgdx/libgdx/wiki/Shaders
着色器程序如下所示:
用于遮罩的顶点着色器下方:-
-
顶点着色器:顶点着色器负责对顶点执行操作。
`
统一 mat4 u_projTrans;
attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;
varying vec4 v_color;
varying vec2 v_texCoord0;
void main()
{
v_color = a_color;
v_texCoord0 = a_texCoord0;
gl_Position = u_projTrans * a_position;
} `
2.Fragment Shader:片段着色器的功能与顶点着色器非常相似。但是不是在顶点上处理它,而是为每个片段处理一次。
`#ifdef GL_ES
precision mediump float;
#endif
uniform sampler2D u_texture;
uniform sampler2D u_mask;
varying vec4 v_color;
varying vec2 v_texCoord0;
void main()
{
vec4 texColor = texture2D(u_texture, v_texCoord0);
vec4 mask = texture2D(u_mask, v_texCoord0);
texColor.a *= mask.a;
gl_FragColor = v_color * texColor;
}`
-
使用顶点着色器和片段着色器创建着色器程序:
public class MyShader {
private FileHandle fragmentShader = Gdx.files.internal("fragment.glsl");
private FileHandle vertexShader = Gdx.files.internal("vertex.glsl");
public ShaderProgram myShader = new ShaderProgram(this.vertexShader,
this.fragmentShader);
public MyShader () {
this.myShader .begin();
this.myShader .setUniformi("u_texture", 0);
this.myShader .setUniformi("u_mask", 1);
this.myShader .end();
}
}
4.Custom Sprite Batch for Masking:
batch.setShader(MyShader.myShader);
this.alphaTexture.bind(1);
this.color.getTexture().bind(0);
batch.enableBlending();
Color c = getColor();
batch.draw(this.color, getX(), getY(), getOriginX(),
getOriginY(),
getWidth(), getHeight(), getScaleX(), getScaleY(), 0.0f);
batch.setShader(null);
ShaderLesson:https://github.com/mattdesl/lwjgl-basics/wiki/ShaderLesson2