2012-02-29 43 views
2

我想用OpenGL使用FreeType繪製文字,並使其更清晰,我從FreeType爲每個mipmap迭代生成字體紋理。除了一件事以外,一切都很好。當我這樣做:如何讓OpenGL選擇最近的較大的mipmap?

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); 

的OpenGL根據文本的大小選擇最接近的紋理貼圖,但如果有尺寸爲16和32,我想22,它選擇16,使它看起來可怕。有沒有辦法設置它,以便它總是選擇最近的較大的mipmap?

我知道我能做到這一點的同時渲染設置手動的紋理貼圖級別的文本:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_LOD, (int) log2(1/scale)); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_LOD, (int) log2(1/scale)); 

但是,這是有效的?那種不需要完全使用mipmap?我可以製作不同的紋理,並根據尺寸選擇一種紋理。那麼有沒有更好的方法來實現這一點?

+0

「我想用OpenGL使用FreeType繪製文本,並使其更清晰,我從FreeType爲每個mipmap迭代生成字體紋理。」這不是一個好主意。 FreeType渲染較小文本的方式是* not *,這對於mipmap插值非常有效。這就是爲什麼你的GL_LINEAR_MIPMAP_LINEAR文本看起來很糟糕; FreeType的小文字提示使較小的文字看起來不對。最好是僅僅使用一組文本分辨率,然後使用它們。 – 2012-02-29 17:39:14

回答

2

你試過GL_LINEAR_MIPMAP_LINEAR作爲GL_TEXTURE_MIN_FILTER參數嗎?它應該混合兩個最近的mipmap。這可能會改善外觀。

此外,您可以嘗試使用texture_lod_bias擴展,記錄在這裏: http://www.opengl.org/registry/specs/EXT/texture_lod_bias.txt

+0

是的,我從GL_LINEAR_MIPMAP_LINEAR開始,但情況更糟糕(因爲不同大小的字母沒有對齊,所以出現了「鬼怪」)。 – Detheroc 2012-02-29 11:46:22

+0

當我編寫OpenGL位圖字體實用程序時,我只是堅持固定大小的輸出,例如16X24。因爲我每次都在一致縮放的正射投影(基本上寬度/高度等於視口大小)中繪製文本,所以它工作得很好。但是,如果你需要任意大小,texture_lod_bias值得一試。 – andrewmu 2012-02-29 11:54:00

2

您可以使用GL_TEXTURE_LOD_BIAS一個常數添加到紋理貼圖的水平,這可以幫助你做到這一點(例如,總是選擇下一個較高的mipmap級別)。但是,這可能僅僅是因爲mipmap-nearest對於這種情況並不理想。如果您始終在屏幕空間中顯示您的紋理,並確切知道字體大小如何與屏幕上的像素相對應,那麼對您來說,mipmapping可能會有太多機器。