〜 Live2D&GLSLエフェクト表現 〜

◆はじめにちょっと一言。

元々は30人規模の「軽い感じ」のGLSL勉強会

予定のはずだった・・・。

◆はじめにちょっと一言。

しかも参加者に登壇者レベルのガチ勢ばかりじゃんwww

少しビビってるのでどうか温かい目で聞いて下さいね

◆自己紹介

・Twitter : @naotaro0123(なおたろーとお呼び下さい)

・GLSLスクール1期生(きっと2期もあるはず)

・Live2Dのプログラマー(UnityやWebGL担当、PS4 SDKも少々)

・Live2Dの布教活動してます(Qiitaに技術ブログ

・blenderなど3DCGも好きで趣味で触ってます!

 (シェーダー歴は1年ぐらいです)

◆初めて作ったシェーダー

どらえもんシェーダー

(1年前にここを見てノリで作った)

◆今日話すこと

・Live2Dの概要


・Live2D WebGLの描画

 

・Live2D&GLSLでエフェクト

Live2Dの概要

Live2Dとは、1枚の原画さえあればキャラクターを

ぬるぬると動かせる技術です!

Live2Dの概要

最近はfaceRig&Live2Dが「おっさんが美少女になれるぞー!」と大人気です♪

Live2Dの概要

スマートフォンゲームだとコロプラさんのバトルガールでもLive2Dが使われてます!

会場を貸して頂き

ありがとうございます!

Live2Dの概要

・色々なプラットフォーム対応してます → WebGL版Demo

  WebGL、Unity、OpenGL[Cocos2d-x]、DirectX、PS4、3DSなど

 

・全てのプラットフォームで同じ形式ファイルが使える

  .mocファイル(Live2Dモデル)、.pngファイル(テクスチャファイル)、

  .mtnファイル(モーションファイル)、.json(表情ファイルなど)

  というのが必要なファイル構成

 

・全てのプラットフォームでほぼ同じLive2D APIが使える

 環境が変わっても同じスキルが使える

Live2Dの概要

Live2Dのワークフロー

Live2Dの概要

Live2Dの利用規約について

・個人開発の人や売上1000万円未満の事業者も無料で

 使えます(このアプリで使いましたという申請も不要)

 

・Live2Dコア部分(live2d.min.js)はgithubなどで再配布

 は禁止してます。

 

・デモやゲーム公開用には自分が管理するサーバーに

 live2dコア部分は置いてOKです!

Live2D WebGLの描画

WebGL InspectorでLive2Dの描画順が見えます。

Live2Dはパーツ数分ドローコールが発生します

Live2D WebGLの描画

これはLive2Dがパーツごとに透明度のフェードインアウトできるため、パーツごとに描画されています

Live2D WebGLの描画

モデリングソフトで見るとこのようになってます。

パーツごとに不透明度が指定できます。

Live2D WebGLの描画

パーツごとに不透明度が指定できるAPIはあります。

live2DModel.setPartsOpacity("パーツID", 1.0);

パーツごとの不透明度なので透過するとこのようになる

→ Live2D APIリファレンスはこちら

Live2D WebGLの描画

全身を透過したい場合は、フレームバッファを使いましょう。

ただ、少し手間なのでCSS Opacityでやるのもありかと。

ティラノスクリプトの

プラグインはCSS Opacity

でフェードさせてます

→ ティラノスクリプトのLive2Dプラグインはこちら

Live2D WebGLの描画

Live2Dの描画モデル数について

WebGLの場合、6体ぐらいまでがベストっぽい

 (スマホだとFPSが落ちるので3体ぐらいが良い)

Live2D社のわんころもちサイト

では6体動かしてます。

(スペック低いスマホだと1匹消えたり...)

ちなみに背景の金色はシェーダーで動いてますっ!

  フレームバッファ知らなかったので

   CANVAS2枚重ね方式です。

 

◆Live2D&GLSLでエフェクト

WebGLアドカレでGLSL炎エフェクトネタを書きました。

簡単なので、GLSL初心者はぜひトライしてみて下さい。

◆Live2D&GLSLでエフェクト

軽く解説するとメタボールを重ねると綺麗な玉ができたり、

p.x += sin(time*2.0)とすると移動できたりします。

以下のリンクからGLSL Editorが開きます

◆Live2D&GLSLでエフェクト

つまり、p.xやp.yをいじれば好きな位置に描画できる。

コンパイルとか必要なくすぐ確認できるのがWebGLの利点!

void main(){
    vec2 drawPos[2];
    drawPos[0] = vec2(-0.4, 0.0);
    drawPos[1] = vec2( 0.4, 0.0);
    vec2 p = (gl_FragCoord.xy * 2.0 - resolution) /  
                                 min(resolution.x, resolution.y);
    // デフォルト値を保持
    vec2 center = p;
    // 1つ目の玉
    p += drawPos[0];
    float l = 0.1 / length(p);
    // 2つ目の玉は1度センターにしてから計算  
    p = center;
    p += drawPos[1];
    l += 0.1 / length(p);
    gl_FragColor = vec4(vec3(l*0.25+l*0.1, l*0.45+l*0.1, l), 1.0);
}

◆Live2D&GLSLでエフェクト

ちなみにLive2D APIで頂点情報が取得できます。

(インデックスバッファも取得できます)

// 描画オブジェクトIDからインデックス取得
var drawIndex = live2DModel.getDrawDataIndex("描画オブジェクトID");
// 頂点位置を取得
var points = live2DModel.getTransformedPoints(drawIndex);

1つ1つの頂点情報X, Yが取得できる。

全ての頂点の最小XY、最大XYからこの

描画オブジェクトの中心座標が求まる

◆Live2D&GLSLでエフェクト

この炎エフェクトとLive2Dを組み合わせてみました!

◆Live2D&GLSLでエフェクト

このリンクからDemoが見れます

目パチ時には炎を消してます。

Live2Dでは各パラメータ値を取得できるのでそれで判定してます。

// 左目の開閉値を取得するAPI
live2DModel.getParamFloat("PARAM_EYE_L_OPEN");

◆Live2D&GLSLでエフェクト

実装的なところ

フレームバッファは2枚使っています。

1枚目はLive2Dの描画、2枚目で炎エフェクトを描画しています。

最後にその2枚を加算合成しています。

◆Live2D&GLSLでエフェクト

実装的なところ

firefoxのシェーダーエディタでみると分かりやすいかと思います。

(firefoxのシェーダーエディタならソースが編集可能)

// smpColor0がLive2D、smpColor1が炎
void main(void){
    if(multi_tex){
        vec4 smpColor0 = texture2D(texture0, vTextureCoord);
        vec4 smpColor1 = texture2D(texture1, vTextureCoord);
        gl_FragColor  = smpColor0 + smpColor1;
    }else{
        vec4 smpColor0 = texture2D(texture0, vTextureCoord);
        gl_FragColor  = vColor * smpColor0;
    }
}

プログラム0のフラグメントシェーダー(加算部分)

◆Live2D&GLSLでエフェクト

ステンシルバッファで部分的モザイク

こちらの記事を参考に

Live2D APIで頂点情報が取れるので、クリッピングマスクした部分に

モザイクかけたりもできます。こちらはフレームバッファ4枚使ってます。

◆Live2D&GLSLでエフェクト

上手くできてないですが、パーツごとに透明度がかけらるので前髪と後髪だけ

描画しシェーダーかけたりもできます!フレームバッファは5枚使ってます。

ブラー&加算でパーツを光らせる

ガウシアンブラーで上手く太らなかったので、川瀬式MGF使ってます。

でも上手くできてなくて髪が溶けちゃいました (; >_<)/

◆最後に

・今回の実装は、Live2D内部コアライブラリはいじってません

 

・フレームバッファとシェーダーを覚えると可能性が広がります!


・Live2Dとシェーダーを使うとよりインタラクティブな物が作れます!


◆告知

3/20に渋谷でモデリング会をやります!

内容はLive2Dやblenderなどのもくもく会です。

毎月定期的に開催していく

予定です。

Live2Dやblender入門教えてほしい人はご参加下さい

温かい目で聞いて頂き

ありがとうございました!

Live2D&GLSLエフェクト表現

By naotaro

Live2D&GLSLエフェクト表現

  • 5,245