DirectX Graphics レポート No.3
今回は魅惑のアルファブレンドについて書くつもりだが、知っている人は知っているのだが、今から書こうとする文書は実はかなり前に書く事が可能であった。 つまり、アルファブレンドの研究はかなり前に既に完了していたのである。 ではなぜ、今さら書くのかというと、これまた知っている人は知っているのだが、私は就職活動でへこまされてしばらく立ち直れなかったのである。 そして現在もなお、研究が完全に停止状態なのだが、これじゃあイカン!!
話は変わって、アルファブレンドを行いたい時、以前の2D描画の場合は、プログラマが1ピクセルごとに計算して描画する必要があった。 しかし、3D描画の場合はハードウェアがそれをおこなってくれる。 今回の場合、2D描画も3D描画の機能を用いる為、アルファブレンドを行う際はハードウェアの機能を使用する事が可能である。 手続きが多少面倒ではあるが、1ピクセルごとに処理していたことを考えれば非常に楽であり、なにより、高速である。 ちなみに、利用可能なアルゴリズムは「半透明」、「加算」、「乗算」など、必要と思われるものはひと通り揃えられる。 「揃えられる」と書いた理由は、アルファブレンドを利用する場合、プログラマが理論を設定してそれらを実現する必要があるからだ。 手続きが多少面倒である理由はこれにある。
ところで、ある不安が脳裏をよぎった。 スプライトにZ座標を与えて、なおかつそのスプライトをアルファブレンドで表示した場合はどうなるのか。 Z座標を用いれば、後に描画したスプライトを既に描画されているスプライトの後ろに描画する事が可能である事は以前に書いた。 しかし、Zバッファ法の性質上、ある条件下ではアルファブレンドが正しく働かないのではないかと考えたのである。 ある条件下とは、先に描画された半透明のスプライトの後ろに、普通のスプライトを描画する場合である。 期待する動作は、後に描画したスプライトが先に描画した半透明のスプライトを透して見えるというものだが、案の定、残念ながらそうはいかなかった。 後に描画したスプライトは、先に描画した「半透明であるはず」のスプライトに隠れてしまうのである。
この事から、アルファブレンドを用いる場合は、プログラマがあらかじめソートし、後ろから順に描画する必要がある。 ただ、2D描画の場合はそれでも良いが、3D描画の場合はそうはいかない。 なぜなら、ポリゴンを1枚1枚ソートして後ろから描画するというわけにはいかないからだ。 そのため、いくら高速とはいえ、アルファブレンドの多用は考え物である。