Specular

本物のページはこちら→specular

Specularとは?

物体に光が当たってピカッと光ってる部位のこと。
物体の表面にある角度から当たった光の反射したところ。いわゆるハイライト。
マットな質感のものはSpecularの値が低く、
ツヤツヤな質感のものはSpecularの値が高い。

まとめ

シェーディングモデル名 特徴
Phong 一般的
Blinn より精密
Cook Torrance 金属や布地に向いている

概要

solidsphere.png
  • 光源の一方向
  • 物体面の向き
  • 面の反射特性

そして、視線方向に応じて強度が変化する。
鏡面反射の計算にはフォンのモデルがよく用いられる。
この手法は、
視線と正反射方向のなす角度γに応じて鏡面反射による明るさIを決定する。
正反射方向に近づくほど反射光は強くなる
面を見る方向によって輝度が変化する。

(1)
\begin{align} I=W(\alpha)I_i \cos^n\gamma \end{align}
W(α)
鏡面反射率。通常は一定値(W(α)=Ks)が用いられる。
Ii
入射光の強さ。
n
ハイライトの特性を制御するパラメータ nを大きくしていくと、鈍い反射から鋭い反射になっていく。

ゴールはこの数式である。

(2)
\begin{align} max\{ \vec{r} \cdot \vec{n} ,0\}^{shininess}*specular_{light}*specular_{material} \end{align}

GLSLのコードで表現するとこうなる

vec3 reflection = normalize(lightpos+viewvec);//正反射方向ベクトル
float specularLight=pow(max(dot(reflection,normal),0),shininess);

鏡面反射項は
光が頂点に直接当たるか、そうでないかによって決まる。
もし
光の方向ベクトル・法線の内積
が0以下だったら、
鏡面反射は発生しない。
もし光の方向ベクトル・法線の内積が負の値だった場合、
それは光が面の裏側にあることを意味する。
光の方向ベクトル・法線の内積が0以下じゃないという前提で次に、鏡面反射光の計算の仕方を説明する

正反射方向ベクトルの計算

理科の授業を思い出してほしい。
入射角と、反射角は同じだったよね?
だから、正反射方向ベクトルを求めるには

  • 光源と頂点を結ぶベクトル
  • 視線と頂点を結ぶベクトル

を足し算すればいい。


この、vertexとlightとeyeとreflectionを結ぶと、平行四辺形になりますね。
ここれいう頂点は、反射する点てこと。
正反射方向ベクトルを仮にsとする

(3)
\begin{align} s=\vec{L}+ \vec{V} \end{align}

そして、長さは特に意味をなさないので、正規化するのが普通。
GLSLのコードで書くとこうなる

vec3 reflection = normalize(lightpos+viewvec);//正反射方向ベクトル

この正反射方向こそ、ハイライトの方向なのである。
この正反射方向ベクトルはHalfway Vectorとも呼ばれている。
光源と観測者の中間方向だからである。(4)
\begin{align} max\{ \vec{r} \cdot \vec{n} ,0\}^{shininess}*specular_{light}*specular_{material} \end{align}

shininessとは鏡面反射指数である。

近似モデル

  • Phong illumination modelフォンのモデル….最も良く使用される
  • Blinn model for specular reflectionブリンのモデル…より精密
  • Cook-Torrance illumination modelクック・トランスのモデル…金属の鏡面反射に適している

Bibliography

サポートサイト Wikidot.com