UnlitShaderはじめにこんな感じで透過なし(テクスチャありなし)、透過あり(テクスチャありなし)の2種類のリムライトシェーダーをつくりたいとおもいます。こんな感じのをつくるリムライトシェーダーとは、後ろから光を当てた時に光が前側に回り込んで、前からみると輪郭部分が光っているように見えるやつのことです。以下のサイトにある古畑任三郎さんの写真がまさにそれです。普通のリムライトシェーダーまずは透過なしのリムライティングをつくりましょう。こんなかんじのやつです。普通のリムライト【シェーダープログラム】まずはさっそくシェーダーから書いてみましょう。Shaderでシェーダーを作ります。RimLightUnlitという名前で保存します。そのマテリアルをモデルにアタッチし、マテリアルの設定します。Color:オブジェクト自体の色RimColor:リムライトの色RimPower:リムライトの強さです。テクスチャなし_Colorを黒くしたりとかしてもすごいかっこよくていい感じになります。かっこいい【コードの解説】まず、リムライトを実装する考え方の説明です。オブジェクトの輪郭部分に当たる面の法線は視線ベクトルと垂直に交わります。輪郭から離れる、つまり中心にいくにつれて法線ベクトルと視線ベクトルは水平になっていきます。それを調べるには内積を使用します。法線ベクトルと視線ベクトルの内積を取ると、垂直部分が0になり、並行部分が1になります。このことを利用して、二つのベクトルが垂直に近い部分をエミッションを強くすることでリムライトを実現できます。視線ベクトルと法線ベクトルの角度そしてそれを利用しているのがfrag関数の中のこの部分です。i.normalDir));内積は並行ならば1もしくは-1、垂直ならば0になりますが垂直のときにrimの値が1になるようにしたいので、1.0から内積の値を引いています。マイナス値もあるので、absで絶対値にして整数値で求めています。ここで求まったrimの係数を_RimColor.rgbに掛けることで輪郭に近くなるごとに_RimColorの色になっていくわけです。emission;順番が前後しますが、ここで使用している肝心のviewDirとnormalDirを計算しているのはvert関数内のここです。v.vertex).xyz);法線ベクトルは法線をワールド座標空間に変換したものを正規化することで出しています。視線ベクトルはカメラのポジションから、モデルの座標と頂点を行列変換(mul関数)したものを引いて正規化することで出しています。透明なリムライティングホログラムっぽい感じをだしたいときは透明なリムライトシェーダーがGoodです。Shaderでシェーダーを作ります。RimLightUnlitTransparentという名前で保存します。そのマテリアルをモデルにアタッチし、マテリアルの設定します。テクスチャありテクスチャなし【コードの解説】リムライト部分は先ほどのと同じです。そこから透明にするためにアルファ値の設定をしています。1.0);行っていることは先ほどのrimの計算と同じで、法線ベクトルと視線ベクトルの内積を求めています。それをアルファに入れて係数を掛けているわけですが、clamp()としているのはalphaの値が0になったときに全てが透明になってしまって何も見えなくなってしまうので、0.1から1.0の値に納めています。clamp関数は値を指定した範囲の中に納まるように変換してくれる関数です。はてなブログProアイドルになりたいと思いながら死んだ顔で仕事をするプログラマー。めーぷるしろっぷをちょんちょんしています。LSDJについての記事を書きます。(1)リンクはてなブログブログをはじめる週刊はてなブログはてなブログPro引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。