如何用純數(shù)學(xué)公式渲染木紋(SDF+PBR渲染流程)
起
????一是心血來潮,二是看看能不能脫離Texture Based渲染框架。最終結(jié)果:
????


????效果和一般PBR差不多,不過由于是computational的,木紋是真實連在一起的,也就是說內(nèi)部也有,可以隨意切開。而且我的SDF模型不管怎么造,都能保證沒有啥拉升或者不對齊問題。
承
參考ShaderToy,看鏈接:www.shadertoy.com/view/ldscDM?

????這個代碼可以看出用Computational Noise可以當(dāng)作木紋紋理。不過只有木紋顏色,沒有NormalMap,DisplacementMap之類的特性。核心代碼:
????
轉(zhuǎn)
轉(zhuǎn)1:優(yōu)化NoiseGen
????原版用了巨多sin,cos,實時跑,在全占屏情況下會卡。我參考鏈接的noise生成工具,減少wave數(shù)量,結(jié)果也能看。
????這個工具還挺方便的,設(shè)置好參數(shù),有可視化,能直接拷貝sin/cos組成的數(shù)量場和梯度場函數(shù)。鏈接: otaviogood.github.io/noisegen/
????

轉(zhuǎn)2:從數(shù)量場構(gòu)造“Computational NormalMap”
????前面說過,現(xiàn)在只有木紋的顏色。我想加上類似PBR流程中NormalMap的效果。觀察Wood Shader代碼,可以看出形成木紋的關(guān)鍵是float rings。它是一個3D數(shù)量場,如果我用它得到其梯度(法線),再和木板原先的normal混合一下,就能形成類似normalMap的效果。只不過這個“Computational NormalMap”更強,它是無限細(xì)節(jié)且空間連續(xù)的。
????

合
????最終效果還算滿意。不過細(xì)節(jié)確實不如那種4K貼圖的PBR木紋,倒也不是說純數(shù)學(xué)做不到,只是硬件跟不上罷了。而且說到底,大自然本身就是Math Based,哪種方式更加接近自然,其實很難說。
????

????下次把TextureBased木紋也整合到我的SDF渲染流程里,看看效果。
????