Android Opengl не отображает мой дисплей как эмулятор - PullRequest
2 голосов
/ 29 ноября 2011

Недавно я наткнулся на странную проблему (или, по крайней мере, мне так кажется). Я сделал это в небольшом приложении opengl es для Android. Проблема в том, что на эмуляторе он работает нормально, а на телефоне - просто нетсделать то, что эмулятор показал мне!Я протестировал приложение на 2 устройствах: Samsung Ace и Sony Xperia x10 с одинаковым результатом!Я просто не знаю, в чем проблема (у меня нет большого опыта работы с OpenGL на Android), поэтому, если у вас есть идеи ... укажите мне Код:

Класс, который реализует Renderer

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

// а этот рисует массив прямоугольников

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 На реальном смартфоне с Android эти заполненные прямоугольники и синяя округлая форма не видны только буквы и цифры, которые нарисованы этим кодом http://www.codehead.co.uk/cbfg/TexFont.java

Если у вас есть идеи, пожалуйста, не стесняйтесь!


Обновление:

Спасибо, Крейги и Мэтью

Крэйги: На реальном телефоне я не вижу этих красных и белых прямоугольников.Все остальное работает как положено. Кстати: только зона, которая заполняет синий прямоугольник, является GLSurfaceView, все остальное не имеет связи с opengl! Извините, если я не могу предоставить скриншот с реального устройства. Мое приложение было протестировано 2друзей на их устройствах.

Мэтью: единственное, где я использую текстуру, это отображение: 1,2,3,4,5,6,7 и s, f, d, p. И что забавно, так это то, чтоони хорошо отображаются на реальном устройстве. Мой вопрос заключается в том, почему рисование текстур влияет на рисование и перевод этих прямоугольников. В любом случае, я немного поиграюсь с информацией, которую вы мне предложили, и я дам вам, ребята, сейчас!

Еслиу вас есть какая-то новая информация об этой проблеме ... прошу вас, умоляю ... это сводит меня с ума, просто отображает несколько прямоугольников, а некоторый текст доставляет мне столько проблем !!

1 Ответ

0 голосов
/ 01 декабря 2011

Вы не указываете координаты текстуры.

По умолчанию реализация opengl в эмуляторе неправильно выполняет текстурирование. По умолчанию он использует «быстрый» режим, при котором изображение стирается без учета координат текстуры. Таким образом, ваши изображения отображаются в «неправильном» эмуляторе, но не работают на «правильном» устройстве.

Я бы посоветовал забыть об эмуляторе для разработки opengl.

Еще несколько вещей, которые нужно иметь в виду:

  • Эмулятор будет работать с текстурами не-power-or-two; устройство не будет.

  • Android будет масштабировать изображения в соответствии с плотностью устройства, что может привести к тому, что ваша текстура со степенью двух окажется не степенью двойки. Не забудьте установить BitmapFactory.Options.inScaled в false, чтобы предотвратить это.

...