2013-06-03 154 views
0

这里是openGL的超级宝典报价(第5版,第208号):如何防止openGL中的闪烁(抗锯齿伪像)?

The first is an effect called scintillation (aliasing artifacts) that appears 
on the surface of objects rendered very small on-screen compared to the 
relative size of the texture applied. Scintillation can be seen as a sort of 
sparkling that occurs as the sampling area on a texture map moves 
disproportionately to its size on the screen. The negative effects of 
scintillation are most noticeable when the camera or the objects are in motion. 

我目前所面临的相同问题,(我加载图像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_TEXTURE_2D),它会给出segmentation fault (core dump)。任何想法我可能会失踪?

+0

你是在正确的轨道上。 Mipmaps可以改善纹理伪影的情况。它只是定义了两种尺寸纹理的功率。 –

+1

@DanielFlassig:胡话。 Mipmaps适用于任意大小的纹理。不要传递错误信息。 –

+0

@NicolBolas:对不起,那我的信息已经过时了。它曾经是这样的(http://www.khronos.org/opengles/sdk/docs/man/xhtml/glGenerateMipmap.xml)我会检查新的规范。 –

回答

0

除非你调用带有错误缓冲区对象的渲染函数,没有足够的数据读取或其他非常奇怪的状态,OpenGL不应该崩溃。所以这里有一些驱动程序错误的形式。

ATI驱动程序出现了一个很老的问题,如果您没有先拨glEnable(GL_TEXTURE_2D),那么glGenerateMipmap会失败。我不知道这是否会帮助你,但你可以走了。

+0

这不太可能是导致崩溃的OpenGL驱动程序错误。你是否正在使用类似[GLEW](http://glew.sourceforge.net)的函数库来调用函数,并且没有验证这些函数是否受支持?如果是这样,那么你通过一个NULL指针调用在Linux上''glGenerateMipmap'是一个“新的”函数,除非你得到它的函数指针(例如,使用'glXGetProcAddress'),否则它不可用于直接库链接。 – radical7

+0

我发现在调用glGenerateMipmap()之后启用了,之前修复过,在这次调用之前和之后放置了一个“cout <<”(在C++中),它再次在调用 – activatedgeek

+0

@ radical7时再次崩溃你能告诉什么将在这种情况下glXGetProcAddress()的参数? – activatedgeek

-1

好球员,我想回答,我找到了一个解决方案:

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

您需要使用gluBuild2DMipmaps()通话。在思考时,我不知何故试图证明为什么它不起作用,但如果有人能评论它,我真的很想。

+0

更新:使用glTexImage2D(),然后使用gluBuild2DMipmaps()构建mipmap使用它! – activatedgeek

+1

gluBuild2DMipmaps将覆盖您的纹理。所以这可能不是你想要的。此外,gluBuild2DMipmaps会将您的图像重新调整为2的幂次,这对于OpenGL-2及之后的版本是不必要的。 – datenwolf

+0

但如果我不使用gluBuild2DMipmaps(),使用上述参数来纠正这些工件不起作用。它给出了分段错误。 – activatedgeek