Android OpenGL ES - рисовать 3D, а затем 2D - где вина - PullRequest
0 голосов
/ 01 апреля 2012

Я нашел разные Stackoverflow-Questons, но я не вижу, что я делаю неправильно в моем коде, потому что 2D-текстура "_floorhelper" не отображается на экране. Я хотел бы использовать его в качестве элемента HUD:

Попытка использовать орто для рисования 2D

https://stackoverflow.com/questions/9406753/android-opengl-gluortho2d-keep-original-shape-of-an-object

Android - рисовать 3D, а затем 2D с openGL ES

это мои настройки:

public void gameSetup(GameActivity activity, GL10 gl) {             
      _floorhelper = new Mesh( gl, 4, false, true, false );
      _floorhelper.texCoord(1, 1);
      _floorhelper.vertex(-1, 0, 1 );
      _floorhelper.texCoord(1, 0);
      _floorhelper.vertex(1, 0, 1 );
      _floorhelper.texCoord(0, 0);
      _floorhelper.vertex(1, 0, -1 );
      _floorhelper.texCoord(0, 1);
      _floorhelper.vertex(-1, 0, -1);

    try {
        InputStream is = getResources().openRawResource(getResources().getIdentifier("levels", "raw", getPackageName()));
        levelBitmap = BitmapFactory.decodeStream(is);
        levelTexture = new Texture(gl, levelBitmap, TextureFilter.Linear, TextureFilter.Linear, TextureWrap.ClampToEdge, TextureWrap.ClampToEdge);
    }
    catch(Exception ex){
        System.out.print(ex.getMessage());
    }


    setTractFloor(gl);

    float[] lightColor = { 1, 1, 1, 1 };
    float[] ambientLightColor = { 0.0f, 0.0f, 0.0f, 1 };
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, ambientLightColor, 0);
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, lightColor, 0);
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_SPECULAR, lightColor, 0);
}
public void gameLoop(GameActivity activity, GL10 gl) {

    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glViewport(0, 0, activity.getViewportWidth(), activity.getViewportHeight());

    gl.glEnable(GL10.GL_DEPTH_TEST);
    gl.glEnable( GL10.GL_CULL_FACE );   

    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    float aspectRatio = (float) activity.getViewportWidth() / activity.getViewportHeight();
    GLU.gluPerspective(gl, 67, aspectRatio, 1, 100);

    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();

    GLU.gluLookAt(gl, _scaleFactor, 5.0f, _scaleFactor, 0.0f, 0.0f, 0.0f, 0, 1, 0);             

    gl.glEnable(GL10.GL_LIGHTING);
    gl.glEnable(GL10.GL_LIGHT0);
    float[] direction = { 1.5f, 0.5f, 0, 0 };
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, direction, 0);
    gl.glEnable(GL10.GL_COLOR_MATERIAL);

    // rotation
    gl.glRotatef(135, 0, 1, 0);

    gl.glEnable(GL10.GL_LINE_SMOOTH);
    gl.glBlendFunc(GL10.GL_SRC_ALPHA_SATURATE, GL10.GL_ONE);
    gl.glHint(GL10.GL_LINE_SMOOTH_HINT, GL10.GL_NICEST); // no visible diff
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
    gl.glColor4f(1, 1, 1, 1);

    // translation
    gl.glTranslatef(-_oldTouchY, 0, _oldTouchX);

    // render
    currentTractFloor.render(); 

    // Draw 2D ontop of 3D - floorhelper
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glPushMatrix();
    gl.glLoadIdentity();

    GLU.gluOrtho2D(gl, 0.0f, (float) activity.getViewportWidth(), 0.0f, (float)activity.getViewportHeight());

    gl.glMatrixMode(GL10.GL_MODELVIEW);

    gl.glPushMatrix();
    gl.glLoadIdentity();

    gl.glDisable(GL10.GL_DEPTH_TEST);

    gl.glDisable(GL10.GL_COLOR_MATERIAL);
    gl.glEnable(GL10.GL_TEXTURE_2D);
    gl.glEnable(GL10.GL_BLEND);
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);

    levelTexture.bind();
    _floorhelper.render(PrimitiveType.TriangleFan);

    gl.glEnable(GL10.GL_DEPTH_TEST);
    gl.glPopMatrix();
    gl.glMatrixMode(GL10.GL_PROJECTION);        
    gl.glPopMatrix();
}

После ответа Стефана Ханке я нашел решение. Я определил вершины в сетке неправильно. Так что я всегда видел только сторону сетки ...

Спасибо Стефану Ханке.

// * Код решения

public void gameSetup(GameActivity activity, GL10 gl) {
    _floorhelper = new Mesh(gl, 4, false, true, false);
    _floorhelper.texCoord(0, 1);
    _floorhelper.vertex(50, 50, 0);
    _floorhelper.texCoord(1, 1);
    _floorhelper.vertex(1000, 50, 0);
    _floorhelper.texCoord(1, 0);
    _floorhelper.vertex(1000, 1000, 0);
    _floorhelper.texCoord(0, 0);
    _floorhelper.vertex(50, 1000, 0);

    try {
        InputStream is = getResources().openRawResource(getResources().getIdentifier("levels", "raw", getPackageName()));
        levelBitmap = BitmapFactory.decodeStream(is);
        levelTexture = new Texture(gl, levelBitmap, TextureFilter.Linear, TextureFilter.Linear, TextureWrap.ClampToEdge, TextureWrap.ClampToEdge);
    }
    catch(Exception ex){
        System.out.print(ex.getMessage());
    }

    setTractFloor(gl);

    float[] lightColor = { 1, 1, 1, 1 };
    float[] ambientLightColor = { 0.0f, 0.0f, 0.0f, 1 };
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, ambientLightColor, 0);
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, lightColor, 0);
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_SPECULAR, lightColor, 0);
}

public void gameLoop(GameActivity activity, GL10 gl) {

    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glViewport(0, 0, activity.getViewportWidth(), activity.getViewportHeight());
    gl.glClearColor(0.18f, 0.68f, 1.0f, 1.0f);

    gl.glEnable(GL10.GL_DEPTH_TEST);
    gl.glEnable(GL10.GL_CULL_FACE );    

    setPerspective(activity, gl);

    GLU.gluLookAt(gl, getScaleFactor(), 5.0f, getScaleFactor(), 0.0f, 0.0f, 0.0f, 0, 1, 0);     

    gl.glEnable(GL10.GL_LIGHTING);
    gl.glEnable(GL10.GL_LIGHT0);
    float[] direction = { 1.5f, 0.5f, 0, 0 };
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, direction, 0);
    gl.glEnable(GL10.GL_COLOR_MATERIAL);

    // rotation
    gl.glRotatef(135, 0, 1, 0);

    gl.glEnable(GL10.GL_LINE_SMOOTH);
    gl.glBlendFunc(GL10.GL_SRC_ALPHA_SATURATE, GL10.GL_ONE);
    gl.glHint(GL10.GL_LINE_SMOOTH_HINT, GL10.GL_NICEST); // no visible diff
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
    gl.glColor4f(1, 1, 1, 1);


    // translation
    gl.glTranslatef(-_oldTouchY, 0, _oldTouchX);


    // render
    currentTractFloor.render();

    // levels
    setOrtho2D(activity, gl);

    gl.glEnable(GL10.GL_TEXTURE_2D);
    gl.glEnable(GL10.GL_BLEND);
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);

    levelTexture.bind();        
    _floorhelper.render(PrimitiveType.TriangleFan);

    gl.glPopMatrix();
    gl.glMatrixMode(GL10.GL_PROJECTION);        
    gl.glPopMatrix();

}

private void setPerspective(GameActivity activity, GL10 gl) {
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    float aspectRatio = (float) activity.getViewportWidth() / activity.getViewportHeight();
    GLU.gluPerspective(gl, 67, aspectRatio, 1, 100);
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();
}

private void setOrtho2D(GameActivity activity, GL10 gl) {
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glPushMatrix();
    gl.glLoadIdentity();
    // set ortho view
    gl.glOrthof(0.0f,(float) activity.getViewportWidth(), 0.0f, (float)activity.getViewportHeight(), -1.0f, 1.0f);
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glPushMatrix();
    gl.glLoadIdentity();
}

Ответы [ 2 ]

0 голосов
/ 01 апреля 2012

Похоже, что настройка матрицы неверна. Все вершины сетки имеют y=0. Без матрицы ModelView вы будете смотреть на передний край всей сетки. Если вы удалите вторую настройку матрицы из кода - , как вы это сделали в своем комментарии к сообщению Винсента -, ModelView будет смесью предыдущих gl* вызовов.

0 голосов
/ 01 апреля 2012

Возможно, вы не определили нормали вершин вашей сетки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...