2011-05-20 51 views
1

我正在使用OpenGL編寫2D遊戲,使用存儲在我的資源中的png圖像(64x64像素,具有透明度)。glDrawTexfOES在手機上繪製黑色紋理,並在模擬器中正確

我的代碼如下所示:

import javax.microedition.khronos.egl.EGLConfig; 
import javax.microedition.khronos.opengles.GL10; 
import javax.microedition.khronos.opengles.GL11; 
import javax.microedition.khronos.opengles.GL11Ext; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.opengl.GLUtils; 
import android.opengl.GLSurfaceView.Renderer; 

public class TestGLRenderer implements Renderer { 

    private int mTexGLNames[]; 
    private Context mContext; 

    public TestGLRenderer(Context ctx) { 
     mContext = ctx; 
    } 

    public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
     // setup the gl renderer 
     gl.glClearColor(0.2f, 0.4f, 0.6f, 1.0f); 
     gl.glEnable(GL10.GL_TEXTURE_2D); 
     gl.glShadeModel(GL10.GL_FLAT); 
     gl.glEnable(GL10.GL_BLEND); 
     gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA); 

     // reserve GL texture names 
     mTexGLNames = new int[1]; 
     gl.glGenTextures(1, mTexGLNames, 0); 

     // load image from resources 
     Bitmap b; 
     b = BitmapFactory.decodeResource(mContext.getResources(), 
       R.drawable.image); 

     // load image in opengl 
     gl.glBindTexture(GL10.GL_TEXTURE_2D, mTexGLNames[0]); 
     GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, b, 0); 
    } 

    public void onDrawFrame(GL10 gl) { 
     gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 

     gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 
     gl.glBindTexture(GL10.GL_TEXTURE_2D, mTexGLNames[0]); 
     int crop[] = new int[] { 0, 64, 64, -64 }; 

     ((GL11) gl).glTexParameteriv(GL10.GL_TEXTURE_2D, 
       GL11Ext.GL_TEXTURE_CROP_RECT_OES, crop, 0); 
     ((GL11Ext) gl).glDrawTexfOES(160, 240, 0, 64, 64); 
    } 

    public void onSurfaceChanged(GL10 gl, int w, int h) { 
    } 

} 

正按預期在模擬器的結果(運行Android 2.2),但圖像顯示爲我的電話上的黑色方塊(LG-P500的Android 2.2 )。隨附的是模擬器和手機的屏幕截圖。

我的代碼有問題嗎,還是我的手機有問題(我的手機可以運行其他3D遊戲沒有問題)?

Screenshot from the emulatorScreenshot from my phone

回答

1

我不知道是不是一樣的道理比你,但嘗試。

我之前加載紋理(和像你一樣的問題):

gl.glBindTexture(GL10.GL_TEXTURE_2D, textureIDs[i]); 
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmaps[i], 0); 

那工作正常,在模擬器,但你可以設置多個參數紋理如何將其計算。我的猜測是,手機不能默認設置這些,這就是爲什麼它不起作用(但只是猜測)。所以解決方案:

gl.glBindTexture(GL10.GL_TEXTURE_2D, textureIDs[i]); //Same 

gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); 
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 

gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT); 
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT); 

GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmaps[i], 0); //Same 

就是這樣。如果您不知道,可以從這些參數(GL_LINEAR和GL_REPEAT)中搜索更多信息。

我希望這將有助於=)

+0

事實上,我認爲這些設置有默認值(它在最我用的框架)。在闡明它們之後,它現在可以工作。 – XGouchet 2011-05-24 07:58:50

相關問題