2013-10-18 85 views
2

我有很多簡單物體的3d場景(可能數量很多),所以我認爲使用光線追蹤來通過鼠標拾取物體並不是一個好主意。使用離屏渲染進行鼠標拾取?

我想要做這樣的事情:

  1. 渲染所有這些對象爲一些OpenGL的屏幕外的緩衝區,使用指針當前對象,而不是他的顏色

  2. 呈現相同場景到屏幕上,使用真實顏色

  3. 當用戶用(x,y)屏幕座標選取一個點時,我從屏幕外緩衝區(從相應位置)獲取該值,並有一個指向對象的指針

這可能嗎?如果是 - 我可以選擇「使用指針繪製」的緩衝區類型?

+0

他們是否移動(很多)?如果不是,那麼使用數據結構可以更好地快速找到您正在採摘的大致區域。通過這種方式,您可以輕鬆處理大量對象。另外請記住,如果您不使用鼠標選取每一幀,則可以輕鬆地對拾取進行多線程處理,並幾乎完全避免性能問題。 (用戶可能不在意點擊和選擇之間的延遲100ms) –

+0

光線跟蹤和光線投射之間存在巨大差異(性能明智)。這是光線投射的應用,當光線從多個表面反彈或通過不同材料時,您不會「追蹤」光線。使用空間分區數據結構(很可能,場景中已經有了這樣的數據結構)以加速初始光線投射(減少要測試的數據集),並且您應該很好。唯一一次你真的想要進行像素回讀,如果你需要像素完美的選擇,它會增加很多延遲。 –

回答

0

我想你可以渲染兩遍。首先選擇需要拾取的緩衝區或紋理數據,然後在第二步中顯示所顯示的數據。我不是很熟悉OGL,但是在DirectX中,您可以這樣做:http://www.two-kings.de/tutorials/dxgraphics/dxgraphics16.html。然後你可以找到一種分析紋理的方法。請記住,您正在渲染數據兩次,這不一定會使您的渲染時間加倍(因爲您不需要應用所有着色器和效果),它會增加很多。另外,對於每一幀,您基本上都會從GPU向CPU發送至少2MB數據(如果您在2K顯示器上爲每像素1byte),但如果屏幕上有超過256個對象,則可能會發生變化。

編輯:這是如何做到與OGL一樣,雖然我無法驗證該教程是正確的:http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-14-render-to-texture/(還有更多的,如果你環顧在谷歌)