2011-11-28 5 views
2

私は最近、奇妙な問題(または少なくとも私はそうだと思う)に遭遇しました。私はAndroid用の小さなopengl esアプリケーションで作成しました。しかし、電話では、エミュレータが私に見せたものをレンダリングしません! 私は2つのデバイスでアプリをテストしました:Samsung AceとSony Xperia x10が同じ結果を出しました! 私はちょうどあなたには、いくつかのアイデアを持っている場合はそう... いくつかのコードを私に指摘してください(私はAndroid上でOpenGLとあまりにも多くの経験を持っていない)問題が何であるかを知らない:レンダラを実装しAndroid OpenGLは私のディスプレイをエミュレータのようにレンダリングしません

クラス

public class GLOrbitor implements Renderer{ 
OrbitorLayer layer; 
TexFont text; //this is used to render 1-9 and A-Z 
TexFont text1; //this one to render a-z 
int x; 
int y; 
private int atomNumber; 
private int width; 
private int height; 
private Context context; 

private final static float consty = 0.15f; 

GLOrbitor(Context context){ 
    setContext(context); 
} 
@Override 
public void onDrawFrame(GL10 gl) { 
    // TODO Auto-generated method stub 
    gl.glDisable(GL10.GL_DITHER); 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glLoadIdentity(); 
    GLU.gluLookAt(gl, 0, 0, 5, 0f, 0f, 0f, 0f, 1.0f, 0.0f); 
    gl.glPushMatrix(); 
     gl.glEnable(GL10.GL_TEXTURE_2D); 
     gl.glEnable(GL10.GL_BLEND); // We know this is a 32bit font so set blending to suit 
     gl.glBlendFunc(GL10.GL_SRC_ALPHA,GL10.GL_ONE_MINUS_SRC_ALPHA); 
     drawNumAndLetters(gl); 

     gl.glDisable(GL10.GL_BLEND); 
     gl.glDisable(GL10.GL_TEXTURE_2D); 
    gl.glPopMatrix(); 

    gl.glPushMatrix(); 
     //gl.glTranslatef(-0.8f, 0.8f, 0f); 
     layer.draw(gl,getAtomNumber()); 
    gl.glPopMatrix(); 


    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
} 

@Override 
public void onSurfaceChanged(GL10 gl, int width, int height) { 
    // TODO Auto-generated method stub 
    gl.glViewport(0,0, width, height); 
    this.width = width; 
    this.height = height; 
    float ratio = (float)width/height; 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    gl.glFrustumf(-ratio, ratio, 1, 1, 3, 7); 

} 

@Override 
public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
    layer = new OrbitorLayer(); 
    text = new TexFont(getContext(),gl); 
    text1 = new TexFont(getContext(),gl); 
    try { 
     text.LoadFont("ubunturegular.bff", gl); // 0-9 and A-Z 
     text1.LoadFont("ubunturegular1.bff", gl); //a-z 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    // TODO Auto-generated method stub 
    gl.glDisable(GL10.GL_DITHER); 
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_NICEST); 
    gl.glClearColor(0.0f,0.0f,0.0f, 1f); 
    gl.glEnable(GL10.GL_DEPTH_TEST | GL10.GL_SMOOTH); 
    gl.glShadeModel(GL10.GL_SMOOTH); 
    gl.glFrontFace(GL10.GL_CCW); 
    //gl.glEnable(GL10.GL_CULL_FACE); 
    //gl.glCullFace(GL10.GL_BACK); 
} 

} `

//このコードは小さな矩形

public GLRectangle(){ 
    setFilled(false); 
    ByteBuffer vbb = ByteBuffer.allocateDirect(12 * 4); 
    vbb.order(ByteOrder.nativeOrder()); 
    mFVertexBuffer = vbb.asFloatBuffer(); 
    ByteBuffer ibb = ByteBuffer.allocateDirect(6 * 2); 
    ibb.order(ByteOrder.nativeOrder()); 
    mIndexBuffer = ibb.asShortBuffer(); 
    float[] coords = { 
      -poz, -poz, 0, 
      poz, -poz, 0, 
      poz, poz, 0, 
      -poz,poz,0 
    }; 

    mFVertexBuffer.put(coords); 
    short[] myIndecesArray = {0,1,2,0,2,3}; 

    mIndexBuffer.put(myIndecesArray); 
    mFVertexBuffer.position(0); 
    mIndexBuffer.position(0); 
} 

public void draw(GL10 gl) 
{ 
    if(isFilled()) 
     gl.glColor4f(1f, 0f, 0f, 1f); 
    else gl.glColor4f(1f, 1f, 1f, 1f); 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mFVertexBuffer); 
    gl.glDrawElements(GL10.GL_TRIANGLES, 6,GL10.GL_UNSIGNED_SHORT, mIndexBuffer); 
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
} 

//を描き、これはrectanglのアレイを描きますES

public class OrbitorLayer { 
GLRectangle[] rectangle; 
GLMargin margin; 
private final static float consty = 0.15f; 
OrbitorLayer(){ 
    margin = new GLMargin(); 
    rectangle = new GLRectangle[118]; 
} 

public void draw(GL10 gl,int atomNumber){ 
    for(int i = 0;i<118;i++){ 
     rectangle[i] = new GLRectangle(); 
     if((i>=0) && (i<atomNumber)) 
      rectangle[i].setFilled(true); 
    } 
    //there's some exception for chromium with z = 24 and copper with z=29 
    //they have 4s1 and 3d5 also 4s1 and 3d10 
    if(atomNumber == 24){ 
     //4s2 is at 19 and 24 
     rectangle[19].setFilled(false); 
     rectangle[24].setFilled(true); 
    } 
    else if(atomNumber == 29){ 
     //3d10 is at 29 
     rectangle[19].setFilled(false); 
     rectangle[29].setFilled(true); 
    } 
    gl.glPushMatrix(); 
     margin.draw(gl); 
    gl.glPopMatrix(); 
    int index = -1; 
    float startx = -0.9f; 
    float starty = 0.8f; 
    //start with 1s layer 
    for(int i=0;i<2;i++){ 
     index++; 
     //rectangle[index] = new GLRectangle(); 
     //translate and draw 
     gl.glPushMatrix(); 
     gl.glTranslatef((float) (startx + (i * 0.05)), starty, 0.0f); 
     rectangle[index].draw(gl); 
     gl.glPopMatrix(); 
    } 
    //2 s layer 
    startx = -0.9f; 
    starty = (float)(0.8f - (1 * consty)); 
    for(int i=0;i<2;i++){ 
     index++; 
     //rectangle[index] = new GLRectangle(); 
     //translate and draw 
     gl.glPushMatrix(); 
     gl.glTranslatef((float) (startx + (i * 0.05)), starty, 0.0f); 
     rectangle[index].draw(gl); 
     gl.glPopMatrix(); 
    } 
    //2 p layer 
    startx = 0.7f; 
    starty = (float)(0.8f - (1 * consty)); 
    for(int i=0;i<6;i++){ 
     index++; 
     //rectangle[index] = new GLRectangle(); 
     //translate and draw 
     gl.glPushMatrix(); 
     gl.glTranslatef((float) (startx + (i * 0.05)), starty, 0.0f); 
     rectangle[index].draw(gl); 
     gl.glPopMatrix(); 
    } 

}

、それはそれらの充填矩形及び青色丸みを帯びた形状は、これらを用いて描かれている唯一の文字と番号の表示されていない本当のアンドロイドスマートフォンのエミュレータenter image description here にレンダリングだ方法のスクリーンショットコード http://www.codehead.co.uk/cbfg/TexFont.java

お気軽にお気軽にお問い合わせください。


更新:

Craigyとマシュー

Craigyありがとう:本物の携帯電話に私は、これらの赤と白の小さな四角形を表示することはできません。他のすべてはexepectedとして働いています。ちょうど青い矩形を塗りつぶすゾーンだけがGLSurfaceViewです。他にはopenglとのリンクがありません!実際のデバイスからスクリーンショットを提供できない場合は申し訳ありません。私のアプリは2でテストされましたデバイスの友だち。

Matthew:私がテクスチャを使用している唯一のものは、1,2,3,4,5,6,7とs、f、d、pです.A面白いのは、私の質問は、テクスチャを描画することが描画とその長方形を変換することになぜ影響するのですか。何とか私はあなたが私に示唆した情報をもう少し再生し、今私はあなたをさせてくれるでしょう!

これらの問題について新しいインテルがあるなら...私はあなたに頼んでください...ナットはちょうどいくつかの四角形を表示し、いくつかのテキストは私に多くの問題を与えてくれます!

+0

あなたのデバイスでどのように見えるのスクリーンショットを投稿できますか? – Craigy

答えて

0

テクスチャ座標を指定していません。

デフォルトでは、エミュレータのOpenGL実装ではテクスチャが正しく行われません。デフォルトでは、テクスチャ座標に関係なくイメージを拡大する「高速」モードを使用します。したがって、あなたのイメージは「正しくない」エミュレータに表示されますが、「正しい」デバイスでは動作しません。

私は、OpenGL開発用エミュレータについて忘れてしまいます。

心に留めておくべきいくつかのより多くの事:

  • エミュレータは、非電源または、2つのテクスチャで動作します。デバイスは表示されません。

  • Androidはデバイスの密度に合わせて画像を拡大し、結果として2の累乗テクスチャが2の累乗ではなくなる可能性があります。これを防ぐには、BitmapFactory.Options.inScaledをfalseに設定してください。

関連する問題