ここ数日、画面外の画像に OpenGl シェーダーを適用し、結果をファイルとして SD カードに保存する最良の方法を調査しています。これらはすべてバックグラウンドで行われる必要があり、ユーザーはそれに気付かないはずです。
私は2つの可能な解決策に出くわしました:EGL(ドキュメントがなく、すべてのサンプルがコンパイルされていません)RenderBuffer、OpenGlでFBOを作成し、renderBufferをFBOに割り当てて明示的に描画します。問題は、常に「glError」が発生することですマークされた行に 1280" が含まれており、glSurfaceView を使用せずにそのすべてを実行できるかどうかについても混乱しています (私が言ったように、バックグラウンドに配置したいのです)。
Android SDK の HelloEfect darkroom サンプルに遭遇し、次の変更を行いました。
private void loadFrameBuffers(int tex) throws Exception {
// creating FBO object
int[] frame = new int[1];
GLES20.glGenFramebuffers(1, frame, 0);
int fboId = frame[0];
TextureRenderer.checkGlError("glGenFramebuffers");
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fboId);
TextureRenderer.checkGlError("glBindFramebuffer");
// // attaches texture to framebuffer - We need to attached RenderBuffer
// image and not texture image!!!
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER,
GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, tex, 0);
TextureRenderer.checkGlError("glFramebufferTexture2D");
// creating RenderBuffer object
int[] renderbuffers = new int[1];
GLES20.glGenRenderbuffers(1, renderbuffers, 0);
TextureRenderer.checkGlError("glGenRenderbuffers");
GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, renderbuffers[0]);
TextureRenderer.checkGlError("glBindRenderbuffer");
int width = Math.min(GLES20.GL_MAX_RENDERBUFFER_SIZE, mImageWidth);
int height = Math.min(GLES20.GL_MAX_RENDERBUFFER_SIZE, mImageHeight);
GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER,
GLES20.GL_RGBA , width, height);
TextureRenderer.checkGlError("glRenderbufferStorage"); // !!!!! throws exception
GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER,
GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_RENDERBUFFER,
renderbuffers[0]);
TextureRenderer.checkGlError("glFramebufferRenderbuffer");
int status = GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER);
if (status != GLES20.GL_FRAMEBUFFER_COMPLETE)
throw new Exception("error in creating fbo, error code is: "
+ status);
}
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();
}
@Override
public void onDrawFrame(GL10 gl) {
if (!mInitialized) {
// Only need to do this once
mEffectContext = EffectContext.createWithCurrentGlContext();
mTexRenderer.init();
loadTextures();
try {
loadFrameBuffers(mTextures[0]);
} catch (Exception e) {
e.printStackTrace();
}
mInitialized = true;
}
if (mCurrentEffect != R.id.none) {
// if an effect is chosen initialize it and apply it to the texture
initEffect();
applyEffect();
}
renderResult();
}
行: GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_DEPTH_RANGE, width, height); TextureRenderer.checkGlError("glRenderbufferStorage");
「hlError 1280」例外がスローされ、何が問題なのかわかりません。どんな助けでも大歓迎です!