2015-01-07 64 views
0

在給定位置使用給定的網格,是否有一種快速且簡單的方法(使用vertexShader,fragmentShader或其他方法)從網格中識別/刪除所有面/未在相機屏幕上呈現的頂點(隱藏在其他臉部之後,視野之外等)?WebGL和/或Three.js:刪除非渲染的面

回答

2

如果你的意思刪除方面不使它們這是實現具有啓用backface culling(因爲它是默認情況下)。

的CPU

在檢測Backfaces如果你想從幾何本身刪除它們,你將需要遍歷臉和計算面法線和您的LOOKAT /攝像機的方向向量之間的dot product,然後組成新的幾何緩衝區,只包含點積爲正的面。

檢測閉塞面臨的CPU

檢測隱藏/閉塞面可以通過遍歷面和建築物使用的三角形的三個平面進行邊緣沿由遠裁剪距離LOOKAT矢量擠出,並使用上臉部翻轉的法線本身就是'前平面'。由此你會得到一個開放式棱鏡類型的形狀。然後使用體積(其技術上不是體積,因爲它未關閉)剔除其餘面的頂點,當所有面的頂點都位於所有平面中時(假設您的平面法線指向內部),所關注的面被遮擋並可以刪除。

即使在使用像Bounding Volume Hierarchy這樣的加速結構時,此也不是實時兼容

檢測閉塞面臨的GPU/CPU

上的另一種更容易和可能更快的方法是指定表示ID到每個面的獨特的顏色,使該幾何結構的幀緩衝器,迭代的像素數據,將色彩偏移回各自的ID並以這種方式構建可見面的列表。

更多信息

雖然其通常不包含在幾何級做了進一步的信息,請閱讀the wikipedia article on occlusion culling

+0

我更期待第二種選擇。我關心的是隱藏的面孔。在同一個網格上,如果一個臉部位於另一個臉部的「後面」,但是朝向相機,我認爲點積是正的,但臉不應該被渲染。是對的嗎? – Minichua

+0

是的你是對的,即使臉部不可見,點積也是正的。你想要什麼叫'閉塞剔除'。 我編輯了我的答案,並添加了兩種方法來檢測被遮擋的面孔以及有關該主題的更多信息的鏈接。但是,如果不知道你的用例,很難建議一個好的方法。 –

+0

我的情況是3D繪畫編輯器。在這個編輯器中,我需要能夠在網格上投影圖像。在Three.js中已經有投影的例子,但他們ü – Minichua