ボクセルの描画を軽くする方法

ボクセルとは?
3D空間において、Minecraftなどの、ブロックで構成されたモノ。
MagicaVoxelなんかも代表例。

大きいものを表示するには描画コストがかかる。
今回は何となく軽くする方法を紹介します。

高レベル
Unityなどのエンジン上だけでもやればできること

1.見えないブロックを表示しない(1)。
これは、Minecraft上などでもやられてる通り、3D描画の中で基本です。
ボクセルならば、隣り合っているブロックどおしの面を描画しないことで、高速化が期待できます。また、6面囲まれていたら表示しないことで、より高速化できます。

2.見えないブロックを表示しない(2)
FPSやTPSならば、必ずカメラというものがあるかと思いますが、カメラに映らないブロックの計算をしないことでより高速化できます。カメラの向きの法線などを計算すれば、見ている方向にあるかがわかります。

3.キャッシュしておく。
キャッシュは大事です。組み立てたブロックのデータをメモリ上にキャッシュしておいて、適切なタイミングで破棄することでより高速化ができます。カメラに映るたびに計算していたら遅くて何もできません。

4.テクスチャを1枚にする。
テクスチャを分けて使う場合は、テクスチャをbind(有効にする)たびに、時間がかかってしまい遅くなってしまいます。テクスチャを1枚にしておけば最初のbindだけでテクスチャを表示できるので、高速化できます。

5.影を消す。
陰影と光源の計算は重いです。ちゃんと他の部分が高速化できてから実装しましょう。あと、シェーダーを使っているならあらかじめコンパイルしておくといいでしょう。

低レベル
著者はOpenGLしかできないのでOpenGLで解説しますが、DirectXでもおそらくできます。

6.カリングを有効にする。
glEnable(GL_CULL_FACE);
これで2倍ぐらい早くなります。これは、立方体を観測するとき、常に3面までしか見えることができない特性を利用して、その見える3面しか描画しないようにするモードです。

7.テクスチャのリピートを使う。
テクスチャのu,vを0~1以外の値を利用するときにどういう風にテクスチャを貼り付けるかという関数がOpenGLにあります。そうすることで、つながった同じブロックに対しては、頂点数を減らし、テクスチャのリピートで対応できるようになります。
glTexParameterという関数を使えばできます。

8.もし、glVertexやglTexCoordなどの、モダンじゃない関数を使っていたら早急にやめる
古いです。VBOを使った方法に変えるとより早くなります。なお、DisplayListは今のモダンなOpenGLでは使わない方がよいでしょう。そもそもVBOならば、どっかのメモリに保持しているはずです

おまけ
9.パソコンを変える
まず、メモリを大容量に、CPUを最新の奴に、GPUも強そうなやつに変えましょう。そして最新のドライバーをインストールします。多少、あるいはかなり速くなります

つまるところ、
頂点数をいかに減らすかがカギです。