gpt4 book ai didi

opengl - 如果后面没有 glGetError,glGenerateMipmap 就会失败……等等,什么?

转载 作者:行者123 更新时间:2023-12-02 01:46:34 28 4
gpt4 key购买 nike

我的项目的纹理生成有一个非常奇怪的问题。第一个 mipmapped 纹理完美无缺,但下一个纹理只能绘制第一级。在调试时,我突然想到了一个修复它的黑客:

glGenTextures(1, &texture->textureID);
glBindTexture(GL_TEXTURE_2D, texture->textureID);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

glTexStorage2D(GL_TEXTURE_2D, 10, GL_RGBA8, width, height);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
glGenerateMipmap(GL_TEXTURE_2D);
assert(glGetError() == GL_NO_ERROR); // Mipmapping fails if glGetError is not here

glBindTexture(GL_TEXTURE_2D, 0);

为什么这仅在 glGenerateMimap 之后调用 glGetError(正如您在此断言中所见,始终返回 GL_NO_ERROR)函数时才起作用?为什么和它有关系?

我目前使用的是带有最新 GeForce 340.52 驱动程序的 GeForce GTX 670

编辑:几张图片可能会有所帮助

使用 glGetError():

enter image description here

没有 glGetError():

enter image description here

最佳答案

引用Is iOS glGenerateMipmap synchronous, or is it possibly asynchronous? ,看来 glGenerateMipmaps 是异步工作的。我的项目使用共享上下文来创建着色器、纹理和网格(对不起,如果我没有提到这一点,我认为这无关紧要)。

问题是,每当纹理生成完成时,“纹理生成”标志就会上升并且共享上下文将被破坏,因此最后一个 glGenerateMipmap 似乎没有通过管道刷新。对 glGetError 的调用需要从管道中刷新操作以查看是否有任何错误要报告,这正是它使一切正常工作的原因。

因此,换句话说,如果您在单独的共享上下文中执行某些操作,则需要在终止该线程之前显式调用 glFinish,否则某些操作将无法完成。

关于opengl - 如果后面没有 glGetError,glGenerateMipmap 就会失败……等等,什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25343106/

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