1,先獲得kinect的深度資料,原始資料並不是一張圖,而是乙個陣列,我們需要將此陣列轉成二維陣列,方便使用著色器計算,專業術語應該是gpgpu:
此段**意思為,先建立乙個computebuffer,用來儲存kinect獲取的深度資料,然後傳入乙個材質球的shader中。
m_computebuffer = new computebuffer(m_depthmaplimitwidth * m_depthmaplimitheight, sizeof(float));
void updatedepthmap()
m_depthmapbuffer[curindex] = m_depthmapbuffer[curindex]*0.8f + ushortres[i]*0.2f;
++curindex;}}
mapmanager.single.updatedepthdata(m_depthmapbuffer);
m_computebuffer.setdata(m_depthmapbuffer);
m_depthblendtexturemat.setbuffer("_depthbuffer", m_computebuffer);//這個材質球在下面會做說明
}這個材質球的shader等下再講,先定義了六個深度值分別對應六張圖,也就是說kinect獲取了深度值,當該深度值等於對應的值得時候就顯示對應上的畫素,當該深度值處於兩張圖的中間,就取兩張圖根據深度差距做紋理的混合。
3,重點來了,上面的工作完成後,意味著,我們已經將kinect獲取的深度資料完美地傳入了shader,並且6張紋理也已經傳進去,一切準備就緒,我們來看看shader是怎麼工作的:
shader "lj/depthblendtexture"
_blendtex1("texture", 2d) = "white" {}
_blendtex2("texture", 2d) = "white" {}
_blendtex3("texture", 2d) = "white" {}
_blendtex4("texture", 2d) = "white" {}
_blendtex5("texture", 2d) = "white" {}
_color ("color", color) = (1,1,1,1)
}subshader
pass
;uniform float _depthvalue0;
uniform float _depthvalue1;
uniform float _depthvalue2;
uniform float _depthvalue3;
uniform float _depthvalue4;
uniform float _depthvalue5;
uniform float _uvanimationoffsetx;
uniform int _depthmapwidth;
uniform int _depthmapheight;
uniform float _clouddepthflag_min;
uniform float _clouddepthflag_max;
structuredbuffer_depthbuffer;
fixed4 frag (v2f i) : sv_target
//_depthvalue1為樹林紋理的深度值,如果depthvalue 大於雪山,小於樹林,則取雪山和樹林的紋理間插值計算出混合的紋理,以下以此類推,不一一說明
else if (depthvalue < _depthvalue1)
else if (depthvalue < _depthvalue2)
else if (depthvalue < _depthvalue3)
else if (depthvalue < _depthvalue4)
else if (depthvalue < _depthvalue5)
else
//將深度值大於海洋或者小於天空的當前畫素顏色設定為黑色
if(depthvalue > _clouddepthflag_min && depthvalue < _clouddepthflag_max)
return blendcol;
}endcg}}
fallback "diffuse"
}2,我們需要定義深度值所對應的紋理,我們這個專案準備了6張圖
在片元著色器中獲取了6張上面說過的紋理畫素顏色,float depthvalue = _depthbuffer[_depthmapwidth* y + x];這一句就是kinect獲取在此uv座標下的深度值了,然後就是根據這個深度值處於哪兩張紋理之間取得插值。
遊戲程式設計模式 子類沙盒
使用基類提供的操作集合來定義子類中的行為。遊戲引擎的每個部分都將與這些類產生耦合 當這些外部系統需要改變時,superpower類的 很可能遭到隨機性的破壞。因為我們的superpower類與外部 存在很強的耦合關係或者說依賴關係,一旦外部系統發生改變,不可避免的會影響到superpower類 定義...
2015061708 波斯王子遺忘之沙遊戲志
波斯王子遺忘之沙是我大學畢業後買的遊戲光碟遊戲 經典的 act動作類遊戲.從最初的磕磕碰碰不斷地輪迴重生 到現在從開始到結束死亡次數非常之低.從最開始的非常笨地遊戲 到現在非常熟練地從開始打到結束 再次給我的警示就是有恆心有毅力 對於像我一般的普通人而言絕大多數的事情都可以辦到.這個過程中唯一需要的...
Unity 遊戲物件池ObjectPool
遊戲引擎 unity 版本 2019.4.6f1 2017版本以上均可 編譯平台 visual studio 2019 在開發過程中,很多時候會出現針對某一gameobject的頻繁建立與銷毀這類問題,從效能上認為這種行為是極度損耗的,為避免對效能的不必要損耗,出現遊戲物件池的優化解決方案。unit...