Ameba Ownd

アプリで簡単、無料ホームページ作成

MinecraftBEアドオン-ヒント倉庫

【アドオン小技メモ】 エンティティの特殊なテクスチャ

2020.08.03 10:03

 軽く内容を書く程度なのでアドオン初心者でもわかるような親切さはありません。

 「(要検証)」または「未検証」の部分はヒマなら試してみてください。結果がわかった/知っている場合はこのサイトのコメント欄ででも教えてくれるとありがたいです。


○エンティティの特殊なテクスチャ

 よくあるのが、スライムのような半透明なテクスチャを真似することです。実はテクスチャを描く際に半透明の色で描くだけだとダメなんです。次に、クモの目、ファントムの目、エンダーマンの目、ブレイズの体のように暗闇のなかでも明るく見える「特殊発光」です。これなんかは特にやり方が想像できないと思います。

 実は両方とも同じやり方でできてしまいます

① テクスチャの描きかた

 半透明にせよ、特殊発光にせよ、透明にしたいところまたは光らせたいところは半透明の色で描きます

 半透明はそのまま透明度が反映され、特殊発光は色が透明に近いほど明るく光ります(100%透明にするとたぶんダメです)。

② テクスチャのファイル形式が違う

 テクスチャのファイル拡張子は「.png」ではなく「.tga」にします。ただし、ファイル名を変えるだけじゃダメなので、ちゃんと変換ソフトなどを使う必要があります。そんなの持ってないよという場合は「png tga 変換」で検索すればwebで変換してくれるものがあるのでそれを使いましょう。

③ マテリアルを指定する

 「(リソース)/entities」ディレクトリにある.entity.json(エンティティのクライアントファイルという)の上から数行目ほどに「"materials"」というプロパティがあります。その値を、半透明なら「"slime_outer"」に、特殊発光なら「"entity_emissive"」にします。

 マテリアルのファイルを自分で作る必要は一切ありませんよ。


 注意点がひとつあります。半透明のテクスチャ越しに地形を見るとかなり付近までのチャンク描画が省略されてしまいます。そのほか他の半透明のブロックが透明に見えるかもしれません。これはゲームとして当然の描画処理であって、バグではなくどうしようもない仕様です。ただそれを聞いてやめずにとりあえず一度試してみてください。

■マテリアルを編集する例

 マテリアルのファイルを自作する必要は全くないはずですが、無駄に作ろうとして苦労しているひとをたまに見る気がしますが、その苦労は無駄です。何を根拠に作る意味があると思っているのやら。シェーダをやるなら自作することはあっても普通はありません。

 ただ、既存のマテリアルファイルを編集する例はあるので紹介します。

・ブロック越しでも見えるエンティティ?

 あるひとが配布ワールドで敵モブの頭上にポインターをつけて敵がどこにいるか分かりやすくしようとしたのが始まりです。それもただポインターをパーティクルで浮かせるだけでは障害物に敵が隠れてしまったときに全く意味をなしません。

 そこでそのひとは「名札(などのホログラム)」ならば壁越しにも見えるので、可能ではあると考えました。そしてそのときシェーダの上級者と協力して見つけた方法が、これから紹介するものとなっています。


 その前にひとつ。バニラのマテリアルファイルは公式が配布しているテンプレートにないので、持っていない場合はこちらからどうぞ。

 ディレクトリは「(リソース)/materials/(.zipの中身)」です。

①マテリアルに専用のものを書き足す

 既存のものを変更するだけだとすべてのエンティティがそうなってしまうので、オリジナルのものを書き足します。新しいファイルに作ると探してくれずにクラッシュしてしまう(v1.16.2)ので、entity.materialにつけ足していきます。付け足すといっても新しく書くことはほとんどないです。

 以下のようにひとつオブジェクトを追加します。「○○」は自由に名前を決められます。

{

  "materials": {

    "version": "1.0.0",


    "entity_static": {

      "vertexShader": "shaders/entity.vertex",

      "vrGeometryShader": "shaders/entity.geometry",

      "fragmentShader": "shaders/entity.fragment",

  (略)

      "msaaSupport": "Both",

      "+samplerStates": [

        {

          "samplerIndex": 0,

          "textureFilter": "Point"

        }

      ]

    },


    "○○:entity_static": {

      "depthFunc": "Always"

    },


    "entity_flat_color_line": {

      "vertexShader": "shaders/position.vertex",

      "vrGeometryShader": "shaders/position.geometry",

(略)

 entity_staticとentity_flat_color_lineと同じ層にいれます。

 今後は説明の簡略化のために、この太字になっている追加した部分を(✴)と呼びます。

②作ったマテリアルを指定する

 あとは、先ほど決めた「○○」の部分のみをエンティティのクライアントファイルで指定するだけです。

 しかし、よく見ると本来テクスチャが完全に透明になっている場所が真っ黒になっています

 これを防ぐ方法はあり、これから紹介しますが、そのマテリアルのエンティティを視界にいれただけでも高確率でクラッシュするので全くおすすめしません。(もしクラッシュしない方法を知っているなら教えてください)

○ベースのマテリアルを変える

 セクションの題名でなにか難しそうな印象を醸していますが、簡単です。

 先ほど(✴)のコロン(:)の右に書いた「entity_static」を「entity_alpha_test」に変えるだけです。そのほかは全く同じです。

 もし(✴)とは別のものとして追加するならば下に並べていけばいいですが、「○○」の部分は変える必要があります。

 確かに、真っ黒ではなく透けるようになりました。しかし、どうやらそこ以外の見た目が変です。

 壁越しに透けて見えるとだけあって、自身の体も透けてしまうようです。

 このように、デメリットばかりなので後者の方法はおすすめしません。スケルトンのように、透明な部分をいくつか含むテクスチャをもったエンティティは選ばない方がいいでしょう。(そしてこの後クラッシュしました)

 どうしてもという場合はひとつ案があるのでこの次の次ぐらいのセクションでお話しします。

・ブロック越しじゃないと見えないエンティティ

 今度は逆に「ブロック越しにしか見えないマテリアル」を紹介します。当然、透明な部分を含むブロック以外をはさんでしか視認することができないので普段は透明です。

 方法ですが、いままでの手順を見ていれば実に簡単です。(✴)の「Always」の部分を「Greater」に変えるだけです。こちらも完全に透明なテクスチャは黒くなってしまいますが、先ほどと同じ理由でしかたないと思ってください。

・いろいろな組み合わせ

 これまでで四種類の描画方法が出てきたので当然それらの組み合わせはあるわけです。──ただクラッシュとかあるので「できるけどできない」みたいなものがありそうです。

○半透明 + ブロック越し

 (✴)の「entity_static」の部分を「slime_outer」にします。depthFuncはブロック越し"でも"見えるようにするならば「Always」、ブロック越しで"だけ"見える場合は「Greater」です。

○特殊発光 + ブロック越し

 (✴)の「entity_static」の部分を「entity_emissive」にします。「blaze_head」にするとクラッシュするかもしれません。そして同様にdepthFuncはブロック越し"でも"見えるようにするならば「Always」、ブロック越しで"だけ"見える場合は「Greater」です。

○特殊発光 + 半透明

 残念ながらこの組み合わせはまだ方法が見つかっていません。帯電クリーパーのアーマーまたはウィザー第二形態のアーマーを参考にしましたが見た目が変わったりあまり明るくなかったので、別の方法でなくてはならなそうです。

 方法を知っていたり見つけたら紹介していただけるとありがたいです。

・透明な部分を黒くしないようにするには

 後回しにした理由は「半透明+ブロック越し」を先に紹介したかったからです。勘のいいひとはここで気づくと思います。

 単純に「半透明+ブロック越し」を使えば透明の部分を正しく描画できると思います。完全透明(塗っていない)状態でダメなら不透明度(どれだけ透けないか)を1だけ残せばいいと思います。1ぐらいなら見えません。

 ただし欠点があり、一部完全に透明なテクスチャを持ちつつ特殊発光をさせることはできません。上の行で述べたように「特殊発光+半透明」は方法が見つかっていないからです。

■パーティクルでもマテリアルを選べる

 パーティクルに対しても半透明、ブロック越しなどの特殊な表示はできます。

○特殊発光

 実は、パーティクルはデフォルトで特殊発光するようになっています。逆に特殊発光させたくない場合はパーティクルのjsonにminecraft:particle_appearance_lightingコンポーネントを書き足します。このコンポーネントがタグ型なので値は「{}」です。

○半透明

 こちらもパーティクルのjsonですが、上から数行目の「"materials"」プロパティの値を「"particles_blend"」にします。

○ブロック越し

 ここでマテリアルファイルを編集していくことになります。今回は「particles.material」ファイルを使います。

{

  "materials": {

    "version": "1.0.0",

    "particles_base": {

      "vertexShader": "shaders/color_uv.vertex",

      "vrGeometryShader": "shaders/color_uv.geometry",

      "fragmentShader": "shaders/color_texture.fragment",

      "vertexFields": [

        { "field": "Position" },

        { "field": "Color" },

        { "field": "UV0" }

      ],

      "+samplerStates": [

        {

          "samplerIndex": 0,

          "textureFilter": "Point"

        }

      ],

      "msaaSupport": "Both"

    },


    "○○:particles_alpha": {

      "depthFunc": "Always"

    },


    "particles_opaque:particles_base": {

      "+defines": [ "ENABLE_FOG" ],

      "+states": [ "DisableAlphaWrite" ]

    },

(略)

 particles_baseとparticles_opaque:particles_baseと同じ層にいれます。

 今後は説明の簡略化のために、この太字になっている追加した部分を(☆)と呼びます。


 上記の例では「Always」なのでブロック越し"でも"見えるようになっており、「Greater」にすればブロック越しで"だけ"見えるようになります。

○ブロック越し + 半透明

 (☆)の「particles_alpha」と書いた部分を「particles_blend」にします。