【问题标题】:Opengl Create FBO- fatal signal 11 errorOpengl Create FBO-致命信号11错误
【发布时间】:2015-07-31 12:05:24
【问题描述】:

在我的 android 游戏中,我想在 FBO 中渲染我的场景并附加一个纹理,稍后再使用该纹理,但是当我使用 glGenFramebuffers 时出现此错误:

07-30 06:17:27.839: A/libc(1338): Fatal signal 11 (SIGSEGV), code 1, fault addr 0xd0 in tid 1353 (GLThread 157)

如果需要,这是我的代码:

createTexture函数:

public int CreateTexture(int w, int h){
        int[] textureId = new int[1];
        int i;      
        i = GLES20.glGetError();
        GLES20.glGenTextures(1, textureId,0);
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId[0]);
        GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, w, h, 0, GLES20.GL_RGBA, GLES20.GL_FLOAT, null);
ijad kon vali ba hichi poresh nakon hanooz
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);

        if(i!=0){
            Log.d("ERROR", "ERROR Happend"+i+"");
            return i;
        }

        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
        return textureId[0];
    } 

onDrawFrame:

public synchronized void onDrawFrame(GL10 gl) {
    if(first){
    int renderTexture;
    renderTexture = CreateTexture(128,128 );
    GLES20.glGenFramebuffers(1, FBO,0);
    GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, renderTexture, 0);
    first = false;
    }
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, FBO[0]);
    // Some 'global' settings.
    //gl.glEnableClientState(GLES20.GL_VERTEX_ATTRIB_ARRAY_ENABLED);
    gl.glEnableClientState(GLES10.GL_VERTEX_ARRAY);

    gl.glVertexPointer(3, GLES20.GL_FLOAT, 0, mBufVertices);
    // Enable color array.
    gl.glEnableClientState(GLES10.GL_COLOR_ARRAY);
    gl.glColorPointer(4, GLES20.GL_FLOAT, 0, mBufColors);
    //inja khasiate transparent ro faAl mikonim ke betoonim too CurlPage be kaaghaz alpha bedim
    gl.glEnable(GLES20.GL_BLEND);
    gl.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
    gl.glDisable(GLES10.GL_LIGHTING);
    gl.glDisable(GLES20.GL_TEXTURE_2D);
    gl.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, mVerticesCountFront);
    int backStartIdx = Math.max(0, mVerticesCountFront - 2);
    //Log.d("mVerticesCountFront", ""+mVerticesCountFront+"");
    int backCount = mVerticesCountFront + mVerticesCountBack - backStartIdx;

    // Draw back facing blank vertices.
    //gl.glColor4f(1.0f, 0.0f, 0.0f, 0.5f);
    gl.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, backStartIdx, backCount);

    // Disable textures and color array.
    gl.glDisableClientState(GLES10.GL_TEXTURE_COORD_ARRAY);
    gl.glDisableClientState(GLES10.GL_COLOR_ARRAY);

    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
    gl.glDisableClientState(GLES10.GL_VERTEX_ARRAY);
}

知道为什么会出现这样的错误吗?

【问题讨论】:

  • 你绝对不应该在每一帧中创建一个新的帧缓冲区。
  • @BDL 我改了代码如你所说,看第一篇,但是还是有同样的错误和问题
  • FBO 变量是否设置在某处? FBO = new int[1] 之类的东西,相当于你为 textureId 做的事情?

标签: android opengl-es opengl-es-2.0


【解决方案1】:

首先,您在每次 onDrawFrame() 时都会创建一个新纹理和一个新 FBO,每次您的应用程序想要绘制一个帧时,它都会分配更多的内存,最终导致灾难。

您需要在开始渲染之前在 initFrameBuffer(GL10 gl) 之类的函数中创建一次纹理和 FBO,并保持生成的 FBO 整数。

那么就

public synchronized void onDrawFrame(GL10 gl) {
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, FBO[0]);
.... Draw calls.
}

【讨论】:

  • 我改变了代码正如你所说的(见第一篇文章)但仍然是同样的错误
猜你喜欢
  • 2015-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 2012-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多