2013-06-03 108 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