我正在開發一款android上的照片gallary小部件,它應該實現一些功能,如照片和捲曲效果之間的翻轉,這使照片在觸摸時捲曲並顯示底部表單, 。 我用ViewPager和FragmentStatePagerAdapter實現了這個功能,它創建包含GLSurfaceView和Fragment的實例,該渲染器使用opengl-es 2.0產生捲曲效果。GLSurfaceView在華碩變壓器上呈現扭曲的圖像
我已經在Kindle Fire HD 7`和許多類型的Sumsung設備上從Ace(2.3.3)到Galaxy Tab 10'測試了這個解決方案 - 工作正常。但在華碩變壓器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);
}
渲染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);
}
抱歉長期職位。先謝謝你。
您需要使用'glClearDepthf(1.0f);每幀清除深度緩衝區; glClear(GL_DEPTH_BUFFER_BIT);'因爲Transformer有時不會將渲染緩衝區初始化爲零(並且標準不需要)。 – Triang3l