kinect沙池遊戲

2021-09-24 11:02:50 字數 2377 閱讀 3569

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...