視差對映 Parallax Mapping

2021-09-30 17:34:56 字數 1196 閱讀 1975

這種技術和法線貼圖結合使用,可以給物體表面增加驚人的細節,這邊只談實現上的注意點。

首先是最簡單的一種,一般不會採用的那種,但用來理解最核心的思想是極好的。

(視差對映在實現時,通常採用的是深度圖而非高度圖,儲存的資訊是當前畫素凹下去的程度)

如圖所示,a點即是當前片元著色器正在處理的片元位置。如果不應用任何視差對映技術,則此時應該用a的uv值去相關貼圖裡取樣。但,現在為了體現這個點的位置凹下去了,則我們實際應該用b點的uv去取樣。

這就是視差對映要做的全部,根據a點的深度和相關已知的資訊,求出b點的uv

最簡單的方式,就是最直觀的方式,直接在v的方向上以a為起點,用a點的深度值長度去偏移(取樣到的深度值可以再除以z來根據視線和法線的夾角拉長這個值,這樣可以避免一些奇怪的問題,但這不是重點),然後用p`的xy值當作uv的偏移值就能求出乙個近似的結果,圖中深紅色的點。這個實現方式,很明顯有很大的漏洞,只能在起伏比較平緩的表面才有好的效果。

在講下一種實現方式前,還有乙個問題要說明。為什麼p`的xy值能當作uv偏移直接使用? 在世界座標系下,這只在平面是平的時候有效,一但平面有所旋轉,明顯就是不對的。所以這些計算都需要在切線空間下進行,這樣p`的xy永遠和uv座標軸對齊。(所以在頂點著色器中,你需要提前準備好所有在切線空間下的資料)

首先提前定義好將要分的層數,層數越高,精度越高。

他採用的方法是,從t0點開始 一次只移動一層深度對應的偏移值,直到某一次取樣到的深度值比當前層數的深度值低(乙個在紫點上的藍點),此時,這個點就被當作迭代最終的結果。

精度完全取決於你分了多少層,但還是有乙個方法可以優化,通常只有在視線和平面角度很小的時候才需要很高的層數精度。

所以可以用視線和t0法線(0,0,1)的夾角cos值來調整層數的多少。

和第二種方法類似,區別在於,這種方法在得到最後的迭代結果時,會和上一步的結果做差值。

差值的權重通過圖中兩段粉色的線段的比值就可以計算出來。

很明顯,這個方法得到的結果是最精確的

ParallaxNode視差節點

void addchild cocos2d node child,intz,const cocos2d vec2 llaxratio,const cocos2d vec2 positionoffset z z軸順序 parallaxratio 視差的移動速率 positionoffset 子節點位置...

視差滾動效果

確實,早期大部分視差滾動效果基本上就是如此,滾動事件是前提,然後要麼是直接改變位置,要麼如果是使用了背景,則改變背景的background position,不過實際上這種方法是存在缺陷的。監聽滾動事件,要想做到盡可能地流暢渲染效果,就不可以讓滾動事件 節流防抖動 throttle debounce...

滾動視差 01

先看一下示例展示第四屏的效果 思路 視差滾動到相應的容器時,讓背景固定不動,等滑到某個高度時恢復正常滾動,這裡是用兩張相同的做交替覆蓋,由於相同,因此看不出變化,從而達到一定的滾動視差效果,當然滾動視差效果有很多態別,這只是其中的一種方式,而且還沒有達到像示例展示那裡的效果,還需要對背景進行一定的優...