關於opengl的紋理和調色盤問題

2021-08-01 23:50:15 字數 2216 閱讀 1178

最近碰到了一點問題,關於載入和顯示方面的。

1.壓縮紋理

簡單講一下,內部壓縮就是,原始檔並不是壓縮後的檔案,所以opengl需要通過第三方庫來載入檔案,生成的unsigned char陣列,這個陣列大小是:unsigned char的大小也就是1byte * 長 * 寬 * 通道數,然後使用glteximage2d這類命令將陣列傳到記憶體中並繫結乙個數字便於使用這個紋理。在這個過程中進行壓縮,壓縮後的現存占用最大可降低8倍。當然壓縮也是占用時間的。也會失去一些畫質。壓縮級別分3檔可以看需要壓縮。

我載入了1000張,大小都是350x350,四個通道,占用了700mb左右的視訊記憶體(不知道為什麼比計算的要大)。1/8壓縮後就成了:87.5mb,非常爽到!

載入壓縮紋理,就是事先壓縮好檔案成乙個dds檔案,可以壓的很小。怎麼做dds檔案找度娘吧。很多遊戲都使用這個檔案。opengl可以直接讀取這個檔案的資料到視訊記憶體,不需要第三方庫,直接用讀取txt檔案那樣的方法就可以,不需要壓縮解壓,耗時非常少。

如果你的遊戲有大量的紋理,不妨壓縮一下可以占用更小的資源,也可以使載入速度更快。

2.進一步降低記憶體占用

前面說到降低占用,那麼可不可以進一步降低占用呢?答案是可以的,以前的遊戲為什麼可以容量那麼低。我估計他們用的是256色的,也就是16位的。也就是說一張頂多擁有256種顏色。每種顏色用3個unsigned char來存,的大小就是256 * 3 + 長*寬 byte。

所以這樣的檔案分成2部分,顏色調色盤palette和顏色索引color index。

調色盤部分就是之前所說的256個顏色,256*3 byte。

顏色索引就對應上的每個畫素,不過他不用3個或4個unsigned char來存,他只用1個,就是 長 * 寬 byte。存的都是0-255,對應調色盤上的顏色。比24位小了3倍左右,比32位笑了4倍左右。

3.調色盤

我發現以前很多遊戲,比如格鬥遊戲都可以選擇2p角色顏色,也就是可以變色。而且這些遊戲占用又非常小。估計是進入遊戲後才把需要的載入到記憶體中。然後使用上面所說的256色貼圖方法。就可以切換顏色,甚至在遊戲中實時切換顏色。

那麼opengl要如何做到呢。

反正我的機子是不行,不支援這個東西。

有人問,那通過glgetteximage拷貝出紋理的資料,通過替換畫素來改變顏色再更新紋理行不行?

答案是可行,但這不是真正的調色盤功能,而且效率低下。

舉乙個例子,乙個角色的衣服和褲子都是黑色的,雖然都是黑色,但在調色盤裡不是乙個顏色。這樣就能載入不同的調色盤讓2p角色的衣服和褲子變成不同的顏色。如果按照剛才說的替換顏色的方法來的話,就無法做到這一點。除非把2個黑色弄得接近但不是同乙個顏色。

況且2個相同的角色在畫面上,用的是同乙個紋理,那麼把2p的顏色替換了,1p也會被替換。除非2p複製一套新的相同的紋理,再把顏色都替換掉。似乎不是很有效率。

結果只能依靠glsl了。

以下是glsl**供參考。

uniform sampler1d palette;             // 乙個調色盤有256個顏色

uniform sampler2d indexedcolortexture; // 乙個紋理中存的是顏色索引

varying vec2 texcoord0; // uvs

void main()

用glteximage1d(gl_texture_1d, 0, gl_rgba, 256, 0, gl_bgra, gl_unsigned_byte, pal);

載入調色盤給palette。

這裡用了gl_rgba,也就是說比檔案裡的rgb調色盤多了乙個通道,所以data要分配256*4的大小。當然不想要alpha通道也可以。

用glteximage2d(gl_texture_2d, 0, gl_red, m_width, m_height, 0, gl_red, gl_unsigned_byte, colorindex);

載入索引給indexedcolortexture。

和一般載入不一樣,這裡只用了乙個gl_red通道,因為我們每個畫素只需要存0-255的資料就行了。

想要更新調色盤的話,用更新紋理乙個方法。

這樣乙個紋理對應乙個調色盤。就可以現實了。至於效率怎麼樣,雖然我還沒測試過,應該比用迴圈來替換顏色要快多了吧

因為我都是自學的,可能說得不夠好,**說的不對或者有什麼要補充的歡迎告訴我

完。

關於Image模組的調色盤

參考 首先與cv2讀取為narray格式不同,image讀到的是pil格式,其中讀到的mode有如下 然後我們這裡談一下p 調色盤 模式,該模式下,讀到的是h w大小,每個位置的值是乙個索引,對映到其對應的調色盤上 一般地,調色盤長度為768 256 3,它是乙個列表,內容為256個rgb值不斷迴圈...

mfc調色盤和區域

1 mfc調色盤 cpalette 1.1 構造調色資料 typedef struct taglogpalette logpalette 1.2 建立調色盤 cpalette createpalette 1.3 將調色盤選擇到當前的dc中 cdc selectpalette 1.4 載入調色盤 cd...

QT調色盤QPalette類和時間QTime類

qpalette類 1 專門用於管理對話方塊的外觀顯示,每個控制項或視窗都包含乙個qpalette物件 2 有兩個基本概念 1 colorgroup 三種不同的狀態 qpalette active 獲得焦點的狀態 qpalette inactive 未獲得焦點的狀態 qpalette disable...