2012-05-18 58 views
3

我正在寫一個使用opengles的遊戲。我創建了我的渲染器類,並在仿真器上有我的遊戲示例,但是實際設備上沒有顯示任何紋理。我已經閱讀了最常見的原因,因爲紋理需要是2的因素,但是我已經嘗試繪製一個正方形(128x128),並貼上相同大小的紋理,並且只顯示在仿真器上。除此之外,我的實際遊戲將使用矩形,所以我不確定如何將紋理映射到正方形到矩形。 這是我的代碼(遊戲是2D,所以我使用的是正射模式): 編輯:我已經更新了我的代碼,它現在被正確地結合紋理和使用紋理尺寸128×128的,仍然只看到紋理在模擬器上..Android - OpenGL - 模擬器vs實際設備

public void onSurfaceCreated(GL10 gl, EGLConfig config) 
{ 
    byteBuffer = ByteBuffer.allocateDirect(shape.length * 4); 
    byteBuffer.order(ByteOrder.nativeOrder()); 
    vertexBuffer = byteBuffer.asFloatBuffer(); 
    vertexBuffer.put(cardshape); 
    vertexBuffer.position(0); 

    byteBuffer = ByteBuffer.allocateDirect(shape.length * 4); 
    byteBuffer.order(ByteOrder.nativeOrder()); 
    textureBuffer = byteBuffer.asFloatBuffer(); 
    textureBuffer.put(textureshape); 
    textureBuffer.position(0); 

    // Set the background color to black (rgba). 
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); 
    // Enable Smooth Shading, default not really needed. 
    gl.glShadeModel(GL10.GL_SMOOTH); 
    // Depth buffer setup. 
    gl.glClearDepthf(1.0f); 
    // Enables depth testing. 
    gl.glEnable(GL10.GL_DEPTH_TEST); 
    // The type of depth testing to do. 
    gl.glDepthFunc(GL10.GL_LEQUAL); 
    // Really nice perspective calculations. 
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); 

    gl.glEnable(GL10.GL_TEXTURE_2D); 
    loadGLTexture(gl); 
} 

public void onDrawFrame(GL10 gl) { 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
    gl.glDisable(GL10.GL_DEPTH_TEST); 
    gl.glMatrixMode(GL10.GL_PROJECTION); // Select Projection 
    gl.glPushMatrix(); // Push The Matrix 
    gl.glLoadIdentity(); // Reset The Matrix 
    gl.glOrthof(0f, 480f, 0f, 800f, -1f, 1f); 
    gl.glMatrixMode(GL10.GL_MODELVIEW); // Select Modelview Matrix 
    gl.glPushMatrix(); // Push The Matrix 
    gl.glLoadIdentity(); // Reset The Matrix 

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 

    gl.glLoadIdentity(); 
    gl.glTranslatef(card.x, card.y, 0.0f); 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, card.texture[0]); //activates texture to be used now 
    gl.glVertexPointer(2, GL10.GL_FLOAT, 0, vertexBuffer); 
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); 

    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
} 

public void onSurfaceChanged(GL10 gl, int width, int height) { 
    // Sets the current view port to the new size. 
    gl.glViewport(0, 0, width, height); 
    // Select the projection matrix 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    // Reset the projection matrix 
    gl.glLoadIdentity(); 
    // Calculate the aspect ratio of the window 
    GLU.gluPerspective(gl, 45.0f, (float) width/(float) height, 0.1f, 
      100.0f); 
    // Select the modelview matrix 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    // Reset the modelview matrix 
    gl.glLoadIdentity(); 
} 

public int[] texture = new int[1]; 

public void loadGLTexture(GL10 gl) { 
    // loading texture 
    Bitmap bitmap; 
     bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.image); 
     // generate one texture pointer 
     gl.glGenTextures(0, texture, 0); //adds texture id to texture array 
     // ...and bind it to our array 
     gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[0]); //activates texture to be used now 
     // create nearest filtered texture 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 
     // Use Android GLUtils to specify a two-dimensional texture image from our bitmap 
     GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 
     // Clean up 
     bitmap.recycle(); 
} 

有什麼我做錯了?或者我還沒有做的事情?它在模擬器中工作得非常好,所以我只能假設這是2問題的力量,但正如我所說我試圖在廣場上使用128x128紋理,但它沒有顯示..任何幫助將不勝感激..

編輯:我也嘗試設置minsdkversion是3,通過輸入流位圖加載位圖= BitmapFactory.decodeStream(是),將BitmapFactory.Options.inScaled設置爲false,將圖像放入nodpi文件夾,然後嘗試它們在原始文件夾..任何其他想法?

+0

您需要使用'glGenTextures'創建紋理。用glGetError檢查錯誤。你不應該每幀調用'texImage2D'。 –

+0

我已經改變了代碼,現在正確使用glGenTextures ..圖像也都是128x128 ..仍然沒有去.. – crazyfool

+0

'gl.glGenTextures(0,texture,0)'產生0紋理。 –

回答

1

我其實現在正在尋找類似問題的解決方案。不過,我想我可能會爲你臨時解決問題。

問題似乎是在仿真器上正交視圖翻轉。爲了解決這個問題,在我的應用程序中,我們在首選項中添加了一個選項,以便在沒有任何繪製時手動翻轉視圖以下是處理此問題的代碼段:

if (!flipped) 
{ 
    glOrthof(0, screenWidth, screenHeight, 0, -1, 1); //--Device 
} 
else 
{ 
    glOrthof(0, screenWidth, 0, -screenHeight, -1, 1); //--Emulator 
} 

希望這有助於!如果有人有更通用的解決方案,我很樂意聽到!

0

我沒有看你的代碼,但我一直在這條路上。在OpenGL中開發是一個真正的痛苦。如果您沒有義務使用OpenGL,請使用圖形引擎。 Unity是一個偉大的,它是免費的。你的遊戲也可以在Android,iOS或其他平臺上運行。仔細研究你的選擇。祝你好運..

相關問題