Shader置き場
2018/6/7
マトリクス
https://gyazo.com/2c8aa084957b76d1cdff11f696d18acf
https://gyazo.com/3c302b7b28c151fc13123640e6809594https://gyazo.com/600e60603fc5a3be5b00ce3a973a0b1c
パラメータ
Color:線の色
BaseColor:基本色
Split:縦横の方眼の数
LineWidth:線の太さ
Allow Exposed:線の交差位置の重ね合わせを計算するか
Scrool X: X方向のスクロール量
Scrool Y: Y方向のスクロール量
code:MatrixShader.shader
Shader "Custom/MatrixShader" {
Properties{
_Color("Color", Color) = (1,1,1,1)
_BaseColor("BaseColor", Color) = (0,0,0,1)
_Split("Split", Float) = 2.0
_LineWidth("LineWidth", Float) = 1
_ScrollX("Scroll X", Float) = 0
_ScrollY("Scroll Y", Float) = 0
}
SubShader
{
Pass
{
CGPROGRAM
// "vert" 関数を頂点シェーダーとして使います
// "frag" 関数をピクセル (フラグメント) シェーダーとして使います
fixed4 _Color;
fixed4 _BaseColor;
float _Split;
float _LineWidth;
float _IsOver;
float _ScrollX;
float _ScrollY;
// 頂点シェーダー入力
struct appdata
{
float4 vertex : POSITION; // 頂点位置
float2 uv : TEXCOORD0; // テクスチャ座標
};
// vertex shader outputs ("vertex to fragment")
struct v2f
{
float2 uv : TEXCOORD0; // テクスチャ座標
float4 vertex : SV_POSITION; // クリップスペース位置
};
// 頂点シェーダー
v2f vert (appdata v)
{
v2f o;
// クリップスペースへの変換位置
// (モデル*ビュー*プロジェクション行列で乗算)
o.vertex = UnityObjectToClipPos(v.vertex);
// 単にテクスチャ座標を渡します
o.uv = v.uv;
return o;
}
// サンプリングするテクスチャ
sampler2D _MainTex;
// ピクセルシェーダー; 低精度を返します ("fixed4" 型)
// color ("SV_Target" セマンティック)
fixed4 frag (v2f i) : SV_Target
{
float span = 1 / _Split;
float lwBase = span * 0.01;
float lw = lwBase * _LineWidth;
//xの値を時間補正付きで取得
float x = i.uv.x + _Time.x * _ScrollX * span;
float y = i.uv.y + _Time.x * _ScrollY * span;
//span範囲でのxの値を出す
float cx = fmod(x, span);
float cy = fmod(y, span);
//線に該当するかチェック
float b_px = 1 - step(lw, cx);
float b_py = 1 - step(lw, cy);
float lineHitCount = b_px + b_py;
//露出オーバーを許容するならそのまま係数として使う
float lerpVal = lerp(min(lineHitCount,1), lineHitCount, _IsOver);
fixed4 c = lerp(_BaseColor, _Color, lerpVal);
return c;
}
ENDCG
}
}
}
例のアレ
code:harrier.shader
Shader "Custom/harrier" {
Properties{
_ColorU("Color 1", Color) = (0,1,1,1)
_ColorV("Color 2", Color) = (1,0,1,1)
_BaseColor("BaseColor", Color) = (0,0,0,1)
_Split("Split", Float) = 2.0
_LineWidth("LineWidth", Float) = 1
_ScrollX("Scroll X", Float) = 0
_ScrollY("Scroll Y", Float) = 0
}
SubShader
{
Pass
{
CGPROGRAM
// "vert" 関数を頂点シェーダーとして使います
// "frag" 関数をピクセル (フラグメント) シェーダーとして使います
fixed4 _ColorU;
fixed4 _ColorV;
fixed4 _BaseColor;
float _Split;
float _LineWidth;
float _IsOver;
float _ScrollX;
float _ScrollY;
// 頂点シェーダー入力
struct appdata
{
float4 vertex : POSITION; // 頂点位置
float2 uv : TEXCOORD0; // テクスチャ座標
};
// vertex shader outputs ("vertex to fragment")
struct v2f
{
float2 uv : TEXCOORD0; // テクスチャ座標
float4 vertex : SV_POSITION; // クリップスペース位置
};
// 頂点シェーダー
v2f vert (appdata v)
{
v2f o;
// クリップスペースへの変換位置
// (モデル*ビュー*プロジェクション行列で乗算)
o.vertex = UnityObjectToClipPos(v.vertex);
// 単にテクスチャ座標を渡します
o.uv = v.uv;
return o;
}
// サンプリングするテクスチャ
sampler2D _MainTex;
// ピクセルシェーダー; 低精度を返します ("fixed4" 型)
// color ("SV_Target" セマンティック)
fixed4 frag (v2f i) : SV_Target
{
colors3 = lerp(_ColorU, _ColorV, 0.5); float span = 1 / _Split;
float lwBase = span * 0.01;
float lw = lwBase * _LineWidth;
//xの値を時間補正付きで取得
float x = i.uv.x + _Time.x * _ScrollX * span;
float y = i.uv.y + _Time.x * _ScrollY * span;
//span範囲でのxの値を出す
float cx = fmod(x, span);
float cy = fmod(y, span);
//線に該当するかチェック
float b_px = 1 - step(lw, cx);
float b_py = lerp(2, 0, step(lw, cy));
float lineHitCount = b_px + b_py;
//露出オーバーを許容するならそのまま係数として使う
float lerpVal = lerp(min(lineHitCount,1), lineHitCount, _IsOver);
return c;
}
ENDCG
}
}
}