Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 如果未后跟GLGETMAP错误,GLGENTEMIPMAP将失败。。。等等,什么?_Opengl_Mipmaps - Fatal编程技术网

Opengl 如果未后跟GLGETMAP错误,GLGENTEMIPMAP将失败。。。等等,什么?

Opengl 如果未后跟GLGETMAP错误,GLGENTEMIPMAP将失败。。。等等,什么?,opengl,mipmaps,Opengl,Mipmaps,我的项目的纹理生成有一个非常奇怪的问题。第一个mipmapped纹理完美无瑕,但下一个纹理只绘制第一层。在调试过程中,我突然发现了一个解决方法: glGenTextures(1, &texture->textureID); glBindTexture(GL_TEXTURE_2D, texture->textureID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParame

我的项目的纹理生成有一个非常奇怪的问题。第一个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);
为什么只有在glgenerateMap之后调用glGetError(正如您在这个断言中看到的,它总是返回GL_NO_ERROR)函数时,这才起作用?为什么这和它有关

我目前正在使用GeForce GTX 670和最新的GeForce 340.52驱动程序

编辑:一些图片可能会有所帮助

使用glGetError():

没有glGetError():

关于,GLGENTEREMIPMAPS似乎是异步工作的。我的项目使用共享上下文来创建着色器、纹理和网格(如果我没有提到这一点,很抱歉,我认为这无关紧要)

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


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

width'和height'的值是多少?无论如何,我同意这看起来令人费解。最可能的解释是一个驱动程序错误。如果这是你的问题,它们不是二的幂,尽管我的图形卡支持它们。尽管如此,我还是会尝试一下POT图像,看看这是否有什么不同。我实际上想检查它们是否至少为512,因为否则为
glTexStorage2D()
指定10个级别将是一个错误。但既然你没有出错,我想这些论点一定很好。啊,我明白了。是的,他们是。我刚刚尝试了一些1024x1024的图像,同样的事情也发生了。我现在假设这是一个驱动程序错误,当它们再次更新时重新检查。谢谢你