2010-02-05 82 views
2

我試圖找出選擇使用着色器呈現信息的最佳方法。 窗口管理器緩衝區(窗口)用於輸出渲染。在用戶事件中,我應該選擇渲染的幾何圖形。使用gluPick很容易,但我試圖選擇僅使用着色器。採用OpenGL着色語言

着色器的靈活性不會幫助我找到正確的解決方案。我找到了以下解決方案:

  • 使用系統提供的緩衝區(實際上使用顏色)進行渲染。使用glScissor限制某個區域的渲染,並使用glReadPixels提取顏色,並使用幾何標識符映射
  • 使用單獨的幀緩衝區對象進行渲染。渲染緩衝區格式需要定義。也許我可以用普通整數來放置名字嗎?
  • 使用幀緩衝區對象進行渲染,用於渲染和拾取。包含渲染名稱的額外渲染緩衝區對象。

看來,第二種解決方案是最好的,因爲不會改變窗口緩衝區,並且可以定義自定義方式來指定幾何名稱。

有什麼建議嗎?

PS:

由於在片段着色器我聲明vec4的陣列用於限定所述片段數據,如何我可以設置一個幀緩衝保持一個呈現只具有R成分緩衝器,存儲在尺寸整數內部格式?

是否有可能將片段着色器輸出變量與特定的附加渲染緩衝區鏈接起來?

回答

2

我不確定着色器在這裏是否真的有幫助,除非某種形式的優化可以渲染到多個目標,從而能夠一次生成拾取值和顏色值。

如果你正在使用光柵化進行拾取,你總是會被glReadPixels()調用或等價的卡住,你總是基本上將你的場景繪製到某種類型的緩衝區中, 。

如果您真的想要創造出與衆不同的標準,您可以嘗試使用着色器與場景中的形狀執行光線交叉。這需要一些專門的着色​​器開發,除非你做了很多選擇(可能是光線追蹤器),否則很難看到好處。

+0

如果有人對研究GPU射線交集感興趣,實際上有一篇關於它聲稱該方法爲「2」的[論文](http://www.hindawi.com/journals/ijcgt/2009/730894/)到基於GPU的傳統拾取速度的14倍「。我還沒有嘗試過。 – Loomchild 2012-12-12 14:05:48