我尝试重用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,并且仍然没有纹理更新 –