2018年4月30日 星期一

ShadowMap的心得

ShadowMap的心得

前言

  最近剛完成ShadowMap,這邊把製作的的過程和一些心得在此做個紀錄。

內容

  ShadowMap的基本原理是以光源的位置為基準繪製一張深度貼圖,而光源分為DirectionalLight與PointLight,DirectionalLight的實作會需要一個光源位置與方向,並且用一個OrthogonalMatrix來決定可視範圍與可視深度,來繪製深度貼圖,PointLight的作法則一樣需要位置,再來透過6個PrespectiveMatrix來分別繪製到CubeMap,所以一個物件要繪製6次,由於這樣會有相當高的繪製成本,所以通常使用DirectionalLight的ShadowMap。
 
 DirectionalLight的ShadowMap示意圖
  在繪製好深度貼圖後,接著要在繪製影子的Shader中參照深度貼圖,這部分本以為很困難,但實作後比想像種簡單一些,以下以DirectionalLight的ShadowMap來解說,實作時需要一個矩陣來完成投射,這個矩陣是以光源與方向來合成ViewMatrix,在來是之前使用來畫深度貼圖的OrthogonalMatrix來作為ProjectionMatrix,最後會需要一個空間轉換的矩陣,這個矩陣會將-1~+1的數值空間(繪圖buffer的數值空間)轉換成0~1空間(UV的數值空間),將這3個矩陣合成後,在VertexShader將所有vertex乘上這個矩陣後,再傳送到PixelShader,這樣就可以得到該Pixel參照到ShadowMap的深度,如果該Pixel的深度值比ShadowMap的深度還深究表示被遮蔽了,相反的狀況則表示沒被遮蔽。
參照ShadowMap的示意圖

後記

  本篇只講了基礎,如果只是照著實作會碰到一些問題,而這些問題就等下一篇在解釋。


參考資料

Tutorial 16 : Shadow mapping

沒有留言:

張貼留言