簡體   English   中英

GLES2.0 +幀緩沖區淡入淡出

[英]GLES2.0+ framebuffer fade artifacts

我正在使用GLES 2.0或3.0在android上編寫一個簡單的測試程序。 (如果該解決方案只適用於另一種解決方案,那我將使用它。)

問題:

  • 基本上,褪色時會遇到奇怪的像素偽像。
  • 可以通過提高截止閾值來“隱藏”問題,但是淡入淡出仍然具有斑駁的一致性,對我而言,這是行不通的。

例:

  • 圖片示例(對不起,我還不能直接發布圖片)
  • 降低了幀緩沖區的分辨率,以使工件更加明顯。
  • 在所有經過測試的設備(Nexus 7 2012和2013,Galaxy Tab S 8.4,Galaxy S6 Edge,Galaxy Note 4)上都會發生此問題
  • 在較新的設備上,問題似乎只是粉紅色的均勻小點,在較舊的設備上,如鏈接的圖片所示,似乎確實不完整。
  • 在最終渲染中運行模糊過程也是不可能的,因為這需要省電且對移動設備友好。

布局:

  • 我創建2個幀緩沖區。 (使用GLES20.GL_UNSIGNED_SHORT_5_6_5格式。)
  • 我將第一個設置為渲染目標。
  • 我將四邊形繪制為幀緩沖區的緩沖區大小。
  • 設置四邊形片段着色器以渲染在圓中移動的黑點。
  • 四邊形還可以采用紋理並將其與點混合。
  • 然后,我切換回渲染到屏幕。
  • 我使用先前設置的渲染目標作為紋理渲染另一個四邊形。
  • 然后每幀切換紋理時重復此過程。

渲染代碼:

int i = 0;
@Override public void onDrawView() {
    setRenderTarget(mRenderTexture[i]);
    mTestShader.setTexture0(mRenderTexture[(i + 1) % 2].getTextureHandle());
    mTestShader.draw(mBlitQuad);
    setRenderTarget(null);
    mBlitShader.setTexture0(mRenderTexture[i].getTextureHandle());
    mBlitShader.draw(mBlitQuad);
    i = ++i % 2;
}

着色器代碼:

precision highp float;

uniform float u_GlobalTime;
uniform vec3 u_Resolution;
uniform sampler2D u_Texture0;

varying vec2 v_TexCoord;

void main(void) {
    vec2 uv = v_TexCoord * 2.0 - 1.0;
    uv.x *= u_Resolution.z;
    vec2 pos = vec2(cos(u_GlobalTime), sin(u_GlobalTime)) * 0.5;
    vec4 circle = vec4(1.0 - smoothstep(0.09, 0.11, length(pos - uv)));
    vec4 px = max(texture2D(u_Texture0, v_TexCoord), circle) - 0.025;
    gl_FragColor = step(0.15, px) * px;
}

在這個問題上有幫助嗎?

編輯:
經過對Jerem的抖動研究后,我找到了GLES20.glDisable(GLES20.GL_DITHER)。 這可以幫助解決此問題,並且在更新的設備上可以完美運行。 在較舊的設備上,我仍然在這里遇到偽像。

EDIT2:
經過更多測試后,切換到甚至具有RGB顏色的緩沖區格式似乎已經達到了GLES30.GL_UNSIGNED_SHORT_5_5_5_1的目的。 我的猜測是,這與GPU如何壓縮幀緩沖區有關,因為綠色更加明顯。 (了解為什么它不喜歡5_6_5格式的具體原因仍然很有幫助。)
應用兩種修復程序后的最終結果:i.imgur.com/bQsG9YJ.png。

它是一個多部分解決方案,稱為GLES20.glDisable(GLES20.GL_DITHER),將渲染緩沖區格式設置為GLES30.GL_UNSIGNED_SHORT_5_5_5_1,並且正如Jerem所說,即使對alpha進行了實驗,您也可以得到更好的結果。我的設備選擇似乎沒有作用,可能對其他設備沒有影響。

暫無
暫無

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

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