Android - OpenGL - 模拟器vs实际设备
我正在写一个使用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文件夹,然后尝试它们在原始文件夹..任何其他想法?
我其实现在正在寻找类似问题的解决方案。不过,我想我可能会为你临时解决问题。
问题似乎是在仿真器上正交视图翻转。为了解决这个问题,在我的应用程序中,我们在首选项中添加了一个选项,以便在没有任何绘制时手动翻转视图以下是处理此问题的代码段:
if (!flipped)
{
glOrthof(0, screenWidth, screenHeight, 0, -1, 1); //--Device
}
else
{
glOrthof(0, screenWidth, 0, -screenHeight, -1, 1); //--Emulator
}
希望这有助于!如果有人有更通用的解决方案,我很乐意听到!
我没有看你的代码,但我一直在这条路上。在OpenGL中开发是一个真正的痛苦。如果您没有义务使用OpenGL,请使用图形引擎。 Unity是一个伟大的,它是免费的。你的游戏也可以在Android,iOS或其他平台上运行。仔细研究你的选择。祝你好运..
您需要使用'glGenTextures'创建纹理。用glGetError检查错误。你不应该每帧调用'texImage2D'。 –
我已经改变了代码,现在正确使用glGenTextures ..图像也都是128x128 ..仍然没有去.. – crazyfool
'gl.glGenTextures(0,texture,0)'产生0纹理。 –