PBRマテリアルの異方性反射

2026-01-07

今まで異方性反射というのがなんなのか・必要性をあまり理解してなかったが、磨かれた金属といった質感表現に必要らしい。 以前PBRマテリアルを試したときはラフネスとメタリックだけしか扱わなかったが、追加してみた。

異方性反射

異方性反射がどういうものかはプリンシプルBSDFで異方性反射の使い方(1)/旋盤加工の作り方 - Blenderであそんでみたがわかりやすい。

実現方法はどうするのか調べてもなかなか要領をつかめなくて悩んだがなんのことはない、単に法線に直交する2方向を別々にスケールしてやればいいだけだった。 でその方向を指定する必要があるため、法線とは別に溝方向を指定する接ベクトルが必要になる。

マイクロファセットの凸凹が一様ではなく、溝と直交方向に偏っていることになる。

実装

ナイーブなパストレに組み込むにはimportanceSampleGGXでマイクロファセット法線をブラす際に考慮すればよい:

Vec importanceSampleGGXAniso(unsigned short *Xi, double Roughness, const Vec& N, double anisotropy, const Vec& T) {
double a = Roughness * Roughness, Phi = 2.0 * M_PI * erand48(Xi), xiy = erand48(Xi);
double CosTheta = sqrt((1.0 - xiy) / (1.0 + (a * a - 1.0) * xiy));
double SinTheta = sqrt(1.0 - CosTheta * CosTheta);

double aspect = sqrt(1.0 - anisotropy * 0.9); // <== 0.9で比率の上限を指定
Vec H = Vec(SinTheta * cos(Phi) / aspect, // <== アスペクト比によってスケール
SinTheta * sin(Phi) * aspect, // <== 逆数
CosTheta).norm();

Vec TangentX = (T % N).norm();
Vec TangentY = N % TangentX;
return TangentX * H.x + TangentY * H.y + N * H.z;
}
  • anisotropyパラメータで異方性の度合いを制御(0.0〜1.0)
    • aspect = sqrt(1.0 - anisotropy * 0.9)で計算し、xy方向をそれぞれ除算と乗算する
    • 0.9という係数によってxyの比率は10倍までとなる
    • 等方性の場合半球状の法線分布だったのに対して、異方性では半楕円体になる
    • 完全な円柱形も指定したい気もするがこの計算方法ではできない
  • 接ベクトルTで溝の方向を指定

結果

異方性反射

上段:異方性1.0でラフネス0.0→0.5、下段:ラフネス0.3で異方性0.0→1.0

リンク