反射與折射的效果我們可以參照之前vulkan_shader—環境對映天空盒檢視,之前也有簡述過兩者原理,今天除了上述兩種效果外,我們主要來看一下色散的效果:
,在此之前我們首先來簡單的回顧一下反射與折射,首先我們得理解立方體貼圖:
立方圖紋理是一種特殊的紋理對映技術,主要包括如下兩個要點。
從圖中可以看出,本案例中實現茶壺反射周圍環境的內容有兩項關鍵工作要做,具體如下所列。
vec3 cr = reflect (ci,
normalize
(innormal));
//反射
執行效果如下:
現實世界中很多場合都會有這樣的情況,透過透明物體觀察周圍的環境時會有折射的現象。平時使用的很多光學裝置利用的就是光線的折射,例如放大鏡、眼鏡、望遠鏡、顯微鏡等。
上一部分反射的案例均採用立方體紋理技術,所不同的是本節中的取樣向量是視線經玻璃球表面折射後的向量,而不再是被表面反射後的向量。立方體紋理技術本身已經在上一節詳細介紹過,因此本節僅介紹採用立方圖紋理技術實現折射效果的原理,如下圖所示。
從圖中可以看出,本案例中為了實現玻璃球折射出周圍環境的內容也有兩項關鍵工作要做,具體如下所列。
vec3 cr =
refract
(ci,innormal,zsl)
;//折射
執行效果如下:
上一小節通過玻璃球實現放大鏡效果的案例介紹了折射效果的開發,讀者應該覺得案例的整體效果還是非常逼真的。但還有一點不夠真實的地方,那就是現實世界中不同顏色的光對於同一種材質的折射率是不完全相同的。因此,透過玻璃球觀察現實世界時會產生色散的效果。
色散的原因是不同顏色的光對於同一種材質的折射率不完全相同。這就是說一束由不同顏色的光組成的光線經過折射後,不同顏色的組成部分出射方向會有發散,形成彩虹一樣的效果,下圖很好地說明了這個問題。
因此,我們需要將rgb不同顏色的光分量以不同的折射係數單獨進行了折射計算。
//根據法向量、視線向量及斯涅爾定律計算立方圖紋理取樣的方法
vec4 refraction
(in float coefficient)
void
main()
Vulkan 片元著色器特效1 體積霧
我們在之前做過的案例 vulkan 動態地形細分 tessellation shader 本次特效也是基於此場景實現 中介紹過簡單的霧特效,通過它可以模擬很多現實世界中與霧 煙等相關的場景。但是簡單的霧特效也有一定的侷限性,如在實現山中煙霧繚繞的效果時就比較假。這是由 於簡單的霧特效沒有考慮到變化的...
頂點著色器與片元著色器
頂點著色器 在管線中的位置 1號 這圖作的跟病毒似的 可以替代下面這些傳統的操作 頂點變換 法線變化及規範化 紋理座標生成 紋理座標變換 光照彩色材質應用 頂點著色器可以用來指定一系列完全通用的 並將應用於各個頂點及相關資料上的操作。理解這點很重要。頂點著色器不會取代一次需要多個頂點的情況或者需要拓...
WebGL著色器discard捨棄片元
本文是webgl電子書的2.15節內容 discard關鍵字通常出現在片元著色器的if語句或for語句中,discard的使用語法就像for語句中的continue和break關鍵字一樣,直接編寫discard 即可,但是discard的功能比較特殊,專門用於著色器片元處理。如果想理解discard...