Skip to content

Instantly share code, notes, and snippets.

@EsProgram
Created September 6, 2015 07:49
Show Gist options
  • Save EsProgram/784fb96ebfaf6c42c290 to your computer and use it in GitHub Desktop.
Save EsProgram/784fb96ebfaf6c42c290 to your computer and use it in GitHub Desktop.
Shader "Custom/Basic" {
//スクリプトやインスペクター(マテリアル)から設定したい値はここ
//シェーダプログラムが外部から参照したいものを記述
//サンプルのため今回使わないものも記述
Properties {
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Color ("Main Color", Color) = (1,1,1,0.5)
_SpecColor ("Spec Color", Color) = (1,1,1,1)
_Emission ("Emmisive Color", Color) = (0,0,0,0)
_Shininess ("Shininess", Range (0.01, 1)) = 0.7
}
//サブシェーダ1:最初に試行されるシェーダプログラム
//サブシェーダはいくつも記述可能
//このサブシェーダは頂点・フラグメントシェーダ
SubShader {
//サブシェーダタグ
//Tagsブロックでは「いつ」「どのように」レンダリングを行うかの指定をKey-Valueの形式で与える
Tags {
"Queue" = "Transparent"
"RenderType" = "Opaque"
"IgnoreProjector" = "True"
}
//全てのパスに共通するステート
LOD 200
Cull Back
Lighting Off
//パス1:1回めのレンダリングに使われる
//複数のPassを書くことでマルチパスレンダリングが可能
//サーフェスシェーダの場合Passは記述出来ない(?よくわからない)
Pass{
//パスタグ
Tags { "LightMode" = "ForwardBase" "RequireOptions" = "SoftVegetation"}
//シェーダプログラム開始宣言
CGPROGRAM
//頂点シェーダ関数名の指定
//vert_imgはUnityCG.cginc内で定義されている頂点シェーダで、よく使われる(今回はサンプルのため使わない)
//#pragma vertex vert_img
#pragma vertex vert
//フラグメントシェーダ関数名の指定
#pragma fragment frag
//Unityが与えてくれる機能群のインクルード
//今回やることはこれを使えばもっと短くできるが参考のためあまり使わない
#include "UnityCG.cginc"
//入出力で使用する構造体の宣言
//このような構造体は既にUnityCG.cgincに定義されているので、そっちを使うとこの定義を書かなくてもいい
struct appdata_t
{
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
fixed4 color : COLOR;
};
struct v2f
{
float4 vertex : SV_POSITION;
half2 texcoord : TEXCOORD0;
fixed4 color : COLOR;
};
//テクスチャサンプラの取得(プロパティのテクスチャから)
//Propertiesで宣言した値を使う場合、必ずここで宣言し直す必要がある
sampler2D _MainTex;
//TRANSFORM_TEXマクロで使うため必要
float4 _MainTex_ST;
//頂点シェーダ(頂点ごとの処理)
//戻り値で指定したものをフラグメントシェーダに渡せる
//入力された頂点データ1つ1つに対して3Dのポリゴンの情報を直方体の座標系に変換する処理を書く
v2f vert(appdata_t v){
v2f o;
//頂点座標をMVPマトリックスを使用してレンダリングする2D平面に座標変換
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
//テクスチャの移動/変形
o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
//頂点カラーの設定
o.color = v.color;
//このreturnしたoが、ラスタライザの処理後にフラグメントシェーダに入力される
return o;
}
//フラグメントシェーダ(ピクセルごとの処理)
//戻り値は色で、1つ1つのピクセルの色を返す
//頂点シェーダからの出力やテクスチャ等を使って1つ1つのピクセルの色を返す処理を書く
fixed4 frag(v2f i) : COLOR{
//テクスチャの座標から色を抽出
return tex2D(_MainTex, i.texcoord);
}
//シェーダプログラム終了宣言
ENDCG
}
}
//サブシェーダ2:サブシェーダ1が実行できない場合に呼ばれる
//このサブシェーダはサーフェスシェーダ
SubShader {
Tags { "RenderType" = "Opaque" }
Lighting Off
CGPROGRAM
//サーフェスシェーダの指定
//Lambert = 理想的なライティングモデル
//vertex:vert = 頂点シェーダを書きたい場合に頂点シェーダ名を指定できる
//alpha = 透過させたい場合は書く
#pragma surface surf Lambert vertex:vert
//サーフェスシェーダの入力になる構造体
struct Input {
//テクスチャのUV座標を参照するためには対象のテクスチャにuvプレフィックスを付加した変数を宣言する
float2 uv_MainTex;
};
sampler2D _MainTex;
//頂点シェーダ
void vert (inout appdata_full v) {
//何もしない
}
//サーフェスシェーダ
//オブジェクトの「表面」に関する属性等を指定するような処理が書ける
//自前で影の処理を書かなくても良い
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = tex2D(_MainTex,IN.uv_MainTex).rgb;
}
ENDCG
}
//サブシェーダ3:サブシェーダ1,2を実行できない場合に実行される
//このサブシェーダは固定関数シェーダ
SubShader {
Pass{
Material {
Diffuse [_Color]
Ambient [_Color]
Shininess [_Shininess]
Specular [_SpecColor]
Emission [_Emission]
}
Lighting Off
SeparateSpecular On
SetTexture [_MainTex] {
constantColor [_Color]
Combine texture * primary DOUBLE, texture * constant
}
}
}
//フォールバック(SubShaderが実行できなかった場合に実行されるシェーダプログラム)
FallBack "Diffuse"
}
@EsProgram
Copy link
Author

シェーダ勉強用に書いてみたやつ
それぞれSubShaderでやってることに一貫性はない
どの部分にどんな記述ができるか等の参考

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment