給定一個世界上的切片平面,我希望看到三角形,如果它們在平面的正面,那些與平面相交的部分被分開,並且也可以看到正平面上的部分。如何渲染橫截面而不切片網格幾何?
如果我在每次更改平面時切片三角形,當有大量三角形時,它可能會非常緩慢,並且也會重新生成紋理座標。
如果我仔細設置攝像機(視圖)和投影,它可能會生成類似的結果,但是這個結果是視圖相關的。
那麼,有沒有渲染技術可以利用來自GPU的裁剪結果來渲染視圖的獨立截面?
這樣的橫截面:
給定一個世界上的切片平面,我希望看到三角形,如果它們在平面的正面,那些與平面相交的部分被分開,並且也可以看到正平面上的部分。如何渲染橫截面而不切片網格幾何?
如果我在每次更改平面時切片三角形,當有大量三角形時,它可能會非常緩慢,並且也會重新生成紋理座標。
如果我仔細設置攝像機(視圖)和投影,它可能會生成類似的結果,但是這個結果是視圖相關的。
那麼,有沒有渲染技術可以利用來自GPU的裁剪結果來渲染視圖的獨立截面?
這樣的橫截面:
使用着色器,這真的是很容易。在Opengl/GLSL你只需添加一個if
語句片段着色器確定您的片段是否在您的飛機的正確的一面,如果不是discard()
它。
這會根據你的狀況切斷你的物體,這樣你就會得到輪廓。然而,你仍然需要在第二遍或者使用模板緩衝區時從深度緩衝區以某種方式處理填充,但是這兩者都只是覆蓋整個屏幕的單個GL_QUAD
。
這樣做的數學很簡單,你需要定義你的一半空間。我能想到的最簡單的事情是:
p0=(x0,y0,z0)
- 三維點屬於切割平面 n0=(nx,ny,nz)
- 正常切削平面指向病房觀察側
所以任何片段p=(x,y,z)
是可見的,如果
dot_product(p-p0,n0) >= 0.0
所以
if (nx*(x-x0)+ny*(y-y0)+nz*(z-z0)<0.0f) discard();
不要忘記禁用GL_CULL_FACE
並使用雙面數學/照明。所有的座標也必須在同一個座標系統中!
這是非常簡單和優雅的想法,我要去測試它,謝謝。我想我應該在GPU着色器上開發一些技巧。 –