土屋つかさの技術ブログは今か無しか

土屋つかさが主にプログラミングについて語るブログです。

「Unityシェーダープログラミングの教科書2 【反射モデル&テクスチャマップ編】」本文サンプル公開&BOOTHでPDF版頒布開始しました

BOOTHでの頒布開始しています。が、記事を書く時間的余裕が全然ない! もうしばらくお待ちを〜(2018/10/18)

Unityシェーダープログラミングの教科書2【反射モデル&テクスチャマップ編】(via BOOTH)
https://booth.pm/ja/items/1032141

 シェーダープログラミングにおいて自由な質感表現を実現するには、光源から放射された光が、物質の表面上にどのように反射して視点に到達するかを計算する必要があります。このような計算式を「反射モデル」と呼び、フォトリアル/トゥーンレンダリングにかかわらず、すべてのシェーダープログラミングの基礎となっています。
 本書では、反射モデルについてもっとも基本となるランバート反射モデルからはじめて、徐々により高度な物に進み、近年のAAAタイトルなどで採用されている物理ベースレンダリング(PBR)について解説します。それぞれの反射モデルについて、Unity上で動作するサンプルコードを用いて説明しています。
 また、より精細な描画をするためには、様々な種類のテクスチャマップについての理解が必要です。本書ではUnityにおけるテクスチャマップの仕組みについて解説しています。特に、プリミティブに凹凸表現を与える法線マップと、周囲の風景を映り込ませる環境マッピングについては、それぞれ章を分けて詳細に解説します。

訂正

 すみません、誤字脱字が沢山あるんですが、版下を更新しなおす時間を作れていません。
 大きな所として、P24のサンプルコードの記述が、本文解説と一致していない箇所があります。NdotLとVdotRが逆になってまして、正しくは以下になります(エネルギー保存則により、ひっくり返っていても結果は変わらない筈です)。

// フォンによるスペキュラ近似式①
float3 R = -1 * lightDir + 2.0 * NdotL * normal;
// フォンによるスペキュラ近似式②
float VdotR = dot(viewDir, R);
float3 specularPower = pow(max(0, VdotR), 10.0);