2012-04-01 2 views
0

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

Trying to use Ortho for drawing 2D

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

Android - Draw 3D then 2D with 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(); 
} 

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

Благодаря Stefan Hanke.

// * Решение Код

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(); 
} 
+0

Пожалуйста, объясните, что случилось. – Vincent

+0

Спасибо за ваш отзыв Vincent. Текстура 2D «_floorhelper» не отображается на экране. –

+0

Это не текстура, это сетка. Что появляется вместо этого? Черный ли он или нет? – Vincent

ответ

0

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

+0

Спасибо за помощь. Вершины сеток были определены. Я добавил решение к исходному вопросу. –

0

Это может быть, что вы не определили нормалей вершин вашей сетки.

+0

Если я удалю следующие строки кода, он появится как обычный трехмерный объект. Итак, в этом представлении нормали в порядке. Но я не знаю, что они разные в Орто? gl.glMatrixMode (GL10.GL_PROJECTION); gl.glPushMatrix(); gl.glLoadIdentity(); GLU.gluOrtho2D (gl, 0.0f, (float) activity.getViewWidth(), 0.0f, (float) activity.getViewportHeight()); gl.glMatrixMode (GL10.GL_MODELVIEW); gl.glPushMatrix(); gl.glLoadIdentity(); –

+0

Я попытался добавить нормали, но все же он не появляется. Я думаю, это может быть вариант, который я включил не специально, но я не знаю, какой из них мог бы быть. –

+0

Спасибо за помощь. Но я определил отверстие в сетке неправильно. –

Смежные вопросы