2010-05-25 53 views
3

我在OpenGL中執行mipmapping時遇到問題。我正在使用OpenFrameworks並修改了ofTexture類來支持mipmap的創建和呈現。OpenGL Mipmapping:OpenGL如何決定地圖級別?

下面的代碼是從類(稍加修改爲清楚起見)的原始紋理創建代碼:

glEnable(texData.textureTarget); 
     glBindTexture(texData.textureTarget, (GLuint)texData.textureID); 
     glTexSubImage2D(texData.textureTarget, 0, 0, 0, w, h, texData.glType, texData.pixelType, data); 
     glTexParameteri(texData.textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
     glTexParameteri(texData.textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glDisable(texData.textureTarget); 

這是我的版本與紋理貼圖支持:

glEnable(texData.textureTarget); 
     glBindTexture(texData.textureTarget, (GLuint)texData.textureID); 
     gluBuild2DMipmaps(texData.textureTarget, texData.glTypeInternal, w, h, texData.glType, texData.pixelType, data); 
     glTexParameteri(texData.textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
     glTexParameteri(texData.textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
    glDisable(texData.textureTarget); 

的代碼不會產生錯誤(gluBuild2DMipmaps返回'0'),紋理渲染沒有問題。但是,我沒有看到任何區別。

我渲染的場景包含z = 0處的「平面,方形瓷磚」。這基本上是一個2D場景。在繪製貼圖之前使用「glScale()」放大和縮小。當我縮小時,瓦片紋理的像素開始「跳舞」,表明(據我所知)未經過濾的紋理查找。見:http://www.youtube.com/watch?v=b_As2Np3m8A 25秒。

我的問題是:因爲我不移動相機位置,但只使用整個場景的縮放比例,這是否意味着OpenGL無法決定合適的mipmap級別並使用完整的紋理大小(級別0)?

保羅

回答

0

,如果你的目標的OpenGL> = 1.4你或許應該切換到automatic mipmap generation

您可以嘗試更改GL_TEXTURE_MIN/MAX_LOD來強制特定的mip級別。

+0

謝謝,我試過MIN/MAX_LOD選項,但再次沒有效果。但我注意到,glTexSubImage2D()不支持mipmapping。我已將其更改爲glTexImage2D()調用,並遵循有關自動生成mipmap的建議。仍然沒有成功,沒有視覺差異,像素仍然閃爍。我的驅動程序支持OpenGL2.1,因此它應該可以工作。我很困惑,嘿嘿。 – Droozle 2010-05-26 10:15:22

1

除了透視距離外,Mipmapping還會補償場景比例。頂點着色器輸出(即使不使用自己的着色器,驅動程序仍將創建)指定每個頂點的屏幕空間座標以及這些頂點的紋理座標。 GPU將根據將要生成的片段的紋素與像素比例決定使用哪個mip級別。

當你渲染你的瓷磚時,你是否正在設置GL_LINEAR_MIPMAP_LINEAR?它只在渲染事物時很重要,而不是在創建/加載紋理時。您的括號glEnable/glDisable調用也可能需要移動,具體取決於您實際傳入的狀態。

+0

感謝您的回覆。我將glTexParamateri()調用移到gluBuild2DMipmaps()的上方,甚至將它們添加到繪圖函數中。我也調用了glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST),但我仍然沒有看到任何區別。至少,感謝你,我現在明白OpenGL如何決定mipmap級別。 – Droozle 2010-05-26 08:27:26

+0

@Droozle:當你將glTexParameter移動到你的渲染代碼時,你是在glDraw *調用之前還是之後?它必須在之前。當你調用類似glTexParameter或glEnable的東西時,你正在gl驅動中設置一個狀態。司機會記住這些狀態,直到你將其設置爲別的東西。大多數這些狀態只有在您調用glDrawSomething的確切時刻才由驅動程序使用。 – Alan 2010-05-26 17:57:46

+0

感謝您的回覆。我知道OpenGL是一個狀態機,我認爲*我完成了本書的所有工作。在查看了至少20個不同的代碼示例之後,我現在已經放棄了它。也許這與我的紋理有一個alpha通道的事實有關,但到目前爲止我運氣不好。有點奇怪。 – Droozle 2010-06-08 13:10:01