GLSurfaceView渲染Asus Transformer上的扭曲图像

时间:2013-06-06 09:36:55

标签: android opengl-es-2.0

我正在Android上开发一个照片gallary小部件,它应该实现一些功能,例如照片和卷曲效果之间的翻转,这会让照片纸在触摸时产生压痕并显示带有一些照片评论的床单。 我已经使用ViewPager和FragmentStatePagerAdapter实现了它,它创建了包含GLSurfaceView的Fragment实例,渲染器使用opengl-es 2.0生成卷曲效果。

我已经在Kindle Fire HD 7上测试了这个解决方案,并且从Ace(2.3.3)到Galaxy Tab 10'的许多类型的Sumsung设备 - 工作正常。但是对于华硕Transformer tf700t,我的图像变形很糟糕。

Kindle Fire HD Screenshoot

Distorted image on Asus Transformer

有人遇到过类似的问题吗?与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);
}

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

位图构造函数的纹理:

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

很抱歉很长的帖子。提前谢谢。

1 个答案:

答案 0 :(得分:0)

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