2013-02-17 281 views
0

後續問題:紋理不循環顯示

  • 我需要爲宗教組織設置不同的活動紋理?這可能是原因,因爲我沒有考慮到這一點。無論哪種方式,我的活動紋理都有問題。如果我在此之前將活動紋理設置爲TEXTURE_1,則確實會得到該對象的紋理(但是是錯誤的)。

    for (int side = 0; side < 2; side++) 
    { 
    
        glPushAttrib(GL_ALL_ATTRIB_BITS); 
        glBindTexture(GL_TEXTURE_2D, 0); // Delete this line and a, wrong, texure pops up for the second iteration 
        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, modelsFboId[side]); 
    
        glViewport(0,0,screenWidth,screenHeight); 
        glMatrixMode(GL_PROJECTION); 
        glLoadIdentity(); 
        gluPerspective(SCREEN_FOV, SCREEN_RAT, NEAR, FAR); 
        glMatrixMode(GL_MODELVIEW); 
        glLoadIdentity(); 
        glShadeModel(GL_SMOOTH); 
        glHint(GL_PERSPECTIVE_CORRECTION_HINT, 
         GL_NICEST); 
        glDisable(GL_BLEND); 
        glEnable(GL_DEPTH_TEST); 
        glDepthFunc(GL_LESS); 
        glDepthMask(true); 
        glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
        glClearDepth(1.0f); 
        glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    
        glLoadIdentity(); 
    
        camera.look(); 
    
        drawObject(); 
    
        glDisable(GL_DEPTH_TEST); 
        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 
    
        glPopAttrib(); 
    } 
    

我圈了兩個FBO的這兩者都是在一個循環中創建。 fbo的工作很好,但紋理不想綁定的第二個迭代。我嘗試在第二次迭代時切換到不同的活動紋理,我禁用了着色器,並嘗試設置clientactivetexture。如果我跳過第一次迭代,第二次循環無效。當我附加顏色而不是紋理時,對象會顯示(它根本不顯示紋理邊界)。

我試着追蹤這個bug好兩天,現在無濟於事。

此外,在這個循環之後,我有第二個循環,除了它使用顯示列表外,其他循環都是一樣的,並且它對兩次迭代都可以正常工作,這可能表明出現了一些問題。

for (int side = 0; side < 2; side++) { 
     modelsFboId[side] = glGenFramebuffersEXT();          
     modelsFboTextureId[side] = glGenTextures();          
     modelsDepthRenderBufferId[side] = glGenRenderbuffersEXT(); 

     glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, modelsFboId[side]);  

     glBindTexture(GL_TEXTURE_2D, modelsFboTextureId[side]);        
     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);      
     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);   
     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, screenWidth, screenHeight, 0,GL_RGBA, GL_INT, (java.nio.ByteBuffer) null); 
     glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT0_EXT,GL_TEXTURE_2D, modelsFboTextureId[side], 0); 

     glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, modelsDepthRenderBufferId[side]);   
     glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, screenWidth, screenHeight); 
     glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,GL_DEPTH_ATTACHMENT_EXT,GL_RENDERBUFFER_EXT, modelsDepthRenderBufferId[side]); 
     glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 
     } 

drawObject():

// using bind slick, texture int doesn't change in this function nor any other 

    if (textureMode == 1) { 
     glColor3f(color.x, color.y, color.z); 
    } else if (textureMode == 0) { 
     glColor3f(1.0f, 1.0f, 1.0f); 
     glEnable(GL_TEXTURE_2D); 
     textures[texture].bind(); 
    } 

    glPushMatrix(); 
    ..rotations.. all seems definitely fine here and certainly doesn't change in correspondence to the prev iteration. 

    .. draw actual object.. tried LWJGL sphere, a simple cube and some other LWJGL objects 
    glPopMatrix(); 

    if (textureMode == 0) 
     glDisable(GL_TEXTURE_2D); 

陣列inits ..

int skyFboId[] = {-1, -1}; 
int skyFboTextureId[] = {-1, -1}; 

int modelsFboId[] = {-1, -1}; 
int modelsFboTextureId[] = {-1, -1}; 
int modelsDepthRenderBufferId[] = {-1, -1}; 

int listModelsFboId[] = {-1, -1}; 
int listModelsFboTextureId[] = {-1, -1}; 
int listModelsDepthRenderBufferId[] = {-1, -1}; 
int listModelsTextureLocation = -1; 
+0

問題是什麼?如果第二個循環有效,爲什麼不使用它? (雖然它看起來沒有上傳任何紋理數據 - 所以不知道它是如何工作的。)另外,你的第一個循環是一團糟。它正在做很多不必要的工作 - 你多次設置視口;你啓用texture2D,不使用它,然後禁用它;將模型視圖矩陣設置爲兩次。最重要的是,你永遠不會設置你想要吸取的FBO。可能會退後一步,確保您瞭解每個調用的打算,然後通過逐步調試並確保每條線路都能正常工作。 – user1118321 2013-02-17 16:15:55

+0

是的,這是一團糟!抱歉!我是Opengl的新手,隨時學習。然而,我知道每次通話都會做什麼,但我不能確定何時需要給他們打電話。我會立即開始深入研究。但是,我認爲這個開銷不會是一個問題(?)。我知道紋理已正確上傳,因爲它在第一次迭代中顯示,而不是在第二次迭代中顯示。我需要第一個循環不是顯示列表,因爲它每幀更新一次,使用列表會減慢它。 – RobotRock 2013-02-17 16:36:33

+0

清理了一下。 – RobotRock 2013-02-17 16:54:16

回答

0

顯然,油滑庫需要與TextureImpl.unbind解除綁定紋理()。