你可以看看模板緩存:
webgl.stencilFunc()
webgl.stencilOp()
不管有沒有threejs,其原理是一樣的。
- 禁用深度寫入
- 禁用深度測試
- 禁用顏色寫
- 使模版操作(寫入值模板緩衝區)
- 繪製寫入到模版緩衝器中的不可見的形狀(你可能想要一個屏幕空間四)
- 啓用1,2,3
- 更改模板操作(只繪製模板緩衝區爲1例如)
- 提請組
- 取決於當你這樣做時,你可以在此更改模板運
- ,然後繪製場景的其餘部分,其中緩衝區爲0(從外5中的形狀)
Three.js沒有模板抽象,除非它們最近已經實現。這意味着沒有「魔法」屬性transparent
管理一堆webgl狀態,你必須自己實際管理它。這意味着您必須手動獲取webgl上下文並對其執行webgl操作。
有很多方法可以做到這一點。
var myScreenSpaceQuad = new THREE.Mesh(new THREE.PlaneBufferGeometry(2,2,1,1), myQuadShaderMaterial)
var scene1 = new THREE.Scene()
var scene2 = new THREE.Scene()
var sceneMask = new THREE.Scene()
sceneMask.add(myScreenSpaceQuad)
//...
myRenderFunction(){
//gl stencil op
//...
myRenderer.render(myCamera, sceneMask)
//more stencil
//...
myRenderer.render(myCamera, scene1)
//some more stencil...
myRenderer.render(myCamera, scene2)
}
我會嘗試編寫一個工作示例。對於屏幕空間四分之一,你可以看看this。
目前還不清楚你的意思是「視口」。 – 2pha
@ 2pha我想要像HTML5塊溢出一樣的行爲:隱藏,但只適用於THREE.Group –
你將不得不更清楚地解釋你想要達到的目標。 – 2pha