2012-06-21 19 views
0

我已經成功地裝彩車與值[0,1],而無需使用丟失過多精度:如何將3浮點(空間向量)打包爲4個字節(像素)?

byte packedVal = floatVal * 255.0f ; // [0,1] -> [0,255] 

然後,當我想解開packedVal回的浮動,我簡單地做

float unpacked = packedVal/255.0f ; // [0,255] -> [0,1] 

工作正常,只要浮標在0和1之間。

現在,這裏是真正的交易。我試圖將一個三維空間矢量(3 float組件)變成4個字節。我這樣做的原因是因爲我正在使用紋理來存儲這些向量,每個向量有1個像素。它應該是一個「法線貼圖」,(但不完全這樣,你就會明白爲什麼在跳轉後)

normal map

所以有,每個像素代表了3D空間向量。如果值非常紅,則法向矢量的方向大部分是+ x(向右)。

所以當然,法線是正常化的。所以他們不需要幅度(縮放)矢量。但我試圖存儲一個矢量任意幅度,每個像素1個矢量。因爲紋理具有組件(rgba),我想在w組件中存儲縮放矢量。

任何其他關於將任意大小的3個空間矢量打包成4個字節的像素顏色值(例如x,y,z每個大小的上限爲200左右)?

回答

0

在第四個組件中存儲大小聽起來非常合理。只要這個數量級是有限的,而不是完全隨意的。

如果你想你可以幅值的更靈活的範圍預先乘以(0.5,1.0]時存儲它,並且當你解壓通過POW(2相乘,W)。

的歸一化方向矢量
0

這種方法用於存儲高動態範圍圖像-RGBM編碼(M代表幅度),其中一個缺點是內插結果錯誤,所以你不能使用雙線性濾波來處理你的紋理。對於來自HDR編碼的其他選項:here is a small list of few most popular

相關問題