マインクラフトの裏側：「見えないブロック」が語る秘密

この記事は１５分程度で読めます。

# はじめに
今日はマインクラフトの裏側「見えないブロック」について語ります。マインクラフトの世界はキューブ型のブロックで構成されています。しかし、目に見えているブロックだけがマインクラフトの世界を構成している訳ではありません。地面に埋もれているブロックや、あなたの背後にあるブロックもマインクラフトの世界を支えています。今日はこの「見えないブロック」がマインクラフトの世界に与える影響について話をします。

# 意外と多いブロック
以下の画像に村が写っています。目に見えている範囲が仮に奥行き50ブロック、幅200ブロックほどあるとしましょう。このとき地表に露出しているブロックの数は 50×200=10000 ブロックほどになるでしょうか。水の中に見えるブロックは話が面倒なので一旦無視しましょう。仮に村のY座標が65だとすると、この範囲の地面には Y=-64～64までのブロックが埋まっていることになります。その数は 10000×129=1290000 ブロックほどになるでしょうか。
つまりざっくりいうと「見えているブロック」に対して「見えないブロック」の数は129倍です。あわせて 1300000 ブロック、とんでもない数ですね。

![mc1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172479/d0ce906b-94a0-2fab-db0a-5e2ef360504b.png)

# ブロックの描画
あなたのパソコンのスペックはどのくらいでしょうか？Java版のマインクラフトであれば、キーボードの「F3」キーを押すとデバッグ画面というものが開き、ここにPCのスペックなどが表示されます。上から２行目に fps と書いてあり、その左に数字が書いてあります。下の画像であれば 60 です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172479/1531d164-8b66-bb58-42d3-f8d12da6f7ae.png)

これはあなたのパソコンが１秒間に６０回マインクラフトの画面を写しているよ、という意味で、ゲーム画面を「描画」するなどと言います。
fps というのはパラパラ漫画をめくる速度に相当します。より早くパラパラめくればより滑らかにアニメーションするよ、という意味です。中程度のスペックのパソコンであれば６０fpsというのは大した負荷ではなく、余った時間にブラウザで YouTube を再生したりとあなたのパソコンにはまだまだ余裕があるはずです。
しかし、仮に６０fpsを下回ったりしている場合、あなたのパソコンには余裕がなく、マインクラフトのゲーム画面を描画するのに精いっぱいな可能性があります。このとき、もし今は見えていない地面の下の 1290000 のブロックも描画しないといけない、なんてことになったら、とてもじゃないですが６０ｆｐｓなんて保てないでしょう。もしかしたら１fps以下なんてこともあり得るかも知れません。

# カリング
さて、ここで１つ技術用語の話をします。「カリング」と呼ばれる用語です。これは３Dモデリングの用語で「目に見えていない部分の３Dモデルの描画を省略する」というテクニックのことです。例としていくつか紹介します。

マインクラフトのブロックはキューブ上の形をしていることは最初に説明しました。キューブ型のモデルを目で見たとき、６面あるうちの前面の３面しかプレイヤーの視界に写っておらず、背面の３面は後ろに回り込まない限り見えません。従って、村の表面に10000ブロックあったとしても、最大で10000×3=30000面だけを描画すれば、モニタにマインクラフトの画面が写ります。これは本来あなたのパソコンがやる予定だった仕事を５０％もカットしてくれる画期的な技術です。これはバックフェイスカリングと呼ばれています。

漫画『賭博破戒録カイジ』に班長と呼ばれる人気キャラがいます。彼はシゴロ賽と呼ばれる４，５，６が２つずつ書かれたサイコロを堂々と地下労働者たち十数人の目の前で振ってイカサマをしていました。そのとき彼は「サイコロは誰がどこから見ても同時に３面しか見えないから絶対にバレない。」などとのたまっていました。彼こそがカリングのプロフェッショナルです。

![hancho.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172479/7d3f0b46-df1c-e0da-9f53-0be038cac6d3.png)
出典：賭博破戒録カイジ(c)ﾌｸﾓﾄﾌﾟﾛ／福本伸行

説明したとおり、村の表面 10000 ブロックの地下には 1290000 ブロックが埋まっています。マインクラフトではこの 1290000 ブロックの描画を省略しています。これはオクルージョンカリングと呼ばれており、これによって描画に必要な処理の 130 分の 129 をカットしています。もうほとんど全ての仕事を投げだすほどの凄まじい省略です。

（土、草、石を透明化して村の下を覗いてみた。）
![mc2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172479/c4d51f3d-f22d-259e-9dfa-94b1e8b45a60.png)

もっとシンプルなカリングもあります。プレイヤーの背後には自分の目に見えているのと同じくらいのブロックが 10000 ブロックほどあるはずです。これは全て描画をする必要がないブロックです。これを省略することでパソコンの仕事を５０％カットできます。これはビューフラストカリングと呼ばれています。

他にも自分のいる場所から遠い場所のブロックの描画を省略するカリングや、建築物などの裏にあるブロックの描写を省略するカリング、ギリギリ目に写るくらい遠方にある小さなブロックの描画を単純化するカリング（ミップマップ）など、描画の負荷を削減するために色々な技術が使われています。

# カリングを体験してみよう
実際にマインクラフトの世界でカリングを体験できるリソースパックを用意しました。マインクラフトのブロックは基本的にはカリングがデフォルトで有効になっており、それにより描画の負荷を大幅に削減していますが、やりたい企画によってはカリングが邪魔になることもあります。
以下に地面の一部を透過するリソースパックを用意しました。これで鉄千も簡単になるはずです。しかし、マインクラフトはデフォルトでカリングが有効です。そのままでは仮に表面の土、草、石を透明化しても、そこに埋まっている鉄鉱石がカリングによって描画されません。岩肌から露出している鉄鉱石しか目に見えないのです。
そこで、鉄鉱石のキューブ６面全てのカリングを無効化することによって、地面に埋まっている鉄鉱石もパソコンに描画をしてもらいます。ここでは６面全てのカリングを無効化しましたが、上下の２面だけを無効化したりすることもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172479/7173e4ca-a6d9-d996-4849-75d5593fc13e.png)

・土ブロック、草ブロック、石ブロックを透過、鉄鉱石のカリングを無効化
https://drive.google.com/file/d/1FmXu8pBXC1SszG6Tg6QgToIWfts4_8tI/view?usp=drive_link

・土ブロック、草ブロック、石ブロックを透過
https://drive.google.com/file/d/1t4gXgxyveAL3J1oFq58O8Zp4w9ggJmVe/view?usp=drive_link

# まとめ
マインクラフトって奥が深いでしょ？