如何在openGL中防止闪烁(抗锯齿伪影)?

如何在openGL中防止闪烁(抗锯齿伪影)?,opengl,textures,antialiasing,mipmaps,Opengl,Textures,Antialiasing,Mipmaps,以下是openGL超级圣经(第5版,第208页)的一段引文: 我目前面临着完全相同的问题,(我正在加载一幅4912 x 3264像素的图像)并进行一些仿射变换,如旋转和平移。它显示出模糊性,特别是当加载的纹理有白色像素时(这可能不是一般的观察结果,但我观察到了这一点)。代码如下: glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXT

以下是openGL超级圣经(第5版,第208页)的一段引文:

我目前面临着完全相同的问题,(我正在加载一幅4912 x 3264像素的图像)并进行一些仿射变换,如旋转和平移。它显示出模糊性,特别是当加载的纹理有白色像素时(这可能不是一般的观察结果,但我观察到了这一点)。代码如下:

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image->width,image->height, 0, GL_BGR, GL_UNSIGNED_BYTE, image->imageData);
//gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGB,image->width,image->height, GL_BGR,GL_UNSIGNED_BYTE,image->imageData);
动画很流畅,除了那些破坏者,一切都很完美。 有人能帮我改善这种情况,因为我正在开发一个应用程序,这将有很大的关注这些东西


另外,如果在使用
glTexImage2D
之后,如果我使用
glGenerateMipmap(GL\u TEXTURE\u 2D)
,它会给出
分段错误(堆芯转储)
。知道我可能遗漏了什么吗?

除非您使用错误的缓冲区对象调用渲染函数,没有足够的数据可以读取,或者其他一些非常奇怪的状态,否则OpenGL不应该崩溃。所以这里发生了某种形式的驱动程序错误


ATI驱动程序有一个非常老的问题,如果您不先调用
glEnable(GL_TEXTURE_2D)
,则
glGenerateMipmap
将失败。我不知道这对你是否有帮助,但你可以试一试。

好了,伙计们,我想回答一下,我找到了一个解决方案:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
将此设置为纹理参数的效果接近完美!我不知道这是否是最好的选择,但效果很好

但现在有一个问题: 加载纹理时,它无法使用(它会提供一个完整的白色填充,而不是图像纹理):


您需要使用
gluBuild2DMipmaps()
调用。在考虑它的时候,我试图证明它为什么不起作用,但我真的希望有人能对它发表评论。

如果使用OpenGL ES/WebGL,请确保纹理大小为2的幂。否则,mipmap生成或纹理过滤无法正常工作,从而导致瑕疵


来源:

你走对了方向。mipmap将改善有关纹理瑕疵的情况。它只定义为两种大小的纹理的力量。@DanielFlassig:胡说八道。mipmap适用于任意大小的纹理。不要传递错误的信息。@Nicolas:对不起,那么我的信息已经过时了。以前是这样的(),我会检查新的规范。@Daniel:他没有问OpenGL ES。桌面GL从2.0开始就没有这个限制。做一个
cout很可能是OpenGL驱动程序错误导致了崩溃。您是否使用类似库的函数来调用函数,但尚未验证这些函数是否受支持?如果是这样,那么您是通过Linux上的空指针调用的
glGenerateMipmap
是一个“较新”的函数,它不可用于直接库链接,除非您获得它的函数指针(例如,使用
glXGetProcAddress
)。我发现在调用glGenerateMipmap()后启用了该函数,之前已修复,将"cout@radical7在这种情况下,你能告诉glXGetProcAddress()的参数是什么吗?@activatedGeek它只是OpenGL函数的引用名称。对于本例,您将添加类似以下代码:
pfnglgeneratemipapproc myGenerateMipmap=glXGetProcAddress(“glGenerateMipmap”)变量类型(例如,
pfnglgeneratemipapproc
)在glext.h中定义。如果返回的函数指针为空,则该函数在该OpenGL上下文中不可用。@activatedGeek:或者您可以使用实际的。更新:使用glTexImage2D()然后使用gluBuild2DMipmaps()生成mipmaps即可!gluBuild2DMipmaps将覆盖您的纹理。所以这可能不是你想要的。此外,gluBuild2DMipmaps会将图像重新缩放到2的幂次方,这在OpenGL-2及以后的版本中是不必要的。但如果我不使用gluBuild2DMipmaps(),则使用上述参数来纠正这些瑕疵将不起作用。它给出了一个分段错误。您是否初始化了高级OpenGL函数?任何OpenGL-1.2都必须首先在运行时加载,否则无法使用它。这是通过所谓的扩展机制实现的——像GLEW这样的助手库在做腿部工作。我添加这一点作为答案,因为我完全没有在问题的评论中提到这一点,这将节省我数小时来找出问题所在
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image->width,image->height, 0, GL_BGR, 
GL_UNSIGNED_BYTE, image->imageData);