gpt4 book ai didi

java - Android - OpenGL - 模拟器与实际设备

转载 作者:太空狗 更新时间:2023-10-29 14:27:28 24 4
gpt4 key购买 nike

我正在编写一个使用 opengles 的游戏。我已经创建了我的渲染器类并在模拟器上运行了我的游戏示例,但是没有任何纹理显示在实际设备上。我已经读到最常见的原因是纹理需要是 2 的一个因子,但是我尝试绘制一个正方形 (128x128),并将相同大小的纹理映射到它,这只显示在模拟器上。此外,我的实际游戏将使用矩形,所以我不确定如何将正方形纹理映射到矩形。到目前为止,这是我的代码(游戏是二维的,所以我使用的是正交模式):编辑:我已经更新了我的代码,它现在可以正确绑定(bind)纹理并使用大小为 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 文件夹中,然后尝试它们在原始文件夹中……还有其他想法吗?

最佳答案

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

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

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

希望对您有所帮助!如果有人有更通用的解决方案,我很乐意听到!

关于java - Android - OpenGL - 模拟器与实际设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10660975/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com