2016-07-26 123 views
0

我有一個問題關於使用模板緩存與OpenGL和libgdxLibgdx模板緩衝區重疊

作爲例子,我需要藉助社交圈,與重疊。

渲染方法的代碼是在這裏:

Gdx.gl.glClearColor(1f, 1f, 1f, 1f); 
    Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_STENCIL_BUFFER_BIT); 
    shapeRenderer.begin(ShapeRenderer.ShapeType.Filled); 

    Gdx.gl.glEnable(GL20.GL_STENCIL_TEST); 
    Gdx.gl.glClearStencil(0); 
    Gdx.gl.glClear(GL20.GL_STENCIL_BUFFER_BIT); 
    Gdx.gl.glStencilFunc(GL20.GL_ALWAYS, 1, 0); 
    Gdx.gl.glStencilOp(GL20.GL_KEEP, GL20.GL_INCR, GL20.GL_INCR); 

    shapeRenderer.setColor(new Color(1f, 0f, 0f, 1f)); // red 
    shapeRenderer.circle(200, 200, 100); 
    shapeRenderer.circle(180, 180, 100); 

    Gdx.gl.glStencilFunc(GL20.GL_EQUAL, 2, 0xFF); 
    Gdx.gl.glStencilOp(GL20.GL_REPLACE, GL20.GL_REPLACE, GL20.GL_REPLACE); 
    shapeRenderer.setColor(new Color(0f, 1f, 0f, 1f)); // green 
    shapeRenderer.circle(200, 200, 100); 
    shapeRenderer.circle(180, 180, 100); 

    Gdx.gl.glDisable(GL20.GL_STENCIL_TEST); 
    shapeRenderer.end(); 

結果是:

result

預計這樣的事情:

expected

重疊應該用其他顏色。 這裏有什麼問題?

+0

對於所有參數,用'GL_KEEP'替換'Gdx.gl.glStencilOp(GL20.GL_REPLACE,GL20.GL_REPLACE,GL20.GL_REPLACE);'是否會改變某些參數? – pleluron

+0

謝謝。我試過了,但沒有改變。 –

回答

0

邏輯看起來沒問題,所以我懷疑問題在於你正在渲染的framebuffer實際上沒有模板附件。如果沒有模板緩衝區,OpenGL ES的行爲就像禁用模板測試一樣,所以最後的兩個圓圈總是會透過前兩個圓圈。

檢查您的上下文創建(對於窗口表面)或FBO創建的離屏渲染目標。

+0

謝謝,會檢查它。 –