2016-10-17 19 views
3

:画面全体が黒くなりますLibgdxステンシル&ShapeRenderer

sample image

は、その後、三角形の内側にのみ表示されます部品です。

私はSCISSORを使ってみましたが、形状は長方形です。

*オリジナルイメージソース:https://www.html5rocks.com/static/images/screenshots/casestudies/onslaught/controls_tutorial.png

+0

あなたが到達しようとしている効果を作り出す方法はたくさんあります。私の頭に浮かぶ最も簡単な方法は、ステンシルバッファを使用することです(ステンシルテストに関するチュートリアルがたくさんあります)。 より一般的な答えが必要な場合は、このwikiをマスキングのセクションとして使用してください:https://github.com/mattdesl/lwjgl-basics/wiki/LibGDX-Masking –

+0

これは、形状が長方形のはさみを示しています。 – nightrobin

+0

私はそれは、OpenGL ESはないですけど、これは非常に近いはず: https://en.wikibooks.org/wiki/OpenGL_Programming/Stencil_buffer 例では、ステンシルを円で使用されるが、三角形を描いています簡単にする必要があります。 –

答えて

1

あなたがマスクされた画像をレンダリングすることができますいくつかの異なる方法があります。 1つの可能な方法は、深度バッファを使用することです。 ShapeRendererを使用してバッファの設定を行い、残りの部分をレンダリングしてマスクするためのイメージの三角形領域を定義するプロセスを示す小さなメソッドを作成しました。三角マスクは、ShapeRendererがレンダリングできる他の任意のシェイプに置き換えることができます。

// For a 2D image use an OrthographicCamera 
OrthographicCamera cam = new OrthographicCamera(); 
ShapeRenderer shapes = new ShapeRenderer(); 
cam.setToOrtho(true, screenWidth, screenHeight); 
shapes.setProjectionMatrix(cam.combined); 

private void renderStencilImage(float runTime){ 
    // Clear the buffer 
    Gdx.gl.glClearDepthf(1.0f); 
    Gdx.gl.glClear(GL30.GL_DEPTH_BUFFER_BIT); 
    // Disable writing to frame buffer and 
    // Set up the depth test 
    Gdx.gl.glColorMask(false, false, false, false); 
    Gdx.gl.glDepthFunc(GL20.GL_LESS); 
    Gdx.gl.glEnable(GL20.GL_DEPTH_TEST); 
    Gdx.gl.glDepthMask(true); 
    //Here add your mask shape rendering code i.e. rectangle 
    //triangle, or other polygonal shape mask 
    shapes.begin(ShapeRenderer.ShapeType.Filled); 
    shapes.setColor(1f, 1f, 1f, 0.5f); 
    shapes.triangle(x1,y1,x2,y2,x3,y3); 
    shapes.end(); 
    // Enable writing to the FrameBuffer 
    // and set up the texture to render with the mask 
    // applied 
    Gdx.gl.glColorMask(true, true, true, true); 
    Gdx.gl.glDepthMask(true); 
    Gdx.gl.glDepthFunc(GL20.GL_EQUAL); 
    // Here add your texture rendering code 
    batcher.begin(); 
    renderFrame(runTime); 
    batcher.end(); 
    // Ensure depth test is disabled so that depth 
    // testing is not run on other rendering code. 
    Gdx.gl.glDisable(GL20.GL_DEPTH_TEST); 
} 

このメソッドを呼び出す前に、まずShapeRendererを作成し、投影行列を設定する必要があります。 glDepthFuncのオプションは、マスクをテクスチャに適用される方法を定義

protected void onCreate (Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); 
    config.depth = 15; 
    initialize(new game(), config); 
} 

:あなたはまた、このようなのonCreateメソッドでアンドロイドconfigに深度バッファオプションを設定する必要があります。関数に渡すことができる引数を確認するには、OpenGL wikiを参照してください。

+1

ありがとう。これは私の問題を解決しました! :) – nightrobin

+1

デスクトップ上でも完璧に動作します! – Ajay

関連する問題