2014-01-07 40 views
1

請不要告訴我使用24位紋理或類似的東西,因爲這是我的寵物項目,它需要支持1,4,8,16和32位紋理格式。如何在opengl中加載灰度4位每像素紋理?

現在,所有上述格式的工作,甚至1bpp,除了4位之一。我還應該提到使用的顏色是16灰度。此外,我使用的紋理都填充到4個字節。

因此,例如,讓說,我希望加載這個4×4紋理

BYTE Img[4][4] = { 
    {0xCD, 0xEF, 0x00, 0x00}, 
    {0x89, 0xAB, 0x00, 0x00}, 
    {0x45, 0x67, 0x00, 0x00}, 
    {0x01, 0x23, 0x00, 0x00}, 
}; 

每個半字節應代表紋元。 0x00用於填充目的。

我怎麼加載這樣的紋理?現在

,我tryed與

glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE4, 4, 4, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, pTex); 

但由於某些原因,它產生相同的結果與使用使用GL_LUMINANCE一個8位的紋理,我只在屏幕上看到一個2x4的紋理圖案,與其他一半黑色。

我也試過用glPixelMapfv,但我不能讓它工作,我得到的只是一個空白的紋理。

我希望我已經足夠清楚,如果不是,只是告訴我,我會做出更正。

+1

您需要以某種方式解碼,因此每個完整字節都是單個紋素 –

回答

2

GL_LUMINANCE4內部格式,即紋理數據將被存儲在OpenGL端的格式。但是,您想要指定每像素4位的外部數據格式來解包像素。這由格式類型確定,參數爲glTexImage格式在你的情況下是GL_LUMINANCE(在更高版本的OpenGL中,這將只是FYI的GL_RED)以及類型,很遺憾,必須告訴你,OpenGL中沒有每像素4位可用的解包類型。儘管可能有供應商特定的擴展。

你最好的行動方式是自己解壓成每像素8位格式然後上傳。這不是很難實現。