這個問題是我描述的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)也會消失。但是如果是這種情況,那麼爲什麼這種行爲不一致呢?
glxinfo | grep「OpenGL」,並將該輸出添加到您的問題 –
imageInfo.anything是原生OpenGL整數? –
不知道這是否有所貢獻,但pbuffers已被棄用/不被支持,我認爲*您應該創建一個帶有gl上下文的隱藏窗口。任何機會你的應用程序是多線程/多上下文? – sbabbi