直接放例子代码,代码中以任意四边形为例,如果需要做任意多边形,注意libgdx不能直接用ShapeRender填充多边形,需要先切割成三角形。
public static void drawClip(Batch batch, Polygon polygon, TextureRegion region, float x, float y) { float[] vertices = polygon.getVertices(); if (shapes == null) { shapes = new ShapeRenderer(); } //2. clear our depth buffer with 1.0 Gdx.gl.glClearDepthf(1f); Gdx.gl.glClear(GL20.GL_DEPTH_BUFFER_BIT); //3. set the function to LESS Gdx.gl.glDepthFunc(GL20.GL_LESS); //4. enable depth writing Gdx.gl.glEnable(GL20.GL_DEPTH_TEST); //5. Enable depth writing, disable RGBA color writing Gdx.gl.glDepthMask(true); Gdx.gl.glColorMask(false, false, false, false); ///////////// Draw mask shape(s) //6. render your primitive shapes shapes.begin(ShapeRenderer.ShapeType.Filled); shapes.setColor(1f, 0f, 0f, 0.5f); shapes.identity(); shapes.triangle(vertices[0], vertices[1], vertices[4], vertices[5], vertices[2], vertices[3]); shapes.triangle(vertices[0], vertices[1], vertices[4], vertices[5], vertices[6], vertices[7]); // shapes.polyline(polygon.getVertices()); shapes.end(); ///////////// Draw sprite(s) to be masked if (!batch.isDrawing()) { batch.begin(); } //8. Enable RGBA color writing // (SpriteBatch.begin() will disable depth mask) Gdx.gl.glColorMask(true, true, true, true); //9. Make sure testing is enabled. Gdx.gl.glEnable(GL20.GL_DEPTH_TEST); //10. Now depth discards pixels outside our masked shapes Gdx.gl.glDepthFunc(GL20.GL_EQUAL); //push to the batch batch.draw(region, x, y); //end/flush your batch batch.end(); Gdx.gl.glDisable(GL20.GL_DEPTH_TEST); }