渲染輪廓線的5種方法
實現渲染輪廓的方法有很多。在《Real Time Rendering, third edition》一書中,作者把這些方法分成了5種類型:
- 基於觀察角度和表面法線的輪廓渲染。這種方法使用視角方向和表面法線的點乘結果來得到輪廓線的信息。這種方法簡單快速,可以在一個Pass中就得到渲染結果,但局限性很大,很多模型渲染出來的描邊效果都不儘如人意。
- 過程式幾何輪廓渲染。這種方法的核心是使用兩個Pass渲染。第一個Pass渲染背面的面片,並使用某些技術讓它的輪廓可見; 第二個Pass再正常渲染正面的面片。這種方法的優點在於快速有效,並且適用於絕大多數表面平滑的模型,但它的缺點是不適合類似於立方體這樣平整的模型。
- 基於圖像處理的輪廓線渲染。這種方法的優點在於,可以適用於任何種類的模型。但也有自身的局限所在,一些變化很小的值是無法被檢測出來的。
- 基於輪廓邊檢測的輪廓線渲染。上面提到的各種方法,一個最大的問題是,無法控制輪廓線的風格渲染。對於一些情況,我們希望可以渲染出獨特風格的輪廓線。為此,我們希望可以檢測出精確的輪廓邊,然後直接渲染它們。
- 混合上述的幾種渲染方法。
卡通渲染 + 輪廓渲染
<aside>
<img src="/icons/alien-pixel_gray.svg" alt="/icons/alien-pixel_gray.svg" width="40px" /> 可以將Shader用在Sphere上,更好理解
</aside>
扁平化和裁剪Front
書中有提到將z設置為-0.5,具體的原因可以參考作者早期的博客。其實簡單地理解就是拉伸輪廓時,z軸是可以忽略的,所以將其想像成在-0.5的平面中進行拉伸便可。至於為甚麼是-0.5,一來是因為在View Space下變為了右手座標,二來是為了防止輪廓的深度值太大,覆蓋掉物體。
至於Cull Front
的原因,是為了百分百保證輪廓不會遮擋到物體。
計算高光
該章節最難理解的就是高光的計算了。有