簡體   English   中英

不要在 Java Android Opengl es 2.0 中使用模板

[英]Do not work stencil in Java Android Opengl es 2.0

在android opengl es 2.0中,我正在通過標准渲染器(實現GLSurfaceView.Renderer)繪制場景

@Override
public void onDrawFrame(GL10 gl10)
{
        GLES20.glEnable(GLES20.GL_STENCIL_TEST);
        GLES20.glClearStencil(1);
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_STENCIL_BUFFER_BIT);
        GLES20.glEnable(GLES20.GL_DEPTH_TEST);


        glStencilMask(0x00);

        shaderTexture2.useProgram();

        GLES20.glStencilOp(GLES20.GL_KEEP, GLES20.GL_KEEP, GLES20.GL_REPLACE);
        GLES20. glStencilFunc(GLES20.GL_ALWAYS, 1, 0xFF);
        GLES20.glStencilMask(0xFF);

        //1 step. draw red triangle
        shaderTexture2.draw(buf_slim, mvp, mLightPosInEyeSpace, tex1);


        GLES20.glStencilFunc(GLES20.GL_NOTEQUAL, 1, 0xFF);
        GLES20.glStencilMask(0x00);

        //2 step. draw blue triangle
        shaderTexture2.draw(buf_big, mvp, mLightPosInEyeSpace, tex1);

        GLES20.glStencilMask(0xFF);

}

如果在方法的第一行關閉模板(例如評論GLES20.glEnable(GLES20.GL_STENCIL_TEST); )然后兩個三角形都繪制(第一張圖片)。如果模板打開,那么我希望在第 1 步繪制紅色三角形模板緩沖區將被填充,並且在第 2 步中,藍色三角形將僅在第一步(第二張圖片)中的區域中被切割。 相反,當模板打開時,只需繪制完整的紅色三角形,而沒有任何藍色三角形(第三張圖片)。 我應該在何時以及使用哪些模板的 funcs 和掩碼來按照我的預期進行繪制?

圖片1

圖片2

圖3

考慮特定語句的執行順序...

以下代碼將模板緩沖區中的每個像素設置為 1。

GLES20.glClearStencil(1);
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_STENCIL_BUFFER_BIT);

接下來渲染紅色三角形。 但是模板函數被設置為任何時候模板和深度測試通過值 1 都將被寫入模板緩沖區。 這不會改變任何東西,因為模板緩沖區已經填充了 1。

GLES20.glStencilOp(GLES20.GL_KEEP, GLES20.GL_KEEP, GLES20.GL_REPLACE);
GLES20.glStencilFunc(GLES20.GL_ALWAYS, 1, 0xFF);
GLES20.glStencilMask(0xFF);

// 1 step. draw red triangle
shaderTexture2.draw(buf_slim, mvp, mLightPosInEyeSpace, tex1);

此時,模板緩沖區仍填充值 1。

現在模板函數設置為在當前值不等於 1 時通過。因此模板測試將始終失敗並且藍色三角形的片段將不可見。

GLES20.glStencilFunc(GLES20.GL_NOTEQUAL, 1, 0xFF);
GLES20.glStencilMask(0x00);

// 2 step. draw blue triangle
shaderTexture2.draw(buf_big, mvp, mLightPosInEyeSpace, tex1);

下面的代碼(未經測試)改變了一些東西,使得 0 被用作模板清除值。 值 1 被寫入被紅色三角形覆蓋的那些模板像素。 最后,藍色三角形僅渲染到對應模板像素等於 1 的那些像素。

@Override
public void onDrawFrame (GL10 gl10)
{
    GLES20.glEnable(GLES20.GL_STENCIL_TEST);
    GLES20.glClearStencil(0);
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_STENCIL_BUFFER_BIT);
    GLES20.glEnable(GLES20.GL_DEPTH_TEST);

    glStencilMask(0x00);

    shaderTexture2.useProgram();

    GLES20.glStencilOp(GLES20.GL_KEEP, GLES20.GL_KEEP, GLES20.GL_REPLACE);
    GLES20.glStencilFunc(GLES20.GL_ALWAYS, 1, 0xFF);
    GLES20.glStencilMask(0xFF);

    // 1 step. draw red triangle
    shaderTexture2.draw(buf_slim, mvp, mLightPosInEyeSpace, tex1);

    GLES20.glStencilFunc(GLES20.GL_EQUAL, 1, 0xFF);
    GLES20.glStencilMask(0x00);

    // 2 step. draw blue triangle
    shaderTexture2.draw(buf_big, mvp, mLightPosInEyeSpace, tex1);

    GLES20.glStencilMask(0xFF);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM