我正在android上开发一个照片库小部件,它应该实现一些功能,比如照片之间的翻转和卷曲效果,这些功能确实让照片纸卷曲在触摸时留下深刻印象,并显示带有照片评论的底层纸片。我已经使用 ViewPager 和 FragmentStatePagerAdapter 实现了这一点,它们创建了包含 GLSurfaceView 的 Fragment 实例,渲染器使用 opengl-es 2.0 产生卷曲效果。
我已经在 Kindle Fire HD 7` 和从 Ace (2.3.3) 到 Galaxy Tab 10 的许多类型的 Sumsung 设备上测试了这个解决方案 - 工作正常。但是在华硕 Transformer tf700t 上,我的图像严重失真。
有没有人面临类似的问题?与 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);
}
对不起,很长的帖子。先感谢您。