NialphaPropertyについてです。BSLightingShaderPropertyでもAlphaの項目がありますが、メッシュ単位での設定になります。一方こちらを使う場合は、ディフューズマップのアルファチャネルにマスクを作ることで、任意の透過表示をすることが可能になります。透過以外にもスレッシュを切って表示/非表示のマスク設定につかうモードもあります。Flagsの説明、アルファブレンドの話も少々。
検証した上で書いてますが、間違いあるかもしれません。
※2進数のbit switchやアルファ透過の計算式等、数字が多くなってます。
前回の記事はこちら
NiAlphaPropertyの確認
NiAlphaPropertyの場所について。
NiAlphaPropertyを使っている場合
元々使われている場合は、NiTriShapeの子ノードとして格納されています。下のSSのノード8番。
NiAlphaPropertyを新規で作る
新規でアルファを使いたい場合は、適当なメッシュからCopy Branchしてきて、Paste Branchで貼り付けもいいですが、新規で作る方法もあります。
目的のNiTriShapeに対して、Node>Attach Property>NiAlphaPropertyを選択。
NiAlphaPropertyが作成されます。フラグやスレッシュの値は自分で設定する必要があります。あとで説明します。
NiTriShapeに紐付けします。Block Detailsの一番下にある「BS Properties」にノード番号を設定します。上のSSを見ての通り、新規に作ったNiAlphaPropertyはノード2なので、2を設定。
無事に紐付けされました。これでディフューズマップのアルファチャネルのマスクが有効になります。Shader Flagsは特に設定変えなくても大丈夫だと思います。
NiAlphaPropertyのBlock Details
同じSSですがもう一度、Block Detailsの参照用に。こちらは既に設定済みです。
Flags
アルファの適用方法を設定します。14bitのSwitchになっています。
※SSのFlags「4844」はdecimal表記の為、binary表記にすると「01 0010 1110 1100」になります。よくわからない人は、「14個のドア開閉レバーが並んでて、1でON、0でOFF」だと思えばOKです。10進(decimal)>2進(binary)変換は、Windows付属の電卓でも使ってください。
16進(hex)と2進(binary)の関係を理解していれば、hex表示にして暗算できるので楽ちんです。
bit0 :alpha blending enable
アルファブレンディングを有効にするbitです。有効にすると半透明の透過した描画が使えるようになります。無効の場合はbit1-8の設定も無効化される、と思います。
半透明ではなく描画を削除したい場合は、このbitは0に設定した上で、後述の「alpha test」を使います。
bit1-4 :source blend mode、bit5-8 : destination blend mode
bit0を有効にした場合に使うパラメータです。ソース(設定するメッシュのディフューズ色)と背景(透過した先)のブレンドモードの設定をします。両方とも4bitづつで、設定内容は共に以下から選択します。括弧内の注釈、もしかしたら違うとこ有るかもしれません。
0000:1(常に1)
0001:0(常に0)
0010:SRC_COLOR(ソース色)
0011:1-SRC_COLOR(ソース色反転)
0100:DST_COLOR(背景色)
0101:1-DST_COLOR(背景色反転)
0110:SRC_ALPHA(ソースのアルファ)
0111:1-SRC_ALPHA(ソースアルファ反転)
1000:DST_ALPHA(背景のアルファ)
1001:1-DST_ALPHA(背景アルファ反転)
1010:SRC_ALPHA_SATURATE(ソースアルファor背景アルファ反転どちらか小さい方?)
bit9:alpha test enable
半透明ではなく、マスクによって削除したい場合に有効にします。
bit10-12:alpha test mode
bit9を立てた場合に使います。描画するか削除するかの閾値の扱いに関する設定です。
000:ALWAYS(常に表示)
001:LESS(閾値より小さい場合に表示)
010:EQUAL(閾値と等しい場合に表示)
011:LEQUAL(閾値より小さいか等しい場合に表示)
100:GREATER(閾値より大きい場合に表示)
101:NOTEQUAL(閾値と等しくない場合に表示)
110:GEQUAL(閾値より大きいか等しい場合に表示)
111:NEVER(常に表示しない)
閾値の設定はNiAlphaPropertyの「Threshold」で設定します。SSでは128になっているので、丁度中間値をスレッシュとしています。
※Z buffer testとかalpha testとか、僕のようなハード屋だとデバッグ用のテストモードをついつい連想してしまうのですが、3DCGだと奥行き(Z)に関して、重なり合うオブジェクトを「描画するかどうかテストする」ことを意味するようです。
bit13:no sorter flag
Z方向の奥行きに関するソートをしない設定でしょうか。透過の見え方とかおかしくなる気がします。大抵0だと思います。
噛み砕いて図をかくと、こんなかんじ。これでもわからない人は2進数の勉強してください。
アルファブレンディングの計算式
例によって我流だったりエアだったりで怪しいのですが、普通のアルファ透過の計算について。細かい所で間違いあるかもですが、考え方は正しいと思います。
赤のソースカラーを緑の背景カラーに透過させることを考えます。アルファは明るめのグレーで70%の透過率といったところです。
つまりソースカラーの70%と背景カラーの30%を足し算するということになります。RGB別で計算してみたのが上のSSの計算式と結果になります。
右上の重なり合ってる図は、Photoshopで透過70%でレイヤーを重ねてみたものです。計算通りの色になっていました。
Threshold
すでに説明しちゃいましたが、アルファの閾値です。0で真っ黒、255で真っ白なうち、どこに表示/非表示の境界線を引くか、です。特別に理由がない限り、127や128あたりの設定で良いと思います。中間値で使い勝手が良さそうなので。
既存のFlags設定内容をチェック
NiAlphaPropertyをもつ装備のFlagsを覗いてみます。
バニラのIron Armor
ファーや布部分にアルファを使っているので、NiAlphapropertyがついてます。Flagsは4844です。
ちなみにバニラのメッシュでも肩甲が分離してますので、簡単に肩甲だけの装備作れます。最初に載せたSSです。こちらも同様にFlagsは4844。
4844をバイナリ変換すると、0x1001011101100になりますので、ここから各bitを確かめます。
- alpha blending enable=0(アルファブレンドモード未使用)
- source blend mode=0110(アルファブレンド未使用なので関係無し)
- destination blend mode=0111(同上)
- alpha test enable=1(アルファテストモード使用)
- alpha test mode=100(閾値より大きい場合に適用)
Thresholdが128なので、これは129以上のアルファ値を持つ領域を表示とする設定になります。メッシュ自体が消える訳ではなく、光学迷彩のように見た目が消えるだけです。
Transparent and refracting Glass EqmntのGlass Shield
次にTransparent and refracting Glass Eqmnt CBBE UNP UNPBのGlass Shieldを見てみます。Glass装備を透過させるMODなので、こちらのFlagsはアルファブレンドを使っているはずです。
Flagsは4333です。
4333をバイナリ変換すると、0x1000011101101です。同様にbitを確認します。
- alpha blending enable=1(アルファブレンド使用)
- source blend mode=0110(ソースのアルファ値)
- destination blend mode=0111(1-ソースのアルファ値)
- alpha test enable=0(アルファテスト未使用)
- alpha test mode=100(アルファテスト未使用なので関係無し)
計算式の例で出したのと同じ、ソース(盾)のアルファ値を盾に乗算し、1-アルファ値を透過した背景に乗算、それを加算する方式だと思います。
Skyrimで見え方を確認する
Iron Armorの肩甲を見てみます。テクスチャはaMidianBorn Iron and Banded Armorです。左がディフューズマップ、右がアルファチャネル。ファーの毛先や布の刈り込みに使われているようです。
alpha test modeの比較
真ん中と右のアルファチャネルは、肩紐の部分をグレースケール65%で塗ってます。
上段左:デフォルトです。
上段中:Thresh128。肩紐が消えてます。
上段右:Thresh88。65%グレースケールが89相当なので、88にすると表示になります。
下段左:Flags7956 0 111 1 1000 1010 0
alpha test mode 111「NEVER」。肩甲表示が完全に消えています。
下段中:Flags4608 0 100 1 0000 0000 0
alpha test mode 100「GRETER」。上段真ん中と同じですが、未使用のalpha blend modeのパラメータを全削除しても問題ないことを確認しています。
下段右:Flags1772 0 001 1 0111 0110 0
alpha test mode 001「LESS」。表示する箇所と消去する箇所が反転しています。
alpha blend modeの比較
アルファチャネルの中身は、alpha test modeの時と同じです。
上段左:Flags237 0 000 0 0111 0110 1
alpha blend mode 肩甲:SOURCE_ALPHA 背景:1-SOURCE_ALPHA
一見するとFlags4844と変わりませんが、影が落ちない、ファーの毛先にアルファ透過等の違いがあります。下に拡大SSあります。
上段中:Flags237 0 000 0 0111 0110 1
上段左と同じですが、アルファチャネルに65%グレースケールがあるので、肩紐が透過しています。
上段右:Flags45 0 000 0 0001 0110 1
alpha blend mode 肩甲:SRC_ALPHA 背景:0
背景のブレンドが全部0になっているので、肩紐のRGB値が35%になっただけです。したがって非常に暗くなりました。
下段左:Flags3 0 000 0 0000 0001 1
alpha blend mode 肩甲:0 背景:1
肩甲が0、背景が1なので、結果的に肩甲を全消去したことになります。
下段中:Flags207 0 000 0 0110 0111 1
alpha blend mode 肩甲:1ーSRC_ALPHA 背景:SRC_ALPHA
アルファが反転しています。肩紐は35%透過なので上段中よりはっきり見えます。他は表示と削除の箇所が反転しています。
下段右:Flags133 0 000 0 0100 0010 1
alpha blend mode 肩甲:SRC_COLOR 背景:DST_COLOR
肩甲、背景、それぞれの色を乗算した上で加算しています。何に使うかはともかく、こんな効果も出るということで。
肩甲拡大SS。alpha blend modeだと毛先にアルファ透過が適用されているのでより自然に見えます(元々毛先のアルファにグラデがついてる)。反面、影を落とさなくなっているので腕に影が落ちてません。また、肩甲全体の明度が下がっています。撮影の問題かと思いましたが何度試しても同じなので、下がっているようです。理由不明。
例によって長くなりましたが、こんなもんで。結構がんばりますた。