我試圖在屏幕上繪製5種不同的紋理,但我似乎無法使alpha工作。如果沒有alpha,紋理渲染得很好,但是當存在時,會有一個非常奇怪的「效果」。如何在Android OpenGL中正確繪製具有不透明度的紋理?
好吧,首先,我打電話draw
我的紋理所有5不透明性(在給定的順序):0.5
,1.0
,0.5
,1.0
,0.5
。但是當我啓動應用程序時,我實際上獲得了1.0
,0.5
,1.0
,0.5
,1.0
,就像存在1的偏移量。這並不奇怪。大約半秒鐘後,我的應用程序啓動的第一個紋理獲取不透明度爲0.5
,甚至更奇怪的是,這是不是發生在第二個draw
方法,但第一次和第二次調用draw
之間的某處。這怎麼可能?
這是最後的結果(這應該是0.5
,1.0
,0.5
,1.0
,0.5
,但你可以看到它甚至還沒有接近):
現在對於一些代碼(我我跳過了一些不相關的部分)。
創建表面:
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