我正在Android上开发一个照片gallary小部件,它应该实现一些功能,例如照片和卷曲效果之间的翻转,这会让照片纸在触摸时产生压痕并显示带有一些照片评论的床单。 我已经使用ViewPager和FragmentStatePagerAdapter实现了它,它创建了包含GLSurfaceView的Fragment实例,渲染器使用opengl-es 2.0生成卷曲效果。
我已经在Kindle Fire HD 7上测试了这个解决方案,并且从Ace(2.3.3)到Galaxy Tab 10'的许多类型的Sumsung设备 - 工作正常。但是对于华硕Transformer tf700t,我的图像变形很糟糕。
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);
}
很抱歉很长的帖子。提前谢谢。
答案 0 :(得分:0)
通过将GLES20.glDepthFunc(GLES20.GL_LEQUAL)更改为GLES20.glDepthFunc(GLES20.GL_ALWAYS)来解决;