2011-12-06 13 views
3

glSurfaceViewのテクスチャのいくつかがグーグルの後に読み込まれていないことがわかりましたので、setDebugFlags(DEBUG_CHECK_ERROR)を設定して以下のエラーログを取得しました。 MenuButton.javaでのライン40は、次のとおりです。一部の携帯電話でglのテクスチャエラーが発生しました

テクスチャが私のテクスチャのポインタである、として宣言
gl.glGenTextures(1, textures, 0); 

:IVEは唯一のドロイドProとカップル他の携帯電話でこの問題を見られるように、

private int[] textures = new int[1]; 

困惑イムgl.glGenTexturesがどのように無効な値を持つのかわかりません。どんな考えが役に立つでしょう。

EDIT:メニューボタンのコードは以下の通りです。

12-06 17:46:31.720: E/AndroidRuntime(2984): android.opengl.GLException: invalid value 
12-06 17:46:31.720: E/AndroidRuntime(2984): at android.opengl.GLErrorWrapper.glGenTextures(GLErrorWrapper.java:350) 
12-06 17:46:31.720: E/AndroidRuntime(2984): at com.huskybuspurchased.MenuButton.<init>(MenuButton.java:40) 
12-06 17:46:31.720: E/AndroidRuntime(2984): at com.huskybuspurchased.CampusMap.onSurfaceCreated(CampusMap.java:112) 
12-06 17:46:31.720: E/AndroidRuntime(2984): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1348) 
12-06 17:46:31.720: E/AndroidRuntime(2984): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1118) 
12-06 17:46:31.728: I/hb(2984): rendering thread paused. 

問題のPIC: enter image description here

package com.huskybus; 

import java.nio.ByteBuffer; 
import java.nio.ByteOrder; 
import java.nio.FloatBuffer; 
import javax.microedition.khronos.opengles.GL10; 
import android.graphics.Bitmap; 
import android.opengl.GLUtils; 
import android.util.Log; 
import android.view.MotionEvent; 

public class MenuButton { 
//Our texture. 
private float texture[] = { 
     //Mapping coordinates for the vertices 
     0.0f, 1.0f, 
     1.0f, 1.0f, 
     0.0f, 0.0f, 
     1.0f, 0.0f, 
}; 
// The order we like to connect them. 
private byte indices[] = {0,1,3,2}; 
// Our vertex buffer. 
private FloatBuffer vertexBuffer; 
// Our index buffer. 
private ByteBuffer indexBuffer; 
//texture buffer. 
private FloatBuffer textureBuffer; 
//Our texture pointer. 
private int[] textures = new int[1]; 
private int width; 
private int height; 
private float rotation; 
public MenuButton(Bitmap graphic,int _rotation,GL10 gl, int _width, int _height) { 
    rotation=_rotation; 
    width=_width; 
    height=_height; 

     //Generate one texture pointer... 
     gl.glGenTextures(1, textures, 0); 
     //...and bind it to our array 
     gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); 
     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.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE); 
     //Use the Android GLUtils to specify a two-dimensional texture image from our bitmap 
     GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, graphic, 0); 
     graphic.recycle(); 

    float vertices[] = { 
      0, -height, 0.0f, //LB 
      width, -height, 0.0f, //RB 
      0, 0, 0.0f, //LT 
      width, 0, 0.0f, //RT 
     }; 

    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);   
} 

/** 
* This function draws our square on screen. 
* @param gl 
*/ 
public void draw(GL10 gl) { 
    //Bind our only previously generated texture in this case 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); 
    //Point to our buffers 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
    //Set the face rotation 
    gl.glFrontFace(GL10.GL_CCW); 
    //Enable the vertex and texture state 
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); 
    gl.glRotatef(rotation, 0, 0, 1); 
    //Draw the vertices as triangles, based on the Index Buffer information 
    gl.glDrawElements(GL10.GL_TRIANGLE_FAN, indices.length, GL10.GL_UNSIGNED_BYTE, indexBuffer); 
    gl.glRotatef(360-rotation, 0, 0, 1); 

    // Disable the vertices buffer. 
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
    //Disable the texture buffer. 
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
    // Disable face culling. 
    gl.glEnable(GL10.GL_CULL_FACE); 
} 
public boolean amIHit(float[] matrixValues,MotionEvent event) { 
    if (((event.getX())>(0)&&((event.getX()))<5+width)&&((event.getY())>0)&&(event.getY()<width)) { 
     Log.e("sys","hit menu button."); 
     return true; 
    } 
    return false;  
} 

}

+0

motodevのサイトからDroid Pro SDKで自分のアプリをテストしたところ、モトローラのエミュレータで完全に正常に動作します – jfisk

+0

テクスチャの寸法は2倍(16,32,64,128など)ですか? それはハードウェアの問題かもしれませんか?テクスチャのビデオメモリが不足している可能性があります(ただし、サイズを小さくしてみましょう(ただし、2の倍数にしてください)。 – Jave

+0

そして、ところで。 "nが負の場合、GL_INVALID_VALUEが生成されます。" http://www.opengl.org/sdk/docs/man/xhtml/glGenTextures.xmlによる – Jave

答えて

0

あなたは必ずしもglGenTexturesを呼び出す必要はありません。あなたはあなたが望む任意の数値をあなたのテクスチャに与えることができます - glGenTexturesはまだ使用されていないテクスチャ番号を取得するための便宜のためのものです。

+0

テクスチャはまだ残念ながらロードされません。 – jfisk

+0

残念ながら、それ以上の情報が必要です。 – StilesCrisis

+0

問題のクラスのコードで質問を更新しました。 – jfisk

2

glSurfaceViewはレンダリングするサーフェスを選択し、さまざまなアンドロイドデバイスが異なるサーフェスをサポートしています。残念ながら、すべてがサポートする共通のサブセットはありません。それは選択するのが難しいです。
デフォルトでは、glSurfaceViewは、16ビット深度バッファに近いサーフェスを見つけようとします。
urのためにイメージを使用する必要があります。テクスチャの目的は、16ビット深度バッファまたは場合によっては24ビットを持ちます。ビット深度の高いイメージは、特定のデバイスで問題を引き起こす可能性があります。

+0

テクスチャが24ビットPNGで問題を抱えていましたが、互換性の可能性を最大限に引き出す最良のフォーマットは何ですか? – jfisk

+0

その後、16ビットの深さで試すことができます。これを見てみましょう。 http://developer.android.com/reference/android/opengl/GLSurfaceView.html – Aakash

関連する問題