1. 程式人生 > >WebGL+Threejs陰影與畫質提升,提…

WebGL+Threejs陰影與畫質提升,提…

最初提升的的畫質:

WebGL+Threejs陰影與畫質提升,提高影子解析度,Blender建模減少網格,增加邊緣判斷
圖一


提升之後的畫質(具體哪個面應該smooth渲染,哪個面應該flat渲染都能清晰標識):

WebGL+Threejs陰影與畫質提升,提高影子解析度,Blender建模減少網格,增加邊緣判斷
圖二

renderer.shadowMapType=THREE.PCFSoftShadowMap;

SoftShadow雖然能讓邊緣柔和,但只是基於畫素顆粒的邊緣柔和,在本身解析度低的陰影裡面幾乎沒有顯著的效果。最好的方法還是直接提升解析度。

開啟SoftShadow如圖一的效果,關閉SoftShadow後如圖三的效果:

WebGL+Threejs陰影與畫質提升,提高影子解析度,Blender建模減少網格,增加邊緣判斷
圖三

可以看到影子內少了很多紋路。於是提高影子解析度的方法還是這樣:
            spotLight.shadowMapHeight=2048;
            spotLight.shadowMapWidth=2048;

讓燈光的影子貼圖解析度提升(據說初始預設值是1024)

然後就是哪個面smooth渲染,哪個面flat渲染的問題。此處的模型使用Blender軟體製作的,本身有標記邊緣線以區分曲面還是折面的問題。但是發覺用auto smooth方法是不行的,得用EdgeSplit修改器:

WebGL+Threejs陰影與畫質提升,提高影子解析度,Blender建模減少網格,增加邊緣判斷
圖四


WebGL+Threejs陰影與畫質提升,提高影子解析度,Blender建模減少網格,增加邊緣判斷
圖五:Auto Smooth方法只能在blender裡看到效果,匯出js檔案後Threejs+WebGL渲染不出效果

有了EdgeSplit,我們就不用費神得靠增加網格的辦法來提高渲染平面的flat感覺了,趕緊刪掉多餘的分割網格:

WebGL+Threejs陰影與畫質提升,提高影子解析度,Blender建模減少網格,增加邊緣判斷
圖六:簡直密集恐懼症的網格


WebGL+Threejs陰影與畫質提升,提高影子解析度,Blender建模減少網格,增加邊緣判斷
圖七:放大後還是很密集


WebGL+Threejs陰影與畫質提升,提高影子解析度,Blender建模減少網格,增加邊緣判斷
圖八:精簡多了。

網格不能全部刪除,由於在平面上打洞了,所以得留些線以符合3D描述,尤其是連線到洞的線,如圖八里面的斜線。