Upgrade to Pro — share decks privately, control downloads, hide ads and more …

トゥーンシェーディングとノンフォトリアリスティック風絵づくり入門!

unitydojo
November 05, 2016
4.3k

 トゥーンシェーディングとノンフォトリアリスティック風絵づくり入門!

unitydojo

November 05, 2016
Tweet

More Decks by unitydojo

Transcript

  1. 自己紹介 : 小林 信行 ユニティテクノロジーズジャパン合同会社 コミュニティエバンジェリスト  UnityやMayaをはじめとする各種3Dツールの研究、ゲーム制作のノウハウの普及 をしてます。『ユニティちゃんプロジェクト』の言い出しっぺの一人でもあります。 前職は『涼宮ハルヒの追想』『涼宮ハルヒの約束』『とらドラ・ポータブル!』などの 原作付きキャラクターゲームの企画&監督(クリエィティブ・ディレクター)。 結果、Motion

    PortraitやLive2Dに代表される2.5D系キャラクター表現が、多くの コンシューマゲームに導入されるきっかけを作りました。 最近は暇があると、Shader Forgeでいろいろなシェーダーを作ってます。 元々は統計を使った経済学を研究していたのですが、コンテンツ業界に入る きっかけがGAINAXに入ったことだったので、アニメーションの制作技術に関して もむやみに詳しいです。
  2. 共通のジオメトリ Standard Shader によるマテリアル ユニティちゃんShader によるマテリアル 異なるレンダリング 結果(絵づくり) どちらかと言うと、フォト系で クレイドールの質感に近い

    よりイラスト寄りで、 2D絵のイメージに 近い このように、同じジオメトリであっても、 適用するマテリアル/シェーダーが変われば、 レンダリング結果は大きく変わります。
  3. ノードベースでシェーダーを設計する利点は、シェーダーの機能をブロック毎に トライアンドエラーを繰り返しながら、設計できることにある。 またノードでロジックを組むことで、ある表現に必要なノードによるロジックパターン (ノードパターン)が確認しやすくなる。  CGPROGRAM          

                   #pragma  vertex  vert                          #pragma  fragment  frag                          #include  "UnityCG.cginc"                          struct  VertexInput  {                                  float4  vertex  :  POSITION;                                  float3  normal  :  NORMAL;                          };                          struct  VertexOutput  {                                  float4  pos  :  SV_POSITION;                                  float4  posWorld  :  TEXCOORD0;                                  float3  normalDir  :  TEXCOORD1;                          };                          VertexOutput  vert  (VertexInput  v)  {                                  VertexOutput  o  =  (VertexOutput)0;                                  o.normalDir  =  UnityObjectToWorldNormal(v.normal);                                  o.posWorld  =  mul(_Object2World,  v.vertex);                                  o.pos  =  mul(UNITY_MATRIX_MVP,  v.vertex  );                                  TRANSFER_VERTEX_TO_FRAGMENT(o)                                  return  o;                          }                          float4  frag(VertexOutput  i)  :  COLOR  {                                  i.normalDir  =  normalize(i.normalDir);                                  float3  normalDirection  =  i.normalDir;                                  float3  lightDirection  =  normalize(_WorldSpaceLightPos0.xyz);                                  float  node_64  =  max(0,dot(i.normalDir,lightDirection));                                  float3  emissive  =  float3(node_64,node_64,node_64);                                  float3  finalColor  =  emissive;                                  return  fixed4(finalColor,1);                          }    ENDCG 同じもの
  4. ユニティちゃんトゥーンシェーダーとは? ​ 「ユニティちゃんトゥーンシェーダー」は、セル風3DCG アニメーションの制作現場での要望に応えるような形で 設計された、映像志向のトゥーンシェーダーです。 ​ 特に影の制御に重点が置かれた設計になっています。 •  アウトラインの入り抜き調整は、テクスチャで指定可能 •  必ず影にしたい場所をテクスチャで指定可能 • 

    ノーマル色と影色の混合部のぼけ足を調整可能 •  ライトの位置を変えずに影色の支配域を変更可能 •  モバイル環境/WebGLでも動作します •  Shader Forgeで確認できる、ノードベースで実装されています ⇒目的に合わせて、カスタマイズができます! http://unity-chan.com/download/index.php
  5. 光の当たり具合を求めるノードパターン Normal Directionノード ワールド空間でのメッシュの法線方向 を出力する。チェックをつけるとノーマ ルマップを考慮する。 Light Directionノード レンダリング対象となるカレントライト の方向を出力する。

    Dot Productノード AとBの2つのベクトルの内積をとる。 「内積」は、2つのベクトルが構成する 角度の開き具合を表している。 上図のように、ライトベクトルと法線ベクトルの内積を取ることで、 光の当たり具合を、 0(光が全く当たっていない)~1(光が真正面から当たっている) の範囲で表現することができる!
  6. A → B → θ A → | | B

    → | | cosθ A → B → ・ = このオレンジ部の長さは、 A → | | cosθ 特に、  が長さ1の時、オレンジ部の長さはcosθとなる。 A → 内積とは、2つのベクトルがなす角度の状態を示すスカラー値のこと。 特に2つのベクトルがノーマライズされている場合には、内積が即、 2つのベクトルの内角のcosθの値となっている。 内積(Dot Product)とは? 上図のように、ライトベクトルと法線ベク トルの内積を取ることで、光の当たり 具合を0~1で表現することができる!
  7. NPR系シェーダー開発時のヒント l   セルシェーダー系は、通常色と陰色のカラー設定に時間をかけること。  色彩設定の専門家やキャラクター設定のスタッフにやってもらうとクオリティがあがる。 l   ディレクショナルライトの調整は、特に影周りの設定に注意を払うとよい。特にバイアス系。 l   モバイル向けには、なるべくディレクショナルライトを使う。  もし複数のライトが利用できるならば、キーライトとフィルライトの配置に気を配る。 ⇒参考:「光の加法混色」

    l   「シルエットが特徴的でわかりやすい」モデルとマテリアルカラーを重視するNPRは相性がよい。  デフォルメ最強。 l   テクスチャを使わないならば、必ずしもローポリにすることはない ⇒現世代なら、多少ポリゴン数は増えてもベベルを入れたり、法線を調整してしまったほうが   綺麗なシェーディングはでる。   特にテクスチャに依存しないマテリアルカラー重視の「絵づくり」をするならば、   綺麗なシェーディングが出ることを最優先にしたほうがいい。 u  メッシュ密度が高いほうが、シェーディングは綺麗にでる。特に柔らかい形状の場合。 u  頂点法線を編集することで、動くライティングに対してより複雑な変化を与えることができる。
  8. 参考文献&サイト l  SHADER FORGE Nodes http://acegikmo.com/shaderforge/nodes/ l  Shader Forge Wiki

    http://acegikmo.com/shaderforge/wiki/ l  『ゲームを動かす数学・物理』 堂前 嘉樹 / SBクリエイティブ / 2015 l  World-Building: Shaders and Aesthetics http://polyknightgames.com/world-building- shaders-and-aesthetics/ l  Unity Asset Store https://www.assetstore.unity3d.com l  Unity道場11 Shader Forge 101 ~ShaderForgeを使って学ぶシェーダー入門~ 基本操作とよく使われるノード編 http://www.slideshare.net/nyaakobayashi/unity11-shader-forge-101-shaderforge l  Unity道場14 Shader Forge 102 ~ShaderForgeを使って学ぶシェーダー入門~ カスタムライティング/トゥーンシェーダー編 http://www.slideshare.net/nyaakobayashi/unity-14-shader-forge-102-shaderforge