2014-03-31 13 views
2

這個問題是我描述的here問題的延續。這是我見過的最奇怪的錯誤之一。我的引擎運行在兩種模式下:顯示器模式和offscreen.The操作系統是Linux.I爲紋理生成mipmap和在顯示模式下它都可以正常工作。在該模式下,我使用GLFW3創建上下文。現在,有趣的部分:在屏幕外模式下,我創建的上下文手動使用下面的代碼,生成的mipmap生成失敗!在某些運行中,生成的輸出看起來不錯,而在其他缺失的層次中,清楚地看到該幀充滿了紋理垃圾數據或完全爲空。 起初,我以爲我有我的紋理貼圖代常規錯誤這是這樣的:在Linux上不能生成具有屏幕外OpenGL上下文的mipmapps

glGenTextures(1, &textureName); 
glBindTexture(GL_TEXTURE_2D, textureName);   
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, imageInfo.Width, imageInfo.Height, 0, imageInfo.Format, imageInfo.Type, imageInfo.Data); 
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); 


    glGenerateMipmap(GL_TEXTURE_2D); 
    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_MAX_LEVEL, XXX); 

包括最大電平檢測公式:

int numMipmaps = 1 + floor(log2(glm::max(imageInfoOut.width, imageInfoOut.height))); 

但是所有這些東西並沒有一貫的工作.10-15次運行3-4出來破碎的Mipmaps.What然後我發現是切換到GL_LINEAR解決它。另外在mipmap模式,s最後我開始考慮在上下文級別可能會出現問題,因爲在屏幕模式下它起作用!我將上下文創建切換到GLFW3並且工作正常。所以我想知道這裏發生了什麼?我錯過了什麼打破mipmaps一代的Pbuffer設置?我懷疑它,因爲AFAIK它是由驅動程序完成的。

這裏是我的自定義屏幕外的上下文創建設置:

int visual_attribs[] = { 
      GLX_RENDER_TYPE, 
     GLX_RGBA_BIT, 
     GLX_RED_SIZE, 8, 
     GLX_GREEN_SIZE, 8, 
     GLX_BLUE_SIZE, 8, 
     GLX_ALPHA_SIZE, 8, 
     GLX_DEPTH_SIZE, 24, 
     GLX_STENCIL_SIZE, 8, 
      None 
     }; 
     int context_attribs[] = { 
      GLX_CONTEXT_MAJOR_VERSION_ARB, vmaj, 
      GLX_CONTEXT_MINOR_VERSION_ARB, vmin, 
      GLX_CONTEXT_FLAGS_ARB, 

      GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB 
#ifdef DEBUG   
      | GLX_CONTEXT_DEBUG_BIT_ARB 
#endif 
      , 
      GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB, 
      None 
     }; 

     _xdisplay = XOpenDisplay(NULL); 
     int fbcount = 0; 
     _fbconfig = NULL; 


     // _render_context 
     if (!_xdisplay) { 
          throw(); 
     } 
     /* get framebuffer configs, any is usable (might want to add proper attribs) */ 
     if (!(_fbconfig = glXChooseFBConfig(_xdisplay, DefaultScreen(_xdisplay), visual_attribs, &fbcount))) { 
         throw(); 
     } 

     /* get the required extensions */ 
     glXCreateContextAttribsARB = (glXCreateContextAttribsARBProc) glXGetProcAddressARB((const GLubyte *) "glXCreateContextAttribsARB"); 
     glXMakeContextCurrentARB = (glXMakeContextCurrentARBProc) glXGetProcAddressARB((const GLubyte *) "glXMakeContextCurrent"); 


     if (!(glXCreateContextAttribsARB && glXMakeContextCurrentARB)) { 

      XFree(_fbconfig); 
           throw(); 

     } 

     /* create a context using glXCreateContextAttribsARB */ 
     if (!(_render_context = glXCreateContextAttribsARB(_xdisplay, _fbconfig[0], 0, True, context_attribs))) { 

      XFree(_fbconfig); 
          throw(); 

     } 

        // GLX_MIPMAP_TEXTURE_EXT 
     /* create temporary pbuffer */ 
     int pbuffer_attribs[] = { 
      GLX_PBUFFER_WIDTH, 128, 
      GLX_PBUFFER_HEIGHT, 128, 
      None 
     }; 

     _pbuff = glXCreatePbuffer(_xdisplay, _fbconfig[0], pbuffer_attribs); 

     XFree(_fbconfig); 
     XSync(_xdisplay, False); 

     /* try to make it the current context */ 
     if (!glXMakeContextCurrent(_xdisplay, _pbuff, _pbuff, _render_context)) { 
      /* some drivers does not support context without default framebuffer, so fallback on 
      * using the default window. 
      */ 
      if (!glXMakeContextCurrent(_xdisplay, DefaultRootWindow(_xdisplay), 
        DefaultRootWindow(_xdisplay), _render_context)) { 

       throw(); 

      } 
     } 

差點忘了:我的系統和硬件:

的Kubuntu 13.04 64位。 GPU:NVidia Geforce GTX 680。該發動機採用的OpenGL 4.2 API

完整的OpenGL信息:

** OpenGL的供應商字符串:NVIDIA公司

OpenGL渲染字符串:的GeForce GTX 680 /的PCIe/SSE2

的OpenGL版本字符串:4.4.0 NVIDIA 331.49

OpenGL着色語言版本字符串:4.40英偉達通過Cg編譯器**

順便說一句,我用的也是舊的驅動程序,沒關係。

UPDATE:

好像我就GLFW假設是wrong.When我編譯引擎,並從終端運行它同樣是happening.BUT - 如果我從IDE(調試或發佈運行引擎)這個mipmaps沒有問題。獨立應用有可能針對不同的SO?

爲了說清楚,我不使用Pbuffers渲染成我自己渲染成自定義幀緩衝區。

UPDATE1:

我讀過的2個紋理無動力可能會非常棘手自動生成mipmaps.And,在OpenGL的情況下,未能生成所有事實證明質地usage.Is的可能水平那是我在這裏遇到的情況嗎?因爲一旦mipmapped紋理出錯,剩下的紋理(非mipmapped)也會消失。但是如果是這種情況,那麼爲什麼這種行爲不一致呢?

+0

glxinfo | grep「OpenGL」,並將該輸出添加到您的問題 –

+0

imageInfo.anything是原生OpenGL整數? –

+0

不知道這是否有所貢獻,但pbuffers已被棄用/不被支持,我認爲*您應該創建一個帶有gl上下文的隱藏窗口。任何機會你的應用程序是多線程/多上下文? – sbabbi

回答

0

呃,你爲什麼首先使用PBuffers? PBuffers有太多的警告,只有一個有效的理由在新項目中使用它們?

你想離線渲染?然後使用幀緩衝區對象(FBO)。

你需要一個純粹的屏幕外的上下文嗎?然後創建一個你根本不顯示的普通窗口並在其上創建一個FBO。

+0

我沒有解釋我自己...我不使用Pbuffers渲染。我使用FBO和完全可編程的管道。我只使用Pbuffer來獲得離屏上下文。我不想使用GLFW或任何其他基於顯示的API,因爲我需要非常快地設置上下文。但正如我所說的,現在即使使用GLFW作爲上下文init,我仍然可以當從終端運行時,令人討厭的東西... –

+0

@MichaelIV:所有更多的理由不使用PBuffers。創建一個常規窗口,但只是不顯示它(不要調用XMapWindow),然後使用FBOs。 – datenwolf

+0

這就是我現在用GLFW做。但是一旦我設置了GL_MIPMAP_LINEAR它們完全消失或者偶爾會產生垃圾。我不明白它在Windows上,但是從IDE內部運行時我不明白它。這真的很奇怪。 –