2012-02-03 8 views
2

私はアンドロイドゲームでモーションブラー効果を実装しようとしています。Android opengl 1.1テクスチャレンダリング1286エラー(無効なフレームバッファ操作)

多くの研究の後、私はこれを行う最良の方法は、フレームバッファオブジェクトを使用して前のフレームをテクスチャとして保存し、それを現在のフレームの上にレンダリングすることだとわかりました。このようなことをする方法については、tutorialsを参照してください。このコードでは、基本的にシーンをテクスチャにレンダリングしてから、デフォルトのフレームバッファにテクスチャを描画します。

それだけで描くgl.glGetErrorで1286(無効なフレームバッファの操作)エラー(と**白テクスチャです)

を解決しよう:問題はジャンが言ったように2つのテクスチャdimmensionsの非電源のようです

int[] fb, depthRb, renderTex; 
int texW = 480 * 2; 
int texH = 800 * 2; 
IntBuffer texBuffer; 
int[] buf = new int[texW * texH]; 
GL11ExtensionPack gl11ep ; 
void setup(GL10 gl) 
{ 
    gl11ep=(GL11ExtensionPack)gl;   

    fb = new int[1]; 
    depthRb = new int[1]; 
    renderTex = new int[1]; 

    gl11ep.glGenFramebuffersOES(1, fb, 0); 
    gl11ep.glGenRenderbuffersOES(1, depthRb, 0); // the depth buffer 

    gl.glGenTextures(1, renderTex, 0);// generate texture 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, renderTex[0]); 

    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT); 

    texBuffer = ByteBuffer.allocateDirect(buf.length*4).order(ByteOrder.nativeOrder()).asIntBuffer(); 

    gl.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGB, texW, texH, 0, GL10.GL_RGB, GL10.GL_UNSIGNED_SHORT_5_6_5, texBuffer); 


    gl11ep.glBindRenderbufferOES(GL11ExtensionPack.GL_RENDERBUFFER_OES, depthRb[0]); 
    gl11ep.glRenderbufferStorageOES(GL11ExtensionPack.GL_RENDERBUFFER_OES, GL11ExtensionPack.GL_DEPTH_COMPONENT16, texW, texH); 

} 

boolean RenderStart(GL10 gl) 
{ 
    // Bind the framebuffer 
    gl11ep.glBindFramebufferOES(GL11ExtensionPack.GL_FRAMEBUFFER_OES, fb[0]); 
    // specify texture as color attachment 
    gl11ep.glFramebufferTexture2DOES(GL11ExtensionPack.GL_FRAMEBUFFER_OES, GL11ExtensionPack.GL_COLOR_ATTACHMENT0_OES, GL10.GL_TEXTURE_2D, renderTex[0], 0); 
    // attach render buffer as depth buffer 
    gl11ep.glFramebufferRenderbufferOES(GL11ExtensionPack.GL_FRAMEBUFFER_OES, GL11ExtensionPack.GL_DEPTH_ATTACHMENT_OES, GL11ExtensionPack.GL_RENDERBUFFER_OES, depthRb[0]); 

    int error = gl.glGetError(); 
    if (error != GL10.GL_NO_ERROR) { 
        Tools.con("Background Load GLError: " + error) ;//here the 1286 error 
    } 

    int status = gl11ep.glCheckFramebufferStatusOES(GL11ExtensionPack.GL_FRAMEBUFFER_OES); 
    if (status != GL11ExtensionPack.GL_FRAMEBUFFER_COMPLETE_OES)//here always geting true 
    { 
     return false; 
    } 

    return true; 
} 

void RenderEnd(GL10 gl) 
{ 
    gl11ep.glBindFramebufferOES(GL11ExtensionPack.GL_FRAMEBUFFER_OES, 0); 
    gl.glClearColor(0f, 0f, 0f, 1.0f); 
    gl.glClear(gl.GL_DEPTH_BUFFER_BIT | gl.GL_COLOR_BUFFER_BIT); 
    gl.glEnable(GL10.GL_TEXTURE_2D); 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, renderTex[0]); 
    gl.glColor4f(1,1,1,1); 
    ((GL11Ext) gl).glDrawTexfOES(0, 0, 0,800, 480); 
    gl.glDisable(GL10.GL_TEXTURE_2D); 

} 


public void onDrawFrame(GL10 gl) 
    { 

    this.RenderStart(gl); 
    render(gl);//render scene 
    this.RenderEnd(gl); 
    } 

public void onSurfaceCreated(GL10 gl, EGLConfig config) 
    { 
     ... 
     setup(gl); 
    } 
+0

誰にでも本当に助けが必要です – SteveL

答えて

2

おそらくあなたは、あなたのテクスチャが高さと幅(すなわち512×512、またはそれはぼかし効果のためだけだからでもそれ以下)として2の力を持たせる必要があります。ほとんどすべてのデバイスにはハードウェアアクセラレーションが必要です。これをテストするクイック方法は、エミュレータで実行することです(ソフトウェアであれば、コード内に必要なすべての機能がサポートされていれば動作するはずです)

+0

awnserありがとう、 2つの数の威力を持つテクスチャの次元とフレームバッファ問題が修正されました。しかし、私はここで説明した別の問題がありますhttp://stackoverflow.com/questions/9196401/opengl-es-render-to-texture-via-フレームバッファー - レンダリングオンリーワンカラー – SteveL