3

我正在编写一个使用 opengles 的游戏。我已经创建了我的渲染器类,并在模拟器上运行了我的游戏示例,但是没有一个纹理显示在实际设备上。我已经阅读了最常见的原因,即纹理需要为 2 倍,但是我尝试绘制一个正方形 (128x128),并在其上映射了相同大小的纹理,这仅在模拟器上显示。除此之外,我的实际游戏将使用矩形,所以我不确定如何将正方形的纹理映射到矩形。这是我目前的代码(游戏是 2d,所以我使用的是正交模式):编辑:我已经更新了我的代码,它现在可以正确绑定纹理并使用大小为 128x128 的纹理,但仍然只能在模拟器上看到纹理。

    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,通过输入流 bitmap = BitmapFactory.decodeStream(is) 加载位图,将 BitmapFactory.Options.inScaled 设置为 false,将图像放在 nodpi 文件夹中,然后在原始文件夹..还有其他想法吗?

4

2 回答 2

1

我实际上正在寻找类似问题的解决方案。不过,我想我可能会为您提供一个临时解决方案。

问题似乎是在模拟器上正交视图被翻转。为了解决这个问题,在我的应用程序中,我们在首选项中添加了一个选项,如果没有绘制,则可以手动翻转视图。这是处理此问题的代码段:

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

希望这可以帮助!如果有人有更通用的解决方案,我很高兴听到它!

于 2012-06-20T04:08:16.900 回答
0

我没有看你的代码,但我以前一直在这条路上。在 OpenGL 中开发是一件非常痛苦的事情。如果您没有义务使用 OpenGL,请使用图形引擎。Unity很棒,而且它是免费的。您的游戏也可以在 Android、iOS 或其他平台上运行。仔细研究你的选择。祝你好运..

于 2012-05-19T00:34:43.520 回答