OSG 渲染(3) 動態剖切的實現方法
阿新 • • 發佈:2018-11-03
在CAD工程軟體裡,很多時候需要動態剖切模型來檢視模型截面情況。我們知道OpenGL 固定管線支援使用者自定義剖面,且最多支援6個剖平面,OpenGL3.0 以後的版本雖然已經逐步廢棄固定管線,但我們可以使用shader,並傳遞截平面方程引數給shader,使用discard 語句實現類似固定管線使用者自定義截面的效果。
下面將介紹如何實現上圖動態剖切且加蓋的效果,也將說明存在哪些技術難點。
一般方法:
原理:開啟模版測試,並將模版快取清零操作,然後禁用深度測試,禁用剔除,繪製整個場景,同時模版快取中的值取反操作,最終在模版非零處填充顏色,就這麼簡單。
- 存在的問題
該方法依賴於原實體閉合性,如果場景中有開放實體(也就是未封閉的實體),這種方法就沒有用武之地了,得到的是錯誤結果。所以在場景渲染初始化模版緩衝區時,先要過濾掉自由曲面和開放實體。
這種方法雖然簡單有效,但如果我們要求剖面用被剖物件顏色填充,而不是全部由一種顏色填充,這種方法就無能為力,因為它是與視口和觀察方向相關的。
改進方法:
- 觀察方向無關的剖切
先在剖面方向上使用正交投影使用RTT用上述方法生成截面紋理;
將截面紋理應用到剖切平面上;
問題?
生成截面紋理時,深度測試如何配合剖面應用才能得到正確結果?
你應該可以想得到,如果在shader中丟棄截面背面片元,深度測試設定為GL_GREATER,就可以得到正確結果。