突発シェーダー講義で描いたソースコード
Shader "MannteraShader"
{
Properties
{
// リンクさせたい変数名("インスペクタに表示させたい文字",表示させる種類)= 初期値{}
_MainTex("Texture",2D) = "red"{}
}
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 normal : NORMAL; //法線情報
float2 uv : TEXCOORD0; //UV
};
// 頂点シェーダー
// 返し値 関数名(引数 変数名)
v2f vert(appdata v)
{
v2f _out;
_out.pos = UnityObjectToClipPos(v.vertex);
_out.normal = UnityObjectToWorldNormal(v.normal);
_out.uv = v.uv;
return _out;
}
//フラグメントシェーダー(ピクセルシェーダー)
//フラグメントシェーダーの結果をfloat4でSV_Targetって所に出力するよ
sampler2D _MainTex;
float4 frag(v2f _in) : SV_Target
{
float4 col = (float4)0;
float4 texColor = tex2D(_MainTex, _in.uv);
float3 lightVector = normalize(_WorldSpaceLightPos0.xyz);
//ランバート拡散反射法
float d = dot(lightVector, _in.normal);
//d = max(0, d); //max…二つの変数を比べて大きい方を採用
d = saturate(d); //0~1のクランプならsaturateの方が良い
col = d * texColor;
return col;
}
ENDCG
}
}
}
この記事が気に入ったらサポートをしてみませんか?