今のところシェーダーについて全然わからないので、とりあえず例題なりを実際に試してみてどのようなものなのか慣れる作戦でいきます。 とにかく、色々なことがシェーダーを使えばできそうです。 また、シェーダーをスクリプトで操作をできるようになれば、表現の幅が広がりそうな気がします。
ハイライトを出す
リムライティングと呼ばれるシェーダープログラミング。 [c] o.Albedo = _DiffuseColor; //half : 中程度の精度の浮動小数点数。通常 16 ビット、–60000 から+60000 まで十進数にして 3.3 桁の精度 //asturate:0以下は0,1以上は1にする。 //dot:内積 half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));
// pow:累乗した値 half rim2 = pow(rim,_RimWidth); half rim3; if(rim2 < 0.5) rim3 = 1.0;else rim3 = 0.0; o.Albedo *= rim3; [/c]
clip関数
指定された値が 0 より小さい場合に、現在のピクセルを破棄します。 これを使うと、一部の値を表示させなくすることができます。 [c] // frac は引数の値の小数点のみを取り出す。 // IN.worldPosはワールド座標 // clip関数は、マイナス値になると非表示となり、0以上で表示されるようになります。 clip(frac(IN.worldPos.y * 10) - 0.5); [/c] clip (DirectX HLSL) frac (DirectX HLSL)
キューブマップ反射
CubeMapをオブジェクトに貼り付けます。
CubeMapは環境マップと呼ばれています。
環境マップとはモデルの表面に周囲の背景等が映り込む様子を再現した物で、その手法その物やそれに必要なテクスチャの両方を指すようです。
[c] // プロパティ内 _Cube("CubeMap",CUBE) = ""{}
// 環境マップ samplerCUBE _Cube;
// Emissionは、色と表面から放出される光の強度を制御します // texCUBE():キューブマップの非射影(光から生じる影を発生させない) // オブジェクトにキューブマップテクスチャを貼り付けます。 o.Emission = texCUBE (_Cube, IN.worldRefl).rgb;
// worldReflに対して法線マップの処理を追加しています。 o.Emission = texCUBE(_Cube,WorldReflectionVector(IN,o.Normal)).rgb;
[/c]
プロパティなど
- float3 worldRefl : オブジェクトの鏡面反射ベクトルを入力できます。
- flort2 uv_Bump : 凹凸を表現する手法の一つです
- float4 screenPos : オブジェクトの位置
- float3 worldPos : ワールド座標の位置
- float3 viewDir : カメラの方向
【参考】
Unity 5 実践シェーダプログラミング入門 [改訂第一版] 高橋 潤 売り上げランキング : 2490 Amazonで詳しく見る |