最近在做GPU刷草插件的迭代,其中地表高度信息在預(yù)烘焙時(shí)由采樣器采樣得到湖蜕,數(shù)據(jù)是經(jīng)過歸一化處理的二維浮點(diǎn)數(shù)組 float[,]
权埠。我的做法是將這些原始數(shù)據(jù)先轉(zhuǎn)化為Texture2D格式的紋理:
public static Texture2D GetTextureByArrayData(float[,] raw, int len, TextureFormat format)
{
var heightmapData = new Color[len * len];
int index = 0;
for (int i = 0; i < len; ++i)
{
for (int j = 0; j < len; ++j)
{
heightmapData[index++] = new Color(raw[i, j], 0, 0, 0);
}
}
var tex = new Texture2D(len, len, format, true, true);
tex.SetPixels(heightmapData, 0);
tex.Apply();
return tex;
}
此時(shí)將紋理渲染出來可以得到期望的結(jié)果:
然后為了獲得最快的運(yùn)行時(shí)讀取和加載速度,我把紋理的原始字節(jié)流無編碼的存到本地磁盤:
File.WriteAllBytes($"{path}{name}", tex.GetRawTextureData());
最后在運(yùn)行時(shí)動(dòng)態(tài)的讀入字節(jié)流眶蕉,從新封裝成ReadOnly模式的Texture2D紋理:
public static Texture2D LoadTex2DFromRawData(IAssetLoader aLoader, string aPath, int aFileSize, int aTexSize, TextureFormat aTexFormat, FilterMode aFilterMode, bool aNeedMip = false, bool aReadOnly = true)
{
var rawData = aLoader.LoadFileContentNativeBytes(aPath, aFileSize);
if (rawData.Length <= 0)
{
Log.Info($"load rawData from file failed, path:{aPath}");
return null;
}
bool needLiner = true;
if (aFilterMode == FilterMode.Point)
needLiner = false;
var tex2D = new Texture2D(aTexSize, aTexSize, aTexFormat, aNeedMip, needLiner);
tex2D.filterMode = aFilterMode;
tex2D.LoadRawTextureData(rawData);
tex2D.Apply(aNeedMip, aReadOnly);
rawData.Dispose();
return tex2D;
}
然而將重新生成的紋理渲染出來顯示填帽,結(jié)果產(chǎn)生了異變:
仔細(xì)排查后并沒有發(fā)現(xiàn)語法層面有任何問題蛛淋,也沒有發(fā)現(xiàn)什么設(shè)置能夠?qū)е聢D像發(fā)送如此變形。一些列未果的嘗試后篡腌,我又回到了問題的本源:前后2張圖片的差異倒地在哪兒褐荷?對比后發(fā)現(xiàn),變形圖片從上到下每一行對比原始圖片哀蘑,似乎少了1個(gè)像素诚卸,而且誤差是累加的葵第,從而導(dǎo)致變形圖片只有最上面第一行和原始結(jié)果相一致绘迁,越向中間延伸,誤差越大卒密,圖像錯(cuò)位越多缀台,然后隨著累積誤差越接近一整行,這種視覺上的錯(cuò)位反而減少哮奇,最終在最后一行又回歸“正確”膛腐。
依據(jù)這個(gè)發(fā)現(xiàn)很快發(fā)現(xiàn)了問題點(diǎn):2張圖的分辨率不同睛约。
原始圖像是覆蓋256m見方地塊的高度圖,分辨率是257 X 257
哲身,而新轉(zhuǎn)換出來的圖片使用了錯(cuò)誤的256 X 256
的分辨率辩涝,由于是從原始大小為66049
字節(jié)中重建一張 65535
大小的圖像,Unity的Texture2D在執(zhí)行LoadRawTextureData(bytes)
時(shí)可見是按照行分辨率大小逐行填充勘天,從而導(dǎo)致正確信息被提前被截?cái)嗾a(chǎn)生如圖的錯(cuò)位。