2012-01-30 94 views
4

使用的Android的OpenGL ES 1.1(HTC Desire的)...的Android的OpenGL ES 1.1:從模板緩衝區讀取

我在一般的問題是這樣的:在一個複雜的渲染

我有各種各樣的3D對象現場。我想檢查用戶是否點擊了特定的對象。該對象可能會部分隱藏,因此可能在場景中顯示爲幾乎任何形狀。如果用戶單擊場景中可見的部分對象,我只想讓對象「被選中」。這意味着我不能使用基於矢量的計算來計算物體相交,因爲這些計算不容易考慮物體的隱藏區域。

所以,我想出了一個主意...

我設置的模板緩存,使得無論對象是可見的模板緩衝區充滿了1S和其他地方的模板緩存爲0。當用戶點擊場景中的特定像素,我只需要檢查模板緩衝區,看它是否包含1或0,表示對象是否被點擊。

這在PC上完美運行,但在Android OpenGL ES 1.1上,似乎我無法使用glReadPixels()從模板緩衝區讀取,因爲GL_STENCIL_INDEX不受支持。

有誰知道是否有方法從模板緩衝區讀取此0/1?或者任何人都可以想出一個更好的算法來確定我的對象是否被點擊過?

非常感謝

回答

1

可以使用顏色緩衝區實現相同的算法。

創建一個FrameBuffer。將場景渲染到其中,但繪製每個對象的顏色不同。顏色不必與對象的實際顏色相同,因爲您在幀緩衝區中繪製的內容不是用於眼睛,而僅用於鼠標查找。繪製完整個場景後,使用glReadPixels讀取像素。當您從鼠標事件中獲得鼠標的座標時,請在像素圖中查找它們。您發現的顏色可以指向鼠標當前所在的對象。

使用模板緩衝區可能會更有效率,但將模板緩衝區讀入內存似乎不可能在OpenGL ES中使用。另一方面,這種方法的優點是你不像8位模板緩衝區那樣侷限於255個對象。

+0

可能值得注意的是,上述方法需要一點技巧,因爲在渲染緩衝區附件的紋理中(glReadPixel值應相應縮放),對於8位顏色值沒有默認支持。其他缺陷可能包括:glEnabled抖動和硬件供應商可能的一些實現怪癖(例如,某些視頻硬件在光柵化過程中可能不那麼精確)。有點晚了,但其他人可能會像我一樣查找這個答案。 – Rick77 2013-05-05 20:07:31