2012-06-01 65 views
1

我正在與以下結構工作:多重採樣紋理渲染

  • 的OpenGL ES 2 iOS上具有相同ShareGroup
  • 兩個線程(服務器,客戶端=主線程)
  • 兩個EAGL上下文;服務器將材質渲染爲紋理,客戶端使用簡單的紋理四邊形顯示紋理。

附加細節到服務器線程

的FBO在初始化期間創建(工作代碼):

void init(void) { 
    glGenFramebuffer(1, &fbo); 
} 

的呈現服務器的循環如下大致是這樣的:

GLuint loop(void) { 
    glBindFrameBuffer(GL_FRAMEBUFFER, fbo); 
    glViewport(0,0,width,height); 

    GLuint tex; 
    glGenTextures(1, &tex); 
    glBindTexture(GL_TEXTURE_2D, tex); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); 
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0); 

    // Framebuffer completeness check omitted 

    glClear(GL_COLOR_BUFFER_BIT); 

    // actual drawing code omitted 

    // the drawing code bound other textures, so.. 
    glBindTexture(GL_TEXTURE_2D, tex); 
    glGenerateMipmap(GL_TEXTURE_2D); 

    glBindTexture(GL_TEXTURE_2D, GL_NONE); 
    glFlush(); 

    return tex; 
} 

到目前爲止,所有這些工作都很好。

新(越野車)代碼

現在我想多采樣添加到服務器線程,使用GL_APPLE_framebuffer_multisample擴展和修改的初始化代碼:

void init(void) { 
    glGenFramebuffer(1, &resolve_fbo); 
    glGenFramebuffers(1, &sample_fbo); 
    glBindFramebuffer(GL_FRAMEBUFFER, sample_fbo); 
    glGenRenderbuffers(1, &sample_colorRenderbuffer); 
    glBindRenderbuffer(GL_RENDERBUFFER, sample_colorRenderbuffer); 
    glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_RGBA8_OES, width, height); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, sample_colorRenderbuffer); 

    // Framebuffer completeness check (sample_fbo) omitted 

    glBindRenderbuffer(GL_RENDERBUFFER, GL_NONE); 
    glBindFramebuffer(GL_FRAMEBUFFER, GL_NONE); 
} 

主迴路有被改爲:

GLuint loop(void) { 
    glBindFrameBuffer(GL_FRAMEBUFFER, sample_fbo); 
    glViewport(0,0,width,height); 

    GLuint tex; 
    glGenTextures(1, &tex); 
    glBindTexture(GL_TEXTURE_2D, tex); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); 

    glClear(GL_COLOR_BUFFER_BIT); 

    // actual drawing code omitted 

    glBindFramebuffer(GL_FRAMEBUFFER, resolve_fbo); 
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0); 

    // Framebuffer completeness check (resolve_fbo) omitted 

    // resolve multisampling 
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER_APPLE, resolve_fbo); 
    glBindFramebuffer(GL_READ_FRAMEBUFFER_APPLE, sample_fbo); 
    glResolveMultisampleFramebufferAPPLE(); 

    // the drawing code bound other textures, so.. 
    glBindTexture(GL_TEXTURE_2D, tex); 
    glGenerateMipmap(GL_TEXTURE_2D); 

    glBindTexture(GL_TEXTURE_2D, GL_NONE); 
    glFlush(); 

    return tex; 
} 

我現在看到的是,一個紋理包含MUL數據tiple loop()調用混合在一起。我想我要麼丟失某種「解除綁定」,要麼可能是撥打glFinish()(我之前在其他位置有過這樣的問題,我使用glTexImage2D()設置了紋理數據,之後立即使用 - 要求撥打glFinish()強制紋理更新)。

但是插入glFinish()後的繪製代碼沒有改變任何東西在這裏..

回答

1

哦沒關係,這種低級錯誤。我省略了loop()方法實際上包含for循環並呈現多個紋理的細節,但錯誤是我僅在此循環之前綁定了示例fbo,因此在第一次運行之後解析fbo被綁定..

在循環內移動fbo綁定可以解決問題。

無論如何,謝謝@所有的讀者和遺憾浪費你的時間:)