2013-06-06 4 views
1

Je développe un widget gallary photo sur Android qui devrait mettre en œuvre certaines fonctionnalités comme un retournement entre les photos et l'effet de boucle qui impressionnent cette feuille de photo se recourbe sur le toucher et montre sous-couche avec quelques commentaires pour photo . J'ai implémenté cela avec ViewPager et FragmentStatePagerAdapter qui créent une instance de Fragment qui contient GLSurfaceView avec renderer qui produit un effet curl avec opengl-es 2.0.GLSurfaceView rend image déformée sur Asus Transformer

J'ai testé cette solution sur Kindle Fire HD 7` et de nombreux types de périphériques Sumsung d'Ace (2.3.3) à Galaxy Tab 10 '- fonctionne très bien. Mais sur Asus Transformer tf700t j'ai horrible image déformée.

Kindle Fire HD Screenshoot

Distorted image on Asus Transformer

Est-ce que le visage de tout le monde avec le même problème? Y a-t-il une particularité dans le contexte d'initialisation de GLES2.0 pour Tegra 3 GPU contrairement à mali400 ou PowerVR?

Code constructeur Mon GLSurfaceView:

/// Конструктор для создания поверхности в runtime с уже загруженой текстурой 
public MainGLSurfaceView(Context context, Bitmap bm) { 
    super(context); 

    // Create an OpenGL ES 2.0 context. 
    setEGLContextClientVersion(2); 

    /// следующие три строчки - для того чтобы из под поверхности было видно другие view 
    setZOrderOnTop(true); 
    //setZOrderMediaOverlay(true); 


    /// было хорошо на Kindle но плохо на Asus transformer и телефонах 
    setEGLConfigChooser(8, 8, 8, 8, 16, 0); 

    /// попытка сделать хорошо везде 
    //setEGLConfigChooser(true); 

    //getHolder().setFormat(PixelFormat.RGBA_8888); 
    getHolder().setFormat(PixelFormat.RGBA_4444); 

    //Bitmap bmTemp = BitmapFactory.decodeResource(getResources(), R.drawable.temp_bitmap); 
    mRenderer = new MainGLRenderer(context,bm,bm, Color.BLACK, Color.WHITE,-20f); 
    setRenderer(mRenderer); 
    setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); 
} 

Renderer OnSurfaceCreated:

@Override 
public void onSurfaceCreated(GL10 gl, EGLConfig config) { 

    /// смешивание 

    GLES20.glEnable(GLES20.GL_BLEND); 
    GLES20.glBlendColor(0f, 0f, 0f, 1f); 
    GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA); 
    //GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE); 

    /// z-буффер 
    GLES20.glEnable(GLES20.GL_DEPTH_TEST); 

    /// не отрисовывать изнанку полигонов 
    GLES20.glEnable(GLES20.GL_CULL_FACE); 

    //GLES20.glEnable(GLES20.GL_TEXTURE_2D); 

    /// функция z-буффера 
    GLES20.glDepthFunc(GLES20.GL_LEQUAL); 

    /// тоже что-то для z-буффера 
    GLES20.glDepthMask(true); 

    /// сделать цвет фона фрейма - по нулям для прозрачности 
    GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
} 

Texture du constructeur bitmap:

public Texture(Bitmap bm) { 
     //создаем пустой массив из одного элемента 
     //в этот массив OpenGL ES запишет свободный номер текстуры, 
     // который называют именем текстуры 
     int []names = new int[1]; 
     // получаем свободное имя текстуры, которое будет записано в names[0] 
     GLES20.glGenTextures(1, names, 0); 
     //запомним имя текстуры в локальном поле класса 
     name = names[0]; 
     //теперь мы можем обращаться к текстуре по ее имени name 
     //устанавливаем режим выравнивания по байту 
     GLES20.glPixelStorei(GLES20.GL_UNPACK_ALIGNMENT, 1); 
     //делаем текстуру с именем name текущей 
     GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, name); 
     //устанавливаем фильтры текстуры 
     GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, 
       GLES20.GL_TEXTURE_MIN_FILTER, 
       //GLES20.GL_LINEAR_MIPMAP_LINEAR); 
       GLES20.GL_NEAREST); 
     GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, 
       GLES20.GL_TEXTURE_MAG_FILTER, 
       //GLES20.GL_LINEAR); 
       GLES20.GL_NEAREST); 


     GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, 
       GLES20.GL_TEXTURE_WRAP_S, 
       //GLES20.GL_REPEAT); 
       GLES20.GL_CLAMP_TO_EDGE); 
     GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, 
       GLES20.GL_TEXTURE_WRAP_T, 
       //GLES20.GL_REPEAT); 
       GLES20.GL_CLAMP_TO_EDGE); 

     //переписать Bitmap в память видеокарты 
     GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bm, 0); 

     // удалить Bitmap из памяти, т.к. картинка уже переписана в видеопамять 
     bm.recycle(); 
     System.gc(); 
     Runtime.getRuntime().gc(); 

     GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D); 
} 

Désolé long post. Merci d'avance.

Répondre

0

Résolu en changeant GLES20.glDepthFunc (GLES20.GL_LEQUAL) en GLES20.glDepthFunc (GLES20.GL_ALWAYS);

+0

Vous devez effacer le tampon de profondeur à chaque trame en utilisant 'glClearDepthf (1.0f); glClear (GL_DEPTH_BUFFER_BIT); 'parce que Transformer n'initialise parfois pas les tampons de rendu à zéro (et la norme ne l'exige pas). – Triang3l