2014-04-09 82 views
0

我試圖在屏幕上繪製5種不同的紋理,但我似乎無法使alpha工作。如果沒有alpha,紋理渲染得很好,但是當存在時,會有一個非常奇怪的「效果」。如何在Android OpenGL中正確繪製具有不透明度的紋理?

好吧,首先,我打電話draw我的紋理所有5不透明性(在給定的順序):0.51.00.51.00.5。但是當我啓動應用程序時,我實際上獲得了1.0,0.5,1.0,0.5,1.0,就像存在1的偏移量。這並不奇怪。大約半秒鐘後,我的應用程序啓動的第一個紋理獲取不透明度爲0.5,甚至更奇怪的是,這是不是發生在第二個draw方法,但第一次和第二次調用draw之間的某處。這怎麼可能?

這是最後的結果(這應該是0.51.00.51.00.5,但你可以看到它甚至還沒有接近):

enter image description here

現在對於一些代碼(我我跳過了一些不相關的部分)。

創建表面:

public void onSurfaceCreated(GL10 gl, EGLConfig config) 
{ 
    // Textures are being loaded in here, which is just fine (code skipped) 
    gl.glEnable(GL10.GL_TEXTURE_2D); 
    gl.glShadeModel(GL10.GL_SMOOTH); 
    gl.glClearColor(1.0f, 0.0f, 0.0f, 1.0f); 
    gl.glClearDepthf(1.0f); 
    gl.glEnable(GL10.GL_DEPTH_TEST); 
    gl.glDepthFunc(GL10.GL_LEQUAL); 
    gl.glEnable(GL10.GL_BLEND); 
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); 
} 

更新表面:

public void onSurfaceChanged(GL10 gl, int width, int height) 
{ 
    // Here I pass width & height to my texture objects for future reference (code skipped) 
    gl.glViewport(0, 0, width, height); 
    gl.glOrthof(0, width, height, 0, 0, 1); 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glLoadIdentity(); 
} 

繪圖:紋理對象的

public void onDrawFrame(GL10 gl) 
{ 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
    gl.glLoadIdentity(); 
    // Here I call draw of each texture object 
} 

繪製方法:

public void draw(GL10 gl) 
{ 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
    gl.glFrontFace(GL10.GL_CW); 
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length/3); 
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
    gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_MODULATE); 
    gl.glColor4f(1.0f, 1.0f, 1.0f, this.alpha); // This is where the magic doesn't happen (: 
} 

我已經跳過了創建頂點/紋理緩衝區和加載紋理的部分,該部分跟在這個tutorial之後,似乎工作得很好。

所以..你覺得我錯過了什麼?這個奇怪的問題可能是什麼原因?

如果我必須猜到,我會說這是一些奇怪的核心OpenGL問題/錯誤或更像一個我忘記舉起的標誌或類似的東西。它不可能是繪圖的順序或類似的東西,我已經加倍檢查了一切。我也嘗試將0.5f設置爲對每個紋理都是不透明的,並且它完美地工作,只有當紋理的不透明度彼此不同時纔會發生問題。我也不認爲,用戶代碼可能會導致奇怪的畫中畫閃爍,但它必須是一些OpenGL怪異。

我必須指出,我使用的是第三方庫這一切GL魔法包成一個動態壁紙,它是這真棒LIB:GLWallpaperService

回答

1

爲什麼當奇蹟發生不抽籤之前的地方呼叫?默認的顏色值是(1,1,1,1),所以首先在1.0開始alpha,然後繪製紋理並將alpha設置爲.5並繪製第二個紋理,該值仍然設置... Ergo奇怪的抵消效應。

繪製最後一個紋理時,您的alpha值爲1.0(來自前一個),然後將其設置爲。5用於在下一次刷新中繪製第一個紋理:由於alpha在最上面的元素上從1.0變爲.5,所以它會閃爍。最後你清楚地看到你發佈的圖片上看到的結果。

所以這確實是神奇在哪裏發生了:

gl.glColor4f(1.0f, 1.0f, 1.0f, this.alpha); // This is where the magic doesn't happen 

所以嘗試刪除該行並嘗試這樣的:

gl.glColor4f(1.0f, 1.0f, 1.0f, this.alpha); // This is where the magic does happen 
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length/3); 
gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // Low mana, stop the magic