1

我正在android上开发一个照片库小部件,它应该实现一些功能,比如照片之间的翻转和卷曲效果,这些功能确实让照片纸卷曲在触摸时留下深刻印象,并显示带有照片评论的底层纸片。我已经使用 ViewPager 和 FragmentStatePagerAdapter 实现了这一点,它们创建了包含 GLSurfaceView 的 Fragment 实例,渲染器使用 opengl-es 2.0 产生卷曲效果。

我已经在 Kindle Fire HD 7` 和从 Ace (2.3.3) 到 Galaxy Tab 10 的许多类型的 Sumsung 设备上测试了这个解决方案 - 工作正常。但是在华硕 Transformer tf700t 上,我的图像严重失真。

Kindle Fire高清截图

华硕变压器上的图像失真

有没有人面临类似的问题?与 mali400 或 PowerVR 不同,Tegra 3 GPU 的初始化 GLES2.0 上下文是否有一些特殊性?

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

渲染器 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);
}

位图构造函数的纹理:

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

对不起,很长的帖子。先感谢您。

4

1 回答 1

0

通过将 GLES20.glDepthFunc( GLES20.GL_LEQUAL ) 更改为 GLES20.glDepthFunc( GLES20.GL_ALWAYS ); 解决了

于 2013-06-13T06:10:29.383 回答