2010-03-25 91 views
3

我想實現一個簡單的程序,使用3 FBO的渲染場景到紋理和顯示紋理四。在投影到紋理四元組之前,我已經成功使用片段着色器完成此操作,但無法在沒有着色器的情況下使用片段着色器。什麼可能是錯的?
首先,我建立了我的紋理爲什麼我無法使用FBO正確渲染對象?

glGenTextures(3, renderTextureID); 

for (GLint i = 0; i < 3; i++) 
{ 
    glBindTexture(GL_TEXTURE_2D, renderTextureID[i]); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    // this may change with window size changes 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, fboWidth, fboHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 
} 

下一頁一些幀緩衝狀態

glGenFramebuffersEXT(3, framebufferID); 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID[0]); 
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, renderTextureID[0], 0); 
GLenum fboStatus = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); 
if(fboStatus != GL_FRAMEBUFFER_COMPLETE_EXT) 
{ 
    fprintf(stderr, "FBO Error!"); 
} 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID[1]); 
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, renderTextureID[1], 0); 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID[2]); 
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, renderTextureID[2], 0); 

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 

然後我渲染場景

glViewport(0, 0, fboWidth, fboHeight); 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID[0]); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
drawModels(); 

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 
    ADDED: glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, renderTextureID[0]); 

glEnable(GL_SCISSOR_TEST); 
glViewport(windowWidth/2, 0, fboWidth, fboHeight); 
glScissor(windowWidth/2, 0, fboWidth, fboHeight); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

glBegin(GL_QUADS); 
    glTexCoord2i(0, 0); 
    glVertex2f(-1.0f, -1.0f); 
    glTexCoord2i(1, 0); 
    glVertex2f(1.0f, -1.0f); 
    glTexCoord2i(1, 1); 
    glVertex2f(1.0f, 1.0f); 
    glTexCoord2i(0, 1); 
    glVertex2f(-1.0f, 1.0f); 
glEnd(); 

glDisable(GL_SCISSOR_TEST); 
    ADDED: glDisable(GL_TEXTURE_2D); 
glutSwapBuffers(); 

結果是一個黃色的方形。如果不使用FBO,繪製模型繪製黃色線框立方體,所以問題不是這樣。我讀過一篇前面類似的文章,講述了在生成和綁定紋理之後使用glTexParameterf,但我已經完成了這個。
謝謝...

回答

2

我沒有看到任何明確的最終緩衝區。如果確實如此,並且您已啓用Z測試,則最終渲染緩衝區上的所有繪圖(假設您使用相同的Z緩衝區)將得到Z拒絕。

雖然這是一個瘋狂的猜測,因爲仍然有很多缺少的代碼。我假設你沒有任何GL錯誤?

修改添加: 您是否在固定功能中啓用了紋理化? glEnable(GL_TEXTURE_2D);

+0

Theres no GL error。如果我在使用glUseProgram之前使用glUseProgram,然後輸出很好,但是如果我在調用glUseProgram(0)之後嘗試使用紋理,我再次得到黃色方塊 – Brett 2010-03-25 19:01:26

+0

@Brett:那麼這是固定函數的問題建立。我在我的答案中增加了另一個猜測。 – Bahbar 2010-03-25 20:06:24

+0

好的。所以我想我明白了。我在上面的代碼中添加了一個glEnable(GL_TEXTURE_2D),現在它可以工作,謝謝Bahbar。 – Brett 2010-03-26 10:53:00

相關問題