2012-05-18 52 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或其他平台上运行。仔细研究你的选择。祝你好运..

相关问题