きままにものづくり

日々の気付いたことなんかを書いてます。

OpenGLの勉強(2) ~バッファとは~

こんばんは、even_ekoです。

今日は、考えた方法が全部ダメで行き詰まった日でした。なので、早く帰りました。

プログラミングを楽しく感じるための入口は、予想と違う動きをすることだと思います。なんでこんな動きするんだよ(怒)とか、どうしてそうなっちゃうのみたいなことは、プログラミングをした方は体験したことがあると思います。こんな時はツライですよね。考えれば考えるほど分からなくなってしまい、まるで底なし沼で必死にもがいているような感じになります。実際に底なし沼で、もがいた経験はないですが...。結局、原因は分からないでその日が終わってしまうということもあると思います。

全然分からない...一体何が原因なんだろう。もう、これぶっ壊れてるんじゃないの。こんな状態の時にPCの前を離れて違うことをしてみます。すると、不思議と悩んでたことの全体像がつかめて、たくさん悩んだことがあっさり解決したりします。この体験こそが、プログラミングを楽しく感じるはじまりなんじゃないでしょうか。

なんで、こんなことを書いたのかというと自分のモチベーションを保つためです...

 

前置きが長くなってしまいましたが、今日はOpenGLのバッファについてです。

バッファとは

画像を形成するひとつひとつの点をピクセルまたは画素といいます。OpenGLにおけるバッファとは、ピクセルに関する情報を格納している配列です。バッファの情報を操作することで描画を行います。

バッファには、4つの種類があります。

  • カラーバッファ:色を保存するバッファ
  • デプスバッファ:奥行(z軸の値)を保存するバッファ
  • ステンシルバッファ:描画可能かどうかの情報を保存するバッファ
  • アキュムレーションバッファ:画像を合成していく際に使用されるカラーバッファ

これら4つを合わせたものをフレームバッファといいます。

カラーバッファはどういった用途なのか想像できると思うのですが、他のバッファに関しては難しいと思います。3つそれぞれについて説明していきます。

デプスバッファ

デプスバッファはそのピクセルが奥側にどれだけ離れているのかを示します。

OpenGLは、主に3Dグラフィックスを表現するために使用されます。ディスプレイは2次元なので3次元らしく見せるために様々な処理をしています。この奥行を表現するための処理のパラメータがデプスバッファになります。

ステンシルバッファ

ステンシルバッファが示す情報は、そのピクセルが描画可能かどうかです。どうして、こんなバッファが必要なのかを説明します。

3Dグラフィックスを用いて何かしたい場合は、たいていアニメーションを伴います。アニメーションを実現するためには、素早くかつたくさんの処理を行わなければなりません。

例えば、グランツーリスモのような綺麗なグラフィックのレーシングゲームを作るとします。人それぞれ好みはあると思いますが、私はドライバー視点が好きです。このドライバー視点の時、ピクセルの情報を更新する必要がある箇所は主にフロントガラスの部分です。車内の情報はほとんど更新する必要はありません。理由はほとんど変化がないからです。それなのに、毎回更新していては、計算量が多くなってしまいます。こういった計算を減らしたい時にステンシルバッファは使用されます。

アキュムレーションバッファ

アキュムレーションバッファが保存する情報はカラーバッファと同じで、色に関する情報です。これの用途は様々です。一連の画像を合成画像として蓄積させたい時などに使用します。

 

-参考文献-

  1. Dave Shreiner, Graham Sellers,John Kessenich,Bill Licea-Kane,松田晃一(訳), "OpenGLプログラミングガイド原著第5版",ピエソン・エデュケーション
  2. AaftabMunshi,DanGinsburg,DaveShreiner, 松田晃一(訳)"OpenGL ES 2.0 プログラミングガイド"