【その2】突発シェーダー講義で描いたソースコード
Shader "MannteraShader"
{
Properties
{
// リンクさせたい変数名("インスペクタに表示させたい文字",表示させる種類)= 初期値{}
_MainTex("Texture",2D) = "red"{}
_SpecularPower("SpecularPower",float) = 10
// RampMap
_RampMap("RampMap",2D) = "white" {}
}
SubShader
{
Pass
{
CGPROGRAM
//vertと言う関数名は頂点シェーダーですよ!と教えている
#pragma vertex vert
//fragと言う関数名はフラグメントシェーダーですよ!と教えている
#pragma fragment frag
#include "UnityCG.cginc"
//モデルの頂点情報
//変数型 変数名 : セマンティクス名;
struct appdata
{
float4 vertex : POSITION; //座標 3Dの情報
float4 normal : NORMAL; //法線
float2 uv : TEXCOORD0; //UV
};
//フラグメントシェーダーに渡す情報
struct v2f
{
float4 pos : SV_POSITION; //座標 2Dに潰した情報
float3 wPos : WORLD_POS; //ワールド座標
float3 normal : NORMAL; //法線情報
float2 uv : TEXCOORD0; //UV
};
// 頂点シェーダー
// 返し値 関数名(引数 変数名)
v2f vert(appdata v)
{
v2f _out;
_out.pos = UnityObjectToClipPos(v.vertex);
//ワールド座標
//unity_ObjectToWorldは、ワールド行列で
//頂点にunity_ObjectToWorldかけてやるとワールド座標に変換する。
_out.wPos = mul(unity_ObjectToWorld, v.vertex).xyz;
_out.normal = UnityObjectToWorldNormal(v.normal);
_out.uv = v.uv;
return _out;
}
//フラグメントシェーダー(ピクセルシェーダー)
//フラグメントシェーダーの結果をfloat4でSV_Targetって所に出力するよ
sampler2D _MainTex;
sampler2D _RampMap;
float _SpecularPower;
float4 frag(v2f _in) : SV_Target
{
float4 col = (float4)0;
float4 texColor = tex2D(_MainTex, _in.uv);
float3 lightVector = normalize(_WorldSpaceLightPos0.xyz);
//ピクセルからカメラまでの距離を測定して、
//normalizeする事で、単位ベクトル(ggr)が出る
// _WorldSpaceCameraPos…カメラの座標
float3 viewVector = normalize(_WorldSpaceCameraPos - _in.wPos);
//ランバート拡散反射法
float d = dot(lightVector, _in.normal);
//ハーフランバート
d = d * 0.5f + 0.5f;
d = d * d;
//d = max(0, d); //max…二つの変数を比べて大きい方を採用
d = saturate(d); //0~1のクランプならsaturateの方が良い
//ディフューズカラー(拡散光)
//ランプマップを取得して、トゥーン調の絵にする
float3 rampColor = tex2D(_RampMap, float2(0, d));
float4 diffuseColor = float4(rampColor.xyz,1) * texColor;
//スペキュラを計算
float3 ref = reflect(-lightVector, _in.normal);
float reflectionPower = dot(ref, viewVector);
reflectionPower = max(0, reflectionPower);
float3 specularColor = pow(reflectionPower, _SpecularPower);
//最終の色を算出
col.xyz = diffuseColor.xyz +specularColor;
col.w = diffuseColor.w;
return col;
}
ENDCG
}
}
}
この記事が気に入ったらサポートをしてみませんか?