Unityでシェーダを触っているのですが、未だに良くわからないです。 今回はシェーダを使って色々なカスタマイズやオブジェクトの元データの修正などを行っています。 実際に動くオブジェクトを見ると楽しいですね。
カスタムシェーダー
ライディング処理を自らカスタマイズをして行います。 「Lambert」でおまかせをしていた部分をスクリプトを書いて処理をします。 [c]
pragma surface surf Original
[/c]
ライティング処理は、 Lighting(名前)()を使います。
[c] // 戻り値はhalf4型 half4 LightingOriginal(SurfaceOutput s, half3 lightDir, half attend){ return (half4)hope; } [/c] ビュー方向を使用するか、しないかで使う関数が違うので注意。 half4という型がよくわからないのですが、調べてみるとint型、float型と同じスカラー型です。 スカラー型 (DirectX HLSL)
[c] // 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;
} [/c]
データの修正
シェーダーを使って、オブジェクトデータを修正することができます。 頂点データの修正 vertex関数を使って、頂点データを調整します。 [c] // 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*1; 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; } [/c]
頂点・色を修正する
頂点と色を同時に修正をすることもできます。 [c] // 2つ続ける
pragma surface surf Lambert finalcolor:changeColor vertex:myVertex
[/c]
その他 プラットフォーム差異のヘルパー。 [c] void myVertex(inout appdata_full v, out Input data) { // 0に初期化する UNITY_INITIALIZE_OUTPUT(Input, data); } [/c]
Unity 5 実践シェーダプログラミング入門 [改訂第一版] 高橋 潤 売り上げランキング : 7746 Amazonで詳しく見る |
*1: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); } [/c]
色データを修正
色について加工ができます。 [c] // 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