過去に色々やっていおり、全く別物というわけではないが、やはり違う部分もあるので、2023年10月バージョンのやり方をメモ。
フォトリアルとまではまだいかないと思う。
過去の記事
https://blog.appquiz.net/blender-realistic-skin-shader-material/
肌の色・ベースカラー
方法としては①ノードで作る②テクスチャペイントで色を塗る③テクスチャペイントのステンシル機能で画像を転写する④テクスチャペイントのステンシル機能で画像を転写する–クローンブラシを利用
などがあり、一長一短だと思う。
③のやり方↓
https://blog.appquiz.net/blender-realistic-human-skin-tips
④のやり方↓
https://blog.appquiz.net/blender-image-projection-tomodel/
肌のムラを作る / ベースカラーにむらをのせる
テクスチャペイントで塗る・Stencilで画像を転写する・ノイズテクスチャをMixするなどが考えられる。
ノイズテクスチャ・マスグレイブテクスチャでムラを作成
この方法のメリットはむらの色やサイズなどの調整が後からでもしやすいという点だろう。
基本の肌をAとして、BにはNoiseTexture と ColorRampノードを設定する。
ノイズテクスチャではノイズの大きさや濃さなどを調整(他のVoronoiTextureなどでもOK)
ColorRampは左のつまみは黒にして、かつAlphaの値ゼロにする。右のツマミでノイズの色を設定する(こっちもAlphaの値を調整可能)(つまみの数を増やすことも可能)。
ノイズの濃さの調整は、左のつまみを移動させたり、右の色を半透明にしたりすることでおこなう。
左のつまみのAlphaはゼロにする
マスグレイブテクスチャの場合も同じ
テクスチャペイントのブラシでノイズをのせる場合
メリットは自分で塗るので強弱を思う通りに調整できるという点。
デメリットは自分で塗らないといけない点、また塗り直しとなると面倒(ただ色替えくらいならColorRampノードとかを使ってやれる)
TexturePropertiesでNew、Typeにどれかを設定。
今回はCloudに。
ColorRampをアクティブにして配色する。
ブラシの色は白、StrokeModeはDots
後はStrengthとかを調整しながら塗るとこんな感じのムラをのせられる。のせたいところにのせられるというのが何よりのメリット
画像をStencilブラシで転写する場合
画像自体をブラシとして利用する。
TexturePropertiesに利用したい画像を割り当て
Settingを開き、Mappingの箇所をStencilに
ブラシの色は白にすることを忘れずに!
そうすると3Dビューのブラシポインタを中心に画像がオーバーレイ表示されるようになる。
画像のうちの利用したい箇所をモデルの塗りたい箇所と重ねてなぞると転写される。
左の画面でもできる
画像の肌の部分をトリミングしてテクスチャペイント
上の方法は自由度は高いものの、画像丸ごとを使っているのでどうにも塗りづらさを感じてしまう。
なので下のように一部分をトリミングしてやる方法。
トリミングしたら、TexturePropertiesのBrushに割り当てる。
SettingのMappingをここではViewPlaneにする(上の方法だとStencilだった)
ブラシの色は白にする。
あとはStrengthとかを調整しながら塗っていく。
この画像だとこんな感じになる。
肌の凹凸・キメ・皮膚を表現する・ノーマルなど
テクスチャを使用する
肌テクスチャを利用する。
UV準備
キメの細かさは部位によって異なる。
画像を使う場合は切れ目の発生とサイズちぐはぐで違和感という2つの問題が。
これは、UVのアイランドのサイズをモデルに準拠するようにしておくことである程度低減させられる(完全ではないのでより精細にするにはテクスチャペイントでオーバーレイを作ったりして修正する)
肌のキメ表現用のUVMapを作成する。ObjectDataPropertiesのUVMapsの箇所のプラスアイコンで作成可能。
https://blog.appquiz.net/blender-uv-unwrap-tips/
すでにテクスチャペイントの時点でシームを入れているはずなので、とりあえず全選択してUnwrapする。
UV – AverageIslandScaleでまず大雑把にやってから、サイズ調整する感じ。
もう一つ注意点として、つなぎ目が不自然にならないようにという点がある。
例えば肩と上腕の間にシームを入れており、そこでキメの角度が急に変わると違和感が出る。不必要だと感じるシームは削除し、同時に入れた方がサイズ調整しやすい場合は新たにシームを入れて展開し直す(Unwrapは全選択でなく一部分ずつやっていくことが可能。面選択モードにして Lキーを押すとシーム内のみ選択できるので、入れ直した場合、そこの内部を選択しUnwrap、そしたら左画面で位置調整をやっていく)
ノーマルマップやDisplacementのテクスチャを割り当てる
肌のノーマルマップ画像を用意する。Skin normal Map などで検索し、著作権フリーのがあるので利用させてもらう。
そしたらここでもUVMapノードを出し、さっき作った方のUVを割り当てる。
ImageTexureにはNormalMapを当てて、ColorSpaceをNonColorに。
あとはキメのサイズをMappingのScaleで調整し、凹凸感の強弱をNormalMapノードで調整する。
もしDisplacementMap画像とかがあるなら、それも接続する。
Inputとかはノーマルのやつと同じのを利用し、Noncolor、DisplacementノードのHeightに接続し、OutputのDisplacementにつなげる。
ノイズテクスチャやボロノイテクスチャを利用する
ボロノイテクスチャ
ノイズテクスチャ
ノーマルをミックスする・2つのノーマルをひとつのオブジェクトに利用する
①ノーマルAとBを使いたい場合、それぞれの場所を頂点ペイントで塗りわける。
②下のようなノードを作ることでABに別のノーマルを
肌のキメ・凹凸感を作成・しみ・そばかす
キメを作成していく。二通りある。
A 肌のノーマルマップテクスチャを使用する
B テクスチャペイントで自分で描く
実際はどちらかひとつというより組み合わせて併用する。特に肌のキメなどは方法Aで、ムラやシミなどはBがおすすめ
方法A ノーマルマップやHeight・Displacementテクスチャを利用して凹凸を表現する
テクスチャペイントでそばかすやシミを自作する
テクスチャを割り当てておく。
次いでテクスチャペイントを開く。
テクスチャプロパティで新規にブラシを作成し、そのColorRampと、ブラシの色とで配色し塗っていくという手順。
微かに塗るとかだと右の3Dモデルでは塗れているのかどうか分かりづらいことがある。
その場合は、左画面をPaintModeにして塗ってみるとうまくいくことがある。
例①
ブラシの色は肌
TexturePropertiesで新規にブラシを作り、Noiseに設定してColorRampを調整。
例②
肌のベースの色をブラシに割り当てる
TexturePropertiesは、デフォルトのVoronoiだとこんな感じなので修正する。
TexturePropertiesのColorsを開き、ColorRampをアクティブにする。
あとは塗りながら、ColorRampの色や間隔、テクスチャのSize、Contrastあたりの調整して最適を探していく。
例③
ブラシを白にする(方法Aでは肌の色だった)
合成モードをDarkenに。
TexturePropertiesを開き、Typeの部分に何かしらのテクスチャを割り当てる(今回はvoronoi)
あとはColorRampをアクティブにして、右側のツマミを肌の色に設定する。
その他微調整
サブサーフェススキャタリング
ベースカラーと同じものをSubsurfaceColorにつなげる。
Subsurfaceの値は1にしておく。
MaterialPropertiesのSettignsに入り、SubsurfaceTranslucencyをオンにする。
そうするとSubsurfaceRadiusという項目が表示される(シェーダーエディタよりMaterialPropertiesの方が折り畳まれていないぶん扱いやすい)。
上からRGBの値なので、ここをいじってちょうせいする。
SpecularとRoughtness
肌の照り具合を調整する。
またRoughtnessをゼロにしてSpecularを1にすると濡れた感じになる。
テクスチャペイントやテクスチャ画像を使って一部分だけテカらせたり濡れた感じする。
こんな感じの肌が作成可能。
ひとつのオブジェクトに複数のマテリアルを割り当てる―― 唇の箇所に別マテリアルを割り当てる
例えば唇に肌とは別のテクスチャを割り当てたいという場合。
上の方でやっているようにレイヤー化して重ねていけばマテリアルは一つで済む。が、重ねる回数が増える分ノードが複雑になってしまう。
その点唇部分には唇マテリアルを作りそれを割り当てれば、ノードはシンプルに。
どちらがいいかはわからないが、ここでは別マテリアルを割り当てる事例をメモ。
①オブジェクトを選択し、MaterialPropertiesからプラスアイコンでslotを作成。
そのSlotにNewで新規マテリアルを作り、名前をつけておく。
②TabキーでEditModeに移動し、唇を割り当てたい部分を選択する(シームを入れておけば、面選択でLキーでシーム内選択が可能)
③MaterialPropertiesのスロットで唇マテリアルを選択し、Assignを実行。これで唇部分に唇マテリアルが当たる。
ただこの時点でマテリアルの分割はできたが、人体の場合境界がくっきり過ぎて違和感が出てしまう。
手動で境界をなじませる方法もあるが、今回は唇マテリアルで肌マテリアルのノードを利用してなじませるという方法でやってみた
④肌マテリアルを選択し、唇マテリアル内部で利用したいノードをグループ化する(対象のノードをまとめて選択し、右クリック – MakeGroup )。
今回はベースカラーやノーマルなどのテクスチャ群をグループ化した。これを唇マテリアルで呼び出す。
⑤唇マテリアルでさっき作ったグループを呼び出す(Shift +A – Group で一覧が出るので選択する)。
⑥MIXColorノードで合成する。
上のImageTextureが唇のテクスチャ(Bに接続)。
下のGroupが肌のノード群。(Aに接続)
サブサーフェスを調整することでなじませる。
方法B――フェイステクスチャを利用する ―― 顔と体で別のテクスチャを併用する
顔テクスチャというのものが売られていたりする。
フェイステクスチャは基本的に顔や頭だけなので、体のテクスチャは別個に用意する必要がある。
テクスチャの使い分けのために頂点ペイントを利用する。
顔と体を頂点ペイントで塗り分ける
まずモデルを選択し、VertexPantモードに移動する。
ブラシの色を黒に設定し、 Paint – setVertexColors で 一旦全体を黒に塗りつぶす
次にブラシを白にして顔を塗っていく。
SolidPreviewで見るとこんな感じ。
この頂点情報をマスクとして利用するので、色は黒と白を使う!(他の色はだめ)
SolidPreviewで塗った色が表示されない場合、右の設定がAttributeになっているか確認。
次にShaderEditorを開きBaseColorに2つのノードをつなげる。
左はInput – Attributes と進み、頂点ペイントのデータが見つかるはずなので、それを選択する。
さらにColor – MixColorノードを出して,Factor の箇所と BaseColor に接続する。
色の部分をとりあえず適当に設定し、頂点ペイントが機能しているか確認する。
フェイステクスチャを割り当てる –顔部分のシェーディング
モデルとテクスチャがはじめからセットになっている(UVなどの情報も付属している)ならそれを使えばよいが、テクスチャとモデルが別々の場合、どうフェイステクスチャを利用するかいろんな方法が考えられる。
より丁寧に行うなら、下記記事の手法でテクスチャの修正作業を挟む。が、面倒くさいので今回は簡略された手順でやっていく。
顔用のUVを新規に作成する。
UVEditorを開き、右画面を1キーで正面視点にしてテクスチャを貼る箇所を選択する(頂点ペイントで塗った箇所まとめて選択はアドオンを使えば可能。今回は大雑把に顔の正面を選択した)
選択したら UV – ProjectFromView を実行。
そうすると左画面に顔のUVが展開というかProjectされる。
左画面のOpenからフェイステクスチャを開く。
ShaderEditorに移動。
前の節でやった頂点ペイントの顔に該当する方(画像だとMixノードのBの方)に赤枠の3つのノード、左からUVMap – Mapping – ImageTexture を接続する。
UVMapノードにはさっき作った顔用のUVを割り当てる。
ImageTextureノードにはUVEditorの左画面で開いたのと同じ顔テクスチャを設定。
まだUVの調整をしていないので、MaterialPreviewはこんな感じ。
再度UVEditorを開き、顔テクスチャに顔のUVがうまいこと重なる用に修正する。
MaterialPreviewで確認する。
これでとりあえずフェイステクスチャの割り当ては一段落。
体部分のシェーディング
身体部分は、MixノードのAの箇所を肌の色っぽくするだけでもそれなりには見える。
ただ近づくと、フェイステクスチャ部分との間に違和感が出てしまう。
これは頂点ペイントモードに移動し、SolidPreviewにして塗り直していく。
ただしどのブラシでも良いが、色は白か黒!
さっきよりは馴染んだ。
ノイズをのせる
ただMixノードの色で指定するだけでは単色なので、よりリアリスティックを目指すならノイズをのせたりしたほうがよい。
今回はとりあえずNoiseTextureを利用してのせる。
テクスチャペイントでやる場合
テクスチャペイントを開き、新しくテクスチャを作成。
重ねるのでAlphaをゼロにしておく。
右画面の上部 Image – Save Asで名前をつけて保存する。
ShaderEditorに移動。
既に上の節で作ったノードが点線部分、ここで作るのはその下の赤枠。
使用するノードは前のと同じなので、4つのノードを選択して複製する。
左のUVMapノードには、顔用のUVではなく全身用のUV(各アイランドのサイズがモデルに準拠しているUV)を割り当てる。
ImageTextureにはさっき保存した透過画像を設定。Alphaの部分をFactorに
できたら再度テクスチャペイントモードに移動。
右画面のSlotが作った透過画像になっているか確認し、よければ塗っていくなりStencilなりやっていく。(方法は記事下のTipsに記述している)
個々のパーツ部分
唇のシワ・縦じまを
テクスチャを塗ってラフネスでテカらせただけだとツルッとしすぎているようで
①頂点ペイントで唇(縦じまを入れたい部分)を塗っていく。
もし既に頂点ペイントのデータがあるなら、新規にチャンネルを追加して塗る。
できたらColorAttributesに名前をつけておく。
Tips
Roughnessで肌のテカリを制御
体オブジェクトを選択してTexturePaintモードを開く。
TextureslotsのプラスアイコンからRoughnessを選んで、テクスチャのサイズや名前を指定して作成する。
作成されたテクスチャがRoughnessに繋がっているか一応確認。
デフォルトだと灰色。
ブラシを白と黒に設定し、テカらせたい箇所を黒、そうでない箇所を白に塗っていく。
毛穴をテクスチャペイント
テクスチャペイントでBrushにVoronoiTextureを割り当てる。
Sizeで毛穴のサイズを調整する。
ColorRampをアクティブにする。
デフォルトだと左(黒)のアルファが0で右(白)が1になっているが、このつまみを移動させて入れ替える。
左(白)のあるふぁが1で右が0
黒のつまみのアルファはゼロ
プレビュー部分はこんな感じ。
ブラシを毛穴の色にして塗るとこんな感じに穴をペイントできる。
場合により左画面で塗ったほうがやりやすいかもしれない。
テクスチャのサイズによって、Sizeの値を小さくしても毛穴としてはでかすぎる問題が発生する(1ピクセルでも毛穴としてはでかすぎる)。
対処法としては顔だけのテクスチャとUVを用意してうまく重ねることで対処する。