ライトマップをベイクし終わってから OptiX Denoiser を適用する方法

Unity 2018 以前のバージョンのライトマッパーはデノイズに対応していないので何とかしよう、というお話。


この手法はライトマップに限らず、レンダリングした画像シーケンスにも使える。


※ 上：デノイズ後　下：デノイズ前
![](https://dl.dropbox.com/s/ap74jqta28kf8hl/OptixDenoiser_Comparison.PNG)




ライトマッパーにデノイザーが付いてる Unity 2019 以降のバージョンでも、デノイズを実行するにはもう一度ライトマップをベイクする必要があるので、デノイズの処理を分けて実行したい時にも有効（なハズ



### もくじ

- [OptiX Denoiser のダウンロード](#optix-denoiser-のダウンロード)
   - [Arnold 付属のデノイザー](#arnold-付属のデノイザー)
- [Windows 用バッチスクリプト](#windows-用バッチスクリプト)
   - [ダウンロード](#ダウンロード)
   - [使用方法](#使用方法)
- [フィルター設定の注意点](#フィルター設定の注意点)
- [おわりに](#おわりに)




## OptiX Denoiser のダウンロード

以下のリポジトリから OptiX デノイザの CLI ツールがダウンロードできる。


- [DeclanRussell/NvidiaAIDenoiser](https://github.com/DeclanRussell/NvidiaAIDenoiser)
   <iframe
      class="embed-card embed-webcard"
      scrolling="no"  frameborder="0"
      style="
         display: block;  border: none;
         margin: 10px 0px;
         width: 100%; height: 155px;
         max-width: 500px;
      "
      src="https://hatenablog-parts.com/embed?url=https://github.com/DeclanRussell/NvidiaAIDenoiser">
   </iframe>




上記のソフトを使用するには、対応する GeForce シリーズのグラボとドライバが（おそらく）必要なので用意しておく。



OptiX デノイザーについての詳細はこちら。


- [NVIDIA® OptiX™ AI-Accelerated Denoiser](https://developer.nvidia.com/optix-denoiser)
   <iframe
      class="embed-card embed-webcard"
      scrolling="no"  frameborder="0"
      style="
         display: block;  border: none;
         margin: 10px 0px;
         width: 100%; height: 155px;
         max-width: 500px;
      "
      src="https://hatenablog-parts.com/embed?url=https://developer.nvidia.com/optix-denoiser">
   </iframe>



### Arnold 付属のデノイザー

Solid Angle 製 Autodesk 販売の Arnold にも、レンダリング後にデノイズする Noice というツールが付属している。

Noice を使ってノイズを除去するにはカラー以外にも結構な数のレイヤーを要求されるので、Unity のライトマップをデノイズする用途では使えないが GUI も付いていて時間軸の補完もある。覚えていて損はない。


![Arnold Denoiser - Arnold for Maya User Guide - Arnold Renderer](https://dl.dropbox.com/s/b7k0ai931uwylnc/ArnoldDenoiser_Noice.png)


- [Arnold Denoiser - Arnold for Maya User Guide - Arnold Renderer](https://docs.arnoldrenderer.com/display/A5AFMUG/Arnold+Denoiser)
   <iframe
      class="embed-card embed-webcard"
      scrolling="no"  frameborder="0"
      style="
         display: block;  border: none;
         margin: 10px 0px;
         width: 100%; height: 155px;
         max-width: 500px;
      "
      src="https://hatenablog-parts.com/embed?url=https://docs.arnoldrenderer.com/display/A5AFMUG/Arnold+Denoiser">
   </iframe>






## Windows 用バッチスクリプト

OptiX Denoiser の CLI ツールの準備が済んだら、Unity でベイクしたライトマップに対してデノイズを適用する。

フォルダー内の画像に対して一括処理をする Windows 用バッチスクリプトと使用方法は以下の通り。


※ Unity のライトマップに適用する想定なので、「BeforeDenoise~」というサブフォルダにオリジナルファイルを移して、元のファイルと同名でデノイズ済みの画像を保存する。


※ `Normal（-n）` と `Albedo（-a）` の入力は無し。※ カラー画像だけでもデノイズは適用出来る。

- Normal と Albedo の入力がオプションなのは、面の向きが違う → 色の変化はノイズじゃない、って判定するための追加情報だからだと思うので、ライトマップフォルダにあるアルベド・ノーマルっぽい画像を渡せばいいだけのハズ。（必要なら）





### ダウンロード


以下のテキストを `好きなファイル名.bat` という拡張子付きの名前で保存する。



- [Batch Script for OptiX Denoiser CLI by @DeclanRussell](https://gist.github.com/sator-imaging/9f0aacc51d0817cf3879fb4221974feb)
   <iframe
      class="embed-card embed-webcard"
      scrolling="no"  frameborder="0"
      style="
         display: block;  border: none;
         margin: 10px 0px;
         width: 100%; height: 155px;
         max-width: 500px;
      "
      src="https://hatenablog-parts.com/embed?url=https://gist.github.com/sator-imaging/9f0aacc51d0817cf3879fb4221974feb">
   </iframe>




```batch
@echo off


::::::: SETTING :::::::

set DENOISER_EXE=C:\Path\To\OptiX Denoiser Standalone\Denoiser_v2.4\Denoiser.exe

set SRC_BACKUP_FOLDER=BeforeDenoise~
set SRC_BACKUP_PREFIX=



::::::: INPUT :::::::

if NOT EXIST "%~1" (
  echo.
  echo     No Directory Found. Drag ^& Drop Directory to Denoise.
  echo.
  timeout 10
  goto :EOF
)



set /p DENOISER_ARGS=Additional denoiser options [-h or any]: 

if "-h"=="%DENOISER_ARGS%" (
  echo.
  "%DENOISER_EXE%" -h
  echo.
  pause
  goto :EOF
)


set /p TARGET_EXT=Enter target file extension [png or any]: 

echo Target File Extension is set to: %TARGET_EXT%
echo.




::::::: MAIN :::::::

call :MAIN "%~dpn1"
echo.
pause
goto :EOF



:MAIN


  pushd "%~dpn1"
  if not 0==%ERRORLEVEL% (
    echo.
    echo     Not a Directory: %~dpnx1
    echo.
    ::timeout 10
    goto :EOF
  )

  mkdir "%SRC_BACKUP_FOLDER%"   2>nul




  for %%I in (*.%TARGET_EXT%) do (
    echo.
    echo Denoising...: %%~nxI

    if NOT EXIST "%~dpn1\%SRC_BACKUP_FOLDER%\%SRC_BACKUP_PREFIX%%%~nI.%TARGET_EXT%" (
      copy /-Y "%%~nI.%TARGET_EXT%" "%~dpn1\%SRC_BACKUP_FOLDER%\%SRC_BACKUP_PREFIX%%%~nI.%TARGET_EXT%"
    ) else (
      echo         Original File exists... copy skipped.
    )

    "%DENOISER_EXE%" %DENOISER_ARGS% -i "%~dpn1\%SRC_BACKUP_FOLDER%\%SRC_BACKUP_PREFIX%%%~nI.%TARGET_EXT%" -o "%%~nI.%TARGET_EXT%"
  )
```





### 使用方法


保存した `.bat` ファイルにフォルダーをドラッグ＆ドロップすると入力待ちのウインドウが表示されるので、追加のフラグと拡張子（例：`exr` ※ドットは無し）を入力して実行。


※ オプションに `-h` を入力すればヘルプが見られる。
![](https://dl.dropbox.com/s/1k12tnevn2yjqd5/OptixDenoiser_Batch_Begin.png)






## フィルター設定の注意点


デノイザを使って満足な結果を得るためには、Unity のライトマッパーのフィルターをオフにしておく必要がある。

Filtering を Auto（Gaussian）に設定してベイクした以下のようなライトマップは、デノイザーで処理してもほぼ変化は期待できない。

必ず Unity のフィルターは「None」に設定してライトマップを焼きこむ必要がある。


※ カメラで撮影した時のピンボケ部分は丁度こんな印象なので、デノイザも調整しないのだと思われる。
<img src="https://dl.dropbox.com/s/d90cql6cj1s6n24/OptixDenoiser_1024px_Filtering-Auto.png" />



## おわりに



Denoise は Denoize って入力しがちですね。


以上です。お疲れさまでした。