【Unity】シェーダを使ってオブジェクトを修正する

  • |
【Unity】シェーダを使ってオブジェクトを修正する
   

Unityでシェーダを触っているのですが、未だに良くわからないです。
今回はシェーダを使って色々なカスタマイズやオブジェクトの元データの修正などを行っています。
実際に動くオブジェクトを見ると楽しいですね。

カスタムシェーダー

ライディング処理を自らカスタマイズをして行います。
「Lambert」でおまかせをしていた部分をスクリプトを書いて処理をします。
#pragma surface surf Original

ライティング処理は、 Lighting(名前)()を使います。

// 戻り値はhalf4型
half4 LightingOriginal(SurfaceOutput s, half3 lightDir, half attend){
   return (half4)hope;
}
ビュー方向を使用するか、しないかで使う関数が違うので注意。
half4という型がよくわからないのですが、調べてみるとint型、float型と同じスカラー型です。
スカラー型 (DirectX HLSL)

// SurfaceOutput : サーフェイスシェーダーの出力
// lightDir : 光源までの方向ベクトル
// viewDir : 視点
// attrn : ライトの減衰
half4 LightingOriginal(SurfaceOutput s, half3 lightDir, half3 viewDir,half atten){
    // 光源からの距離を出します。
    half diff = max(0,dot(s.Normal,lightDir));
    // 視点と光源ベクトルから光沢の位置を調整
	half spec = max(0,dot(s.Normal,normalize(lightDir + viewDir)));
    // プロパティで与えられた範囲を加味した値に調整
    spec = pow(spec, _Specular);
    // 透明になる範囲を指定(輪郭へ近づくほど不透明になる) + 光沢部分は除く
    half trans = 1.0 - max(0,dot(s.Normal,viewDir)) + spec;

    // 実際のライティングデータを作成
    half4 c;
    // サーフェイスシェーダで出力された色にライトの色(_LightColor0)の影響を掛け合わせる
    // 光沢もライトの色から計算
    // 最後に光の減衰を加味した色を出す。
	c.rgb = (s.Albedo * _LightColor0.rgb * diff + _LightColor0.rgb * spec/2) * (atten * 2);
    // 透明度
	c.a = trans;
    return c;
}

データの修正

シェーダーを使って、オブジェクトデータを修正することができます。
頂点データの修正 vertex関数を使って、頂点データを調整します。
// vertex関数を追加します。
#pragma surface surf Lambert vertex:vert

// vertex関数の中身を記載します。
void vert(inout appdata_full v) {
   // _Time.x : 時間の経過とともに変化をします。
  v.vertex.x += 0.05 * v.normal.x * sin((v.vertex.y + _Time.x * 3) * 3.14 * 8);
  v.vertex.z += 0.05 * v.normal.z * sin((v.vertex.y + _Time.x * 3) * 3.14 * 8);
}



色データを修正

色について加工ができます。
// finalcolor関数を使います。
#pragma surface surf Lambert finalcolor:changeColor

// オブジェクトの法線ベクトルを使って、色を変化させます。
// 法線ベクトルが上を向いているにしたがって緑に、下に向いている場合は赤に。
void changeColor(Input IN, SurfaceOutput o, inout fixed4 color) {
   float r = max(0,dot(float3(0.0,0.0,-1.0),o.Normal));
   float g = max(0,dot(float3(0.0,1.0,0.0),o.Normal));
     float b = max(0,dot(float3(0.0,-1.0,0.0),o.Normal));
	 color += float4(r,g,b,1.0) * 0.5;
}

頂点・色を修正する

頂点と色を同時に修正をすることもできます。
// 2つ続ける
#pragma surface surf Lambert finalcolor:changeColor vertex:myVertex

その他

プラットフォーム差異のヘルパー。
void myVertex(inout appdata_full v, out Input data) {
    // 0に初期化する
    UNITY_INITIALIZE_OUTPUT(Input, data);
}



Unity 5 実践シェーダプログラミング入門 [改訂第一版]Unity 5 実践シェーダプログラミング入門 [改訂第一版]
高橋 潤

売り上げランキング : 7746

Amazonで詳しく見る

Related Posts Plugin for WordPress, Blogger...