我嘗試重用Android Media Effects samples並希望能夠使用來自相機或圖庫拾取的新位圖來更改紋理數據。無解到目前爲止Android:如何更改來自圖庫/相機的OpenGLES紋理數據/位圖
private void loadTextures() {
// Generate textures
GLES20.glGenTextures(2, mTextures, 0);
// Load input bitmap
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.puppy);
mImageWidth = bitmap.getWidth();
mImageHeight = bitmap.getHeight();
mTexRenderer.updateTextureSize(mImageWidth, mImageHeight);
// Upload to texture
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextures[0]);
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
// Set texture parameters
GLToolbox.initTexParams();
}
,這是我的麻煩功能:
public void changeBackground(Uri bitmapUri) {
Log.d(TAG, "changeBackground : " + bitmapUri.getPath());
Bitmap bitmap = BitmapFactory.decodeFile(bitmapUri.getPath());
mImageWidth = bitmap.getWidth();
mImageHeight = bitmap.getHeight();
mTexRenderer.updateTextureSize(mImageWidth, mImageHeight);
GLUtils.texSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0, 0, bitmap);
theBackground.requestRender(); //my GLSurfaceView
bitmap.recycle();
}
我試了幾種方法:
只使用texSubImage2D - >紋理未更新
刪除並重新創建新的位圖紋理 - >黑色質感
注:位圖的尺寸是固定的,在1080×1080
如何改變/修改/更換新的紋理數據位圖?
UPDATE:
我認爲這個問題更涉及到這樣一個問題:Setting texture on 3D object using image from photo gallery。我從gallery意圖抓取圖像後調用changeBackground(),然後裁剪(另一個意圖)。
現在,如何有效地改變從畫廊意圖位圖紋理數據?任何人都有線索?
解決
我通過defering紋理加載過程onSurfaceChange()函數解決了這個問題。只需使用一個標誌來指示要加載的文件並onSurfaceChange再次檢查該標誌。
private Uri mFileToLoad = null;
public void changeBackground(Uri bitmapUri) {
Log.d(TAG, "changeBackground : " + bitmapUri.getPath());
mFileToLoad = bitmapUri;
theBackground.requestRender();
}
和我onSurfaceChange()
public void onSurfaceChanged(GL10 gl, int width, int height) {
Log.d(TAG, "onSurfaceChanged w:" + width + " h:" + height);
if (mFileToLoad!=null) {
GLES20.glDeleteTextures(mTextures.length, mTextures, 0);
GLES20.glGenTextures(mTextures.length, mTextures, 0);
Bitmap bitmap = BitmapFactory.decodeFile(mFileToLoad.getPath());
mImageWidth = bitmap.getWidth();
mImageHeight = bitmap.getHeight();
mTexRenderer.updateTextureSize(mImageWidth, mImageHeight);
// Upload to texture
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextures[0]);
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
// Set texture parameters
GLToolbox.initTexParams();
mFileToLoad = null;
bitmap.recycle();
}
if (mTexRenderer != null) {
mTexRenderer.updateViewSize(width, height);
}
}
到目前爲止,它的工作原理。
你有一個以上的質感嗎?如果是這樣,你需要'glBindTexture'你想編輯的那個。 – immibis
像媒體效果樣本,我有兩個紋理。一個用於原始位圖,另一個用於存儲後效應紋理。 試圖在texSubImage2D之前調用glBind,並且仍然沒有紋理更新 –