首頁 | 資訊 | 財經 | 公益 | 彩店 | 奇聞 | 速遞 | 前瞻 | 提點 | 網站相關 | 科技 | 熱點 | 關注 |
      今日視點:MME編寫入門(五)簡單光照模型 補充說明

      發稿時間:2023-03-15 16:38:52 來源: 嗶哩嗶哩

      在第四篇的簡單光照模型中,做了一個簡單的卡通著色器。對的,講的思路是馮氏著色的方法,但是最后做出來的實際上是卡通著色。

      原因很簡單,是因為像素著色器里 這一行的效果。


      (資料圖)

      什么是lerp?什么是saturate?為什么要 LightNormal*16+0.5?

      為了方便觀察,在這里放置一個球。球可以在PE里快速建出,記得隨便貼上個純色的貼圖,還有toon。放上簡單光照的fx效果,如圖。光照部分和陰影部分有較為明顯的二分。所以是非真實感渲染 (Non-Photorealistic Rendering) ,NPR。

      實際上把后面的*16+0.5刪掉就可以得到?真實感渲染(Photorealistic rendering)。

      為了看得更明顯,所以這里調整了一下強度和顏色。可以看到這種層層的漸變效果。真實渲染?旨在渲染真實感的畫面,而NPR則追求更加有藝術感的畫面效果。

      回到最開始的問題,什么是lerp?

      lerp函數,是經常用的插值函數。其意義是 lerp(a,b,w),計算 a + w*(b-a),在a和b之間插值,w表示權值,范圍0~1。

      為了看得更明顯,我們可以把前邊的MaterialToon改成float3(0,0,0),這樣就是黑色,與白色,進行插值。

      saturate函數,很好理解,saturate(x)將x的數值,截取在0-1之間。

      接下來我們更改一下LightNormal*16,從左到右依次是*32,*64。可以看到,邊緣的強烈分割。

      還有一個插值函數,smoothstep,作用和用法跟lerp一致,但兩者之間有一定的區別,這里不多贅述,因為用不到。可以借鑒學習https://blog.csdn.net/qq_41835314/article/details/128618789

      最后一個問題,為什么要?LightNormal*16+0.5?

      通過修改數值能夠有所體會,若想究其原理,需要拿出紙筆,動手算算或者思考一下。

      1.在球的光照亮面取一個點,邊緣上取一個點,暗面取一個點。

      2.用float LightNormal = dot(Normal,-LightDirection)

      分別算出LightNormal的正負,大小的排序。

      3.saturate(LightNormal*16+0.5),取得三者權重,然后分別插值。

      關于HLSL中的函數,這里就不搬運了,參考微軟官方文檔,或者參考https://blog.csdn.net/eloudy/article/details/71258367

      標簽:

      責任編輯:mb01

      網站首頁 | 關于我們 | 免責聲明 | 聯系我們

      生活晚報網版權所有

      Copyright @ 1999-2017 www.8x5.com.cn All Rights Reserved豫ICP備20022870號-23

      聯系郵箱:553 138 779@qq.com