具有畫素級精度的模型精確點取

2021-08-15 09:00:34 字數 1594 閱讀 9861



遊戲引擎中,用滑鼠點取模型是乙個必需的功能,實現方法也有多種。主要可以分為兩類:分別在

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列印服務模型定製確實方便,私人定...