今回はMMDエフェクトColorShiftの
パラメータでカラーバリエーションを
作ってみるお話です。
< ColorShiftとは>
色ずれ効果を表現するエフェクトです。
ColorShift(そぼろ様)
MMDに適用するとモデル輪郭線エッ
ジの周りにRGBに色分解された線が
描画されます。
- 色ずれエフェクトColorShift適用例 -
モデルの髪の毛や目元、メガネなど
輪郭が赤・ピンク・黃・黄緑・水色・青
で描画されてるところが色ずれエフェ
クト適用箇所です。
他のエフェクトと組み合わせれば
3色分解したRGBの一部の色のみ
指定した部位にだけ描画するコトも
可能です。
- 色ずれエフェクト+他エフェクト -
色ずれエフェクトは適用すると全体に
効果が出てしまう為、エフェクト効果
解除Excludeやエフェクト合成M4
Layer(0:通常)と併用すると使い
勝手がよくなります。
MMD画像作成で使う機会の多
い色ずれエフェクトColorShift
ですが、エフェクトFXファイルの
パラメータで色指定出来るか試し
てみました。
<ColorShift collection>
①basic
→return float4(R,G,B,1);
[ColorShift.fx記述内容]
////////////////////////////////////////////////////////////////////////////////////////////////
// ユーザーパラメータ
//ずれ範囲
float Extent
<
string UIName = "Extent";
string UIWidget = "Slider";
bool UIVisible = true;
float UIMin = 0.00;
float UIMax = 0.01;
> = float( 0.007 );
//ずれ方向
float2 VecR = float2(0, 1);
float2 VecG = float2(1, -1);
float2 VecB = float2(-1, -1);
//背景色
float4 ClearColor
<
string UIName = "ClearColor";
string UIWidget = "Color";
bool UIVisible = true;
> = float4(0,0,0,0);
///////////////////////////////////////////////////////////////////////////////////
float Script : STANDARDSGLOBAL <
string ScriptOutput = "color";
string ScriptClass = "scene";
string ScriptOrder = "postprocess";
> = 0.8;
// マテリアル色
float4 MaterialDiffuse : DIFFUSE < string Object = "Geometry"; >;
static float alpha1 = MaterialDiffuse.a;
float scaling0 : CONTROLOBJECT < string name = "(self)"; >;
static float scaling = scaling0 * 0.1;
// スクリーンサイズ
float2 ViewportSize : VIEWPORTPIXELSIZE;
static float2 ViewportOffset = (float2(0.5,0.5)/ViewportSize);
static float2 SampStep = (float2(Extent,Extent)/ViewportSize*ViewportSize.y) * scaling;
// レンダリングターゲットのクリア値
float ClearDepth = 1.0;
// 深度バッファ
texture2D DepthBuffer : RENDERDEPTHSTENCILTARGET <
float2 ViewPortRatio = {1.0,1.0};
string Format = "D24S8";
>;
// オリジナルの描画結果を記録するためのレンダーターゲット
texture2D ScnMap : RENDERCOLORTARGET <
float2 ViewPortRatio = {1.0,1.0};
int MipLevels = 1;
string Format = "A8R8G8B8" ;
>;
sampler2D ScnSamp = sampler_state {
texture = <ScnMap>;
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE;
AddressU = CLAMP;
AddressV = CLAMP;
};
////////////////////////////////////////////////////////////////////////////////////////////////
// 共通頂点シェーダ
struct VS_OUTPUT {
float4 Pos : POSITION;
float2 Tex : TEXCOORD0;
};
VS_OUTPUT VS_passDraw( float4 Pos : POSITION, float4 Tex : TEXCOORD0 ) {
VS_OUTPUT Out = (VS_OUTPUT)0;
Out.Pos = Pos;
Out.Tex = Tex + ViewportOffset;
return Out;
}
////////////////////////////////////////////////////////////////////////////////////////////////
// 色ずれ
float4 PS_ColorShift( float2 Tex: TEXCOORD0 ) : COLOR {
float R = tex2D( ScnSamp, Tex + (VecR * Extent * scaling) ).r;
float G = tex2D( ScnSamp, Tex + (VecG * Extent * scaling) ).g;
float B = tex2D( ScnSamp, Tex + (VecB * Extent * scaling) ).b;
return float4(R,G,B,1);
}
////////////////////////////////////////////////////////////////////////////////////////////////
technique ColorShift <
string Script =
"RenderColorTarget0=ScnMap;"
"RenderDepthStencilTarget=DepthBuffer;"
"ClearSetColor=ClearColor;"
"ClearSetDepth=ClearDepth;"
"Clear=Color;"
"Clear=Depth;"
"ScriptExternal=Color;"
"RenderColorTarget0=;"
"RenderDepthStencilTarget=;"
"ClearSetColor=ClearColor;"
"ClearSetDepth=ClearDepth;"
"Clear=Color;"
"Clear=Depth;"
"Pass=ColorShiftPass;"
;
> {
pass ColorShiftPass < string Script= "Draw=Buffer;"; > {
AlphaBlendEnable = FALSE;
VertexShader = compile vs_2_0 VS_passDraw();
PixelShader = compile ps_2_0 PS_ColorShift();
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
------ココまで--------
→パラメータ変更は99行目の1行を
変更するだけと時間もかからないので
いくつかバリエーションを作ってます。
②red-light blue
→99行目: return float4(R,B,B,1);
本来G(緑)の値が入るところを
B(青)に変更すると赤系と水色
の2色になりました。
R→R、G→B、B→B
(他のエフェクトとの兼ね合いで同じ
パラメータでも見た目の結果が変わ
る場合もあります。)この色は3D立体視用アナグリフ
画像にわりと近い色かなと思います。
③pink-green
→ return float4(R,B,G,1);
G(緑)とB(青)を入れ替えすると
ピンクが目立つようになりました。
R→R、G→B、B→G
色ずれエフェクトColorShiftは
重ねがけしていくと色ずれのズレ
幅が広がっていきます。
アクセサリ操作のSi値でもズレの
大きさを変更出来ます。
④purple-green
→return float4(G,B,R,1);
RGBの順番全て入れ替えで先ほどより
紫がかった色合いです。
R→G、G→B、B→G
そう言えばめりに紫はあまり使わない
かも、、
この色は赤と青の中間でどっちつかず
な面に野暮ったさが出る気がして好き
な色ですが自分はうまく使いこなせな
いですね。
⑤yellow-blue
→return float4(R,R,B,1);
G(緑)をR(赤)にチェンジで黃青の
2色カラーリングです。
R→R、G→R、B→B
次は同じ2色の反転バージョンに
なってます。
⑥blue-yellow
→return float4(B,B,G,1);
RGB全て入れ替わりでR→B、G→B、
B→Gの変化で青黃2色となりました。
メインとサブの色交換だけでも雰囲気
変わりますね。
あと4パターン残ってますが、ココか
らは色ずれエフェクト複数適用も
紹介していきたいと思います。
⑦ ⑥blue-yellow+light blue-pink
→1番目 return float4(B,B,G,1);
2番目 return float4(B,G,R,1);
最初に⑥を適用して次にR→B、G→G、
B→Rに変更したlight blue-pinkを
読み込んだ結果が上の画像です。
こうして異なるパラメータ同士掛け
あわせてどうなるか予測がつかな
いのも面白いですね。
⑧blue
→return float4(0.1*R,0.1*G,B,1);
これまでと趣向を変えてRGBそれぞれの
強さを変更したケースです。
R×0.1、G×0.1、Bと言う事で赤と緑を
減らした設定にすると画面全体が暗くなり
青で塗りつぶされます。
(上のサンプル画像は背景変更してます。)
発色はクリアでなかなかよさげですが
色調補正や着色と違いあくまでも色
ずれ効果であるというところがポイント
ですかね。
⑨gray
→return float4(R,R,R,1);
RGBを全て単一色で指定すると無彩色
になりましたね。
R→R、G→R、B→R
次で最後です。
ラストは複数重ねバージョンその2
みたいなカンジです。
⑩mix color
→1番目 return float4(R,R,R,1); ⑨
2番目 return float4(R,G,B,1); ①
3番目 return float4(G,B,R,1); ④
4番目 return float4(R,B,G,1); ③
色々足してみたらこうなったという
見本です。
スフィアの入った髪の毛のハイライト
に乗せてあげると発光してる風蛍光
色表現になって幻想的なイメージも
出せますね。
なんでこんな実験をしたかの理由は
そもそも色ずれ表示される色の黃と
緑ナシにしたい、ところから始まって
ます。
RGBではGが黄と緑なのでGを置き
替えてみてそれでも黄と緑が出て
しまうのでRGBの組み合わせを
増やしていったらバリエーションぽ
くなりました。
今回作った中で画像としていいな
と思ったのは⑦でしたが、プリセット
がこれだけストック出来たので他の
に関しても今後活用していきたいと
考えてます。
長めの記事になっちゃいましたね、
お疲れ様でした。