遊戲引擎中,用滑鼠點取模型是乙個必需的功能,實現方法也有多種。主要可以分為兩類:分別在
cpu上和
gpu上實現。在
cpu上的實現比較簡單,可以使用攝像機到滑鼠位置組成的射線和模型的包圍盒求交。如果需要更加精確的點取,可以進一步和模型的三角形求交,但是這樣可能性能不高,因為需要和每乙個三角形進行相交計算(或許有更好的方法,只是筆者沒有研究過)。另外無法得到絕對精確的結果,因為有的模型是鏤空的材質(例如樹葉)。第二個方法在
gpu上實現,這也是筆者在此詳述的方法。下面以
d3d 9.0
的實現為例(
opengl
中大同小異,此外
opengl api
中提供了點取的功能),介紹實現步驟,大致如下:
一、準備工作
初始化時使用
idirect3ddevice9::createrendertarget
建立乙個和後台顏色緩衝區一樣大小,一樣的抗鋸齒等級且顏色格式是
d3dfmt_a8r8g8b8
的idirect3dsu***ce9
介面,建立乙個
1x1的表面,建立乙個位於系統記憶體的
1x1的紋理。
二、每一禎中
1、渲染正常的場景。
2、求出和射線相交的所有的模型。
3、將渲染目標切換成初始化時建立的表面,後台深度模板表面不變。
4、關閉深度寫入
,關閉抗鋸齒,負向偏移深度,分別渲染相交的模型。對於每乙個模型,賦予其乙個獨一無二的索引
dword
,即顏色(
d3d中的顏色使用
dword
表示,在記憶體中的排列順序是
a8r8g8b8
,正好和我們初始化時建立的表面格式一致。注意,這不是巧合,後面我們要用到)。例如第乙個模型的顏色是
0x00000001
,第二個是
0x00000001
,以此類推。如果使用浮點型別傳遞給
shader
時,分別是
float4(0,0,1/255,0)
,float4(0,0,2/255,0)
,等等。每個模型的所有畫素輸出都是其被賦予的顏色值。為了提公升效率,只用清除和渲染滑鼠附近的幾個畫素。
5、使用
stretchrect
函式將滑鼠位置的畫素拷貝到
1x1的表面。
6、使用
idirect3ddevice9::getrendertargetdata
將1x1
的表面拷貝到
1x1的紋理中。
7、使用
idirect3dtexture9
介面的鎖定函式,讀取
1x1的紋理中的資料,轉換成
dword
,作為模型的索引值。
注意,cpu
和gpu
是非同步工作的,也就是說在這一幀中
cpu向
gpu傳送的渲染命令,很可能在下一幀或者下下一幀的時間才能看到,所以步驟6和
7需要移到3和
4步之間執行。這裡的順序只是為了理解上的方便。
如果有描述不詳或者讀者有更好的方法,希望不吝賜教。
畫素級碰撞的一種演算法
在 flash 中,任何形狀的元件都是被包含在乙個完整的矩形容器裡的,此碰撞演算法就是根據這一點來獲取兩個不規則形狀的交集,這麼說可能你聽起來有些不明白,我們來進一步解釋一下。假如我們這裡有兩個不規則形狀的 mc 即 mc1 和 mc2 如下圖 為了更方便於的理解,我將形狀做在的容器 mc1 和 m...
具有預先訓練模型的AI人臉識別
目錄介紹 為什麼要使用別人的cnn?實現vgg16 應用於yale資料集 下一步?如果您看過 少數派報告 電影,您可能還記得湯姆 克魯斯 tom cruise 走進一家 gap2020 年。我們不需要視網膜掃瞄器,因為我們擁有 人工智慧 ai 和機器學習 ml 在本系列中,我們將向您展示如何使用深度...
3d列印服務模型定製工業級手板高精度
宜昌3d列印服務模型定製工業級手板高精度 3d的時代確實乙個奇妙的世界,帶給眾人不一般的驚喜,從而生活都發生了變化,那麼3d列印究竟有何等的神秘奇妙,帶給人們挖掘乙個乙個的驚喜,就像冒險家 挖掘寶物過程中少不了刺激 驚訝 失望 驚喜等等不一的感情豐富。正如人們所想3d列印服務模型定製確實方便,私人定...