gpt4 book ai didi

c++ - 无法在 Linux 上使用屏幕外 OpenGL 上下文生成 mipmap

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:09:26 28 4
gpt4 key购买 nike

这个问题是我描述的问题的延续 here .这是我见过的最奇怪的错误之一。我的引擎在两种模式下运行:显示模式和屏幕外。操作系统是 Linux。我为纹理生成 mipmaps,在显示模式下一切正常。在那种模式下我使用 GLFW3 进行上下文创建。现在,有趣的部分:在屏幕外模式下,我使用下面的代码手动创建的上下文,mipmap 生成偶尔会失败!在某些运行中结果输出看起来不错,而在其他情况下丢失当帧充满纹理垃圾数据或完全为空时,可以清楚地看到级别。起初我以为我的 mipmap gen 例程是错误的,它是这样的:

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); 

包括Max level检测公式:

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

但是所有这些东西并没有始终如一地工作。在 10-15 次运行中,有 3-4 次出现了损坏的 Mipmaps。然后我发现切换到 GL_LINEAR 解决了它。同样在 mipmap 模式下,仅设置 1 个级别有效以及。最后我开始认为上下文级别可能存在问题,因为在屏幕模式下它可以工作!我将上下文创建切换到 GLFW3 并且它可以工作。所以我想知道这里发生了什么?我是否错过了 Pbuffer 设置中的某些东西,它破坏了 mipmaps一代?我对此表示怀疑,因为 AFAIK 它是由驱动程序完成的。

这是我自定义的屏幕外上下文创 build 置:

  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 位。显卡:英伟达 Geforce GTX 680。引擎使用OpenGL 4.2 API

完整的 OpenGL 信息:

**OpenGL 供应商字符串:NVIDIA Corporation

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

OpenGL 版本字符串:4.4.0 NVIDIA 331.49

OpenGL 着色语言版本字符串:4.40 NVIDIA via Cg 编译器**

顺便说一句,我也用过旧的驱动程序,这没关系。

更新:

似乎我关于 GLFW 的假设是错误的。当我编译引擎并从终端运行它时,同样的事情正在发生。但是 - 如果我从 IDE(调试或发布)运行引擎,则 mipmap 没有问题。独立应用程序是否可能针对不同的 SO?

为了清楚起见,我不使用 Pbuffers 渲染到。我渲染到自定义帧缓冲区。

更新 1:

我读到过 2 纹理的非幂可能很难自动生成 mipmaps。而且如果 OpenGL 无法生成所有级别,它会使用纹理。这可能就是我在这里遇到的情况吗?因为有一次mipmapped 纹理出错其余纹理(非 mipmapped)也消失了。但如果是这种情况,那么为什么这种行为不一致?

最佳答案

呃,你为什么首先使用 PBuffers? PBuffers 有太多警告,因为在新项目中使用它们只有一个正当理由?

你想要离屏渲染?然后使用帧缓冲对象 (FBO)。

您需要一个纯粹的屏幕外上下文?然后创建一个您根本不显示的普通窗口,并在其上创建一个 FBO。

关于c++ - 无法在 Linux 上使用屏幕外 OpenGL 上下文生成 mipmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22763040/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com