试图在设备上绘制纹理三angular形失败,但模拟器工作。 为什么?

我有一系列OpenGL-ES调用,可以正确渲染三angular形,并在仿真器(2.0.1)上使用alpha混合进行纹理处理。 当我在实际的设备上启动相同的代码(Droid 2.0.1)时,我得到的只是白色方块。

这表明我的纹理没有加载,但我不明白为什么他们没有加载。 我的所有贴图都是带有alpha通道的32位PNG,在res / raw下,所以它们没有按照sdk文档进行优化。

以下是我如何加载我的纹理:

private void loadGLTexture(GL10 gl, Context context, int reasource_id, int texture_id) { //Get the texture from the Android resource directory Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), reasource_id, sBitmapOptions); //Generate one texture pointer... gl.glGenTextures(1, textures, texture_id); //...and bind it to our array gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[texture_id]); //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); //Different possible texture parameters, eg GL10.GL_CLAMP_TO_EDGE gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT); //Use the 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(); } 

以下是我如何渲染纹理:

  //Clear gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); //Enable vertex buffer gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); //Push transformation matrix gl.glPushMatrix(); //Transformation matrices gl.glTranslatef(x, y, 0.0f); gl.glScalef(scalefactor, scalefactor, 0.0f); gl.glColor4f(1.0f,1.0f,1.0f,1.0f); //Bind the texture gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[textureid]); //Draw the vertices as triangles gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_BYTE, indexBuffer); //Pop the matrix back to where we left it gl.glPopMatrix(); //Disable the client state before leaving gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 

以下是我启用的选项:

  gl.glShadeModel(GL10.GL_SMOOTH); //Enable Smooth Shading gl.glEnable(GL10.GL_DEPTH_TEST); //Enables Depth Testing gl.glDepthFunc(GL10.GL_LEQUAL); //The Type Of Depth Testing To Do gl.glEnable(GL10.GL_TEXTURE_2D); gl.glEnable(GL10.GL_BLEND); gl.glBlendFunc(GL10.GL_SRC_ALPHA,GL10.GL_ONE_MINUS_SRC_ALPHA); 

编辑:我只是尝试提供一个BitmapOptions的BitmapFactory.decodeResource()调用,但这似乎并没有解决这个问题,尽pipe手动设置相同的首选configuration,密度和targetdensity。

Edit2:按照要求,这里是模拟器工作的屏幕截图。 显示的下方三angular形上贴有圆形纹理,透明度正常,因为您可以看到黑色背景。

删除了死的ImageShack链接

下面是一个关于Droid使用完全相同的代码的镜头:

删除了死的ImageShack链接

编辑3:这里是我的BitmapOptions,更新上面的调用,我现在如何调用BitmapFactory,仍然是如下结果:sBitmapOptions.inPreferredConfig = Bitmap.Config.RGB_565;

 sBitmapOptions.inDensity = 160; sBitmapOptions.inTargetDensity = 160; sBitmapOptions.inScreenDensity = 160; sBitmapOptions.inDither = false; sBitmapOptions.inSampleSize = 1; sBitmapOptions.inScaled = false; 

这是我的顶点,纹理坐标和索引:

  /** The initial vertex definition */ private static final float vertices[] = { -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, -1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f }; /** The initial texture coordinates (u, v) */ private static final float texture[] = { //Mapping coordinates for the vertices 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f }; /** The initial indices definition */ private static final byte indices[] = { //Faces definition 0,1,3, 0,3,2 }; 

一旦它被加载到OpenGL ES中,是否有反转的纹理内容? 也许我可以比较模拟器的加载纹理与实际设备的加载纹理?

我做了一个不同的纹理(默认的Android图标),再次,它为模拟器工作正常,但无法在实际的手机上呈现。

编辑4:尝试切换,当我做纹理加载。 没有运气。 尝试使用0到glGenTextures的常量偏移量,没有改变。

有什么我使用的模拟器支持实际的手机不?

Edit5:下面的每个Ryan,我把我的纹理从200×200调整到256×256,这个问题没有解决。

编辑:按要求,添加到上面的glVertexPointer和glTexCoordPointer调用。 此外,这里是vertexBuffer,textureBuffer和indexBuffer的初始化:

 ByteBuffer byteBuf = ByteBuffer.allocateDirect(vertices.length * 4); byteBuf.order(ByteOrder.nativeOrder()); vertexBuffer = byteBuf.asFloatBuffer(); vertexBuffer.put(vertices); vertexBuffer.position(0); byteBuf = ByteBuffer.allocateDirect(texture.length * 4); byteBuf.order(ByteOrder.nativeOrder()); textureBuffer = byteBuf.asFloatBuffer(); textureBuffer.put(texture); textureBuffer.position(0); indexBuffer = ByteBuffer.allocateDirect(indices.length); indexBuffer.put(indices); indexBuffer.position(0); loadGLTextures(gl, this.context); 

Solutions Collecting From Web of "试图在设备上绘制纹理三angular形失败,但模拟器工作。 为什么?"

我也是Android OpenGL ES开发新手。 我拥有里程碑(Droid欧元版)。

从我目前看到的情况来看,在我的里程碑上从不同的书籍/网站上发布了几个教程应用程序,看起来这款手机的处理方式与目前发布的所有其他Android手机不同。

我认为它与设备上支持的OpenGL扩展有关。

检查这个链接的支持的扩展名列表,我敢肯定,代码大师会发现为什么确切的机器人是在这样一个奇怪的方式处理opengl es。

http://www.rbgrn.net/content/345-hands-on-motorola-droid-opengl-es-specs

希望这个对你有帮助


编辑:

我调整了manifest.xml,并注意到使用时

 <uses-sdk android:minSdkVersion="6"/> 

资源根本不加载。

使用时

 <uses-sdk android:minSdkVersion="3"/> 

资源加载正常。

所以我切换回

 <uses-sdk android:minSdkVersion="6"/> 

并改变了位图加载的方式。

尝试replace:

  //Get the texture from the Android resource directory Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), reasource_id, sBitmapOptions); 

与:

 InputStream is = context.getResources().openRawResource(your.resource.there); Bitmap bitmap = null; try { bitmap = BitmapFactory.decodeStream(is); } finally { //Always clear and close try { is.close(); is = null; } catch (IOException e) { } } 

纹理加载我的里程碑罚款代码,希望这个工作为你的!

当我从SDK 3移到4时,我遇到了这个问题。我的纹理将显示在模拟器上,但不会显示在真实设备上(Motorola Milestone / Droid)。

所有的纹理必须是二进制的幂。 我的是256×256。 然而,纹理不显示的原因是操作系统正在从他们的二进制功率大小缩放到显示在里程碑的高密度屏幕上。

解决方法很简单 – 只需将纹理移动到drawable-nodpi目录,操作系统在加载时不会缩放。

请确保您使用适当的BitmapConfig加载位图,而不是在后台缩放图像,因为发生这种情况。

另外,是否有一个原因,你存储你的PNG在/原始/而不是/绘制/?

Dullahx编辑的答案解决了我在同一个问题上的问题。 非常感谢,这是最近两天的烦人!

我试图在三星Galaxy Tab上映射一个纹理,在仿真器上显示成功,但只有平面显示在设备上。

我replace了我的代码:

 plane.loadBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.jay)); 

与这一个:

 InputStream is = context.getResources().openRawResource(R.drawable.jay); // Load the texture. plane.loadBitmap(BitmapFactory.decodeStream(is)); 

它也在设备上工作!

但是,如果您也尝试在像我这样的全屏大小的矩形上绘制纹理,请注意minSdkVersion。 如果我使用

  <uses-sdk android:minSdkVersion="3"/> 

在三星银河标签上,我的飞机没有全屏显示。 它是根据使用sdk版本3的设备的全屏大小呈现的。我将其更改为

 <uses-sdk android:minSdkVersion="8"/> 

和我的全屏幕矩形回来了它的纹理。

希望这也有帮助。

我不确定你的问题是什么,我是一般的开发新手,但我的OpenGL Android与模拟器和手机之间的区别是:

– 模拟器可以支持非2 ^ x尺寸的位图,手机不能 – 模拟器翻转屏幕NDK的OpenGL所以我不得不使用负坐标来定义模拟器中的视图,而我的G1使用坐标非否定。

希望这能够在一定程度上帮助你。

我认为这可能是你从APK中加载纹理时遇到的问题。 尝试将纹理复制到SD卡,看看你是否可以从那里加载。

你在哪里使用GL11接口? 所有设备不支持GL11。 也删除glColor线,也许你的纹理显示,但颜色过度涂? 这里的一些代码片段如何显示我的纹理网格:

 void draw(GL10 gl) { // Enabled the vertices buffer for writing and to be used during // rendering. gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); // Specifies the location and data format of an array of vertex // coordinates to use when rendering. gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); gl.glEnable(GL10.GL_TEXTURE_2D); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); gl.glBindTexture(GL10.GL_TEXTURE_2D, myTextureId); gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); gl.glDrawArrays(drawMode, 0, verticesCount); gl.glDisable(GL10.GL_TEXTURE_2D); // Disable the vertices buffer. gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); }