3Dの頂点座標を計算し、物体を3Dに見せる技術であり、大きくわけて物体の動きや位置などの計算を行う「座標計算」とそれらの計算された結果である座標を持つ物体情報を元に、画像に変換する「Shader」の2つの機能で構成される。
OpenGLでは、右手座標系を採用している。この右手や左手というとわかりづらいが、回転をさせるとき、右手系は反時計回りが正方向となり、左手系は時計回りが正方向になることだけと覚えておくと良い。
Shaderとは、主にライティング(光源計算)・シェーディング(陰影処理)とレンダリング(ピクセル化)を実行するためにグラフィック リソースに対して使用するソフトウェア命令の組み合わせである。昔は3Dグラフィックチップが固定で持っていたシェーダのみが利用可能だったが、近年はすべてプログラマブルシェーダとなり、シェーディング処理をプログラムで記述でき表現力が格段に向上している。
OpenGLに代表されるShaderでは、大きくわけて、Vertex Shader(頂点シェーダ)、Flagment Shader(別名:ピクセルシェーダ)、Primitive shader(別名:ジオメトリシェーダ)の3種類が存在する。
Vertex Shaderの役割は言葉の通り、頂点に対する処理を担当する。たとえば、頂点に色を設定しその色によって、物体への色味に影響をさせたり、光源からの光の影響範囲を計算し物体に影響させたり、またテクスチャーは貼ってある座標(テクスチャマッピング座標)を変更することも出来るので、物体の表面のテクスチャーを変更することなど、頂点に関する演出表現を行う場合に利用される。
Primitive Shaderは、Vertex Shaderの後で、Flagment Shaderの前に行われる中間処理で、主に頂点座標を一時的に増やすなどを行うことで、よりなめらかな物体を表現する場合などに利用される。(この機能を持たないGPUもある)
Flagment Shaderは、シェーディングの最終プロセスであり、主に物体情報に貼り付けるテクスチャーに対しての表現処理を行う。たとえば、実際の座標では平面になっているところを、Bumpマッピングなどの特殊な表面処理を行うことで、表面に緻密な凹凸があるように見せる処理など、テクスチャーを生かした演出表現を行う場合などに利用される。
Flagment Shaderではかなりの種類の表現が行え、代表的なものでは以下の演出がある。
GLUTは、OpenGLをC/C++で利用するためのライブラリであり、通常プログラムからOpenGLを利用する場合には必須となるライブラリと考えて良い。
用語 | 解説 |
テクセル | テクスチャーバッファ内のピクセル(Pixel)のことをテクセル(Texel)と呼ぶ |
フラスタム (frustum) | 表示可能空間領域。カメラ(ビューポート)から見える範囲の座標空間を指す。クリッピングなどの機能に関係する。オブザーバから見える、透視除算によって歪んだ空間領域 |
ジオメトリ変換 | 3次元の情報を2次元に変換(転写) |
アフィン変換 | 並行移動、拡大縮小、回転の図形変換 |
射影変換 | 代表的な変換方法に透視法射影がある。3Dモデルを2D座標系に射影する場合この方法では、カメラから遠くのものが小さくなる。(視点を頂点としたピラミッド的な見え方)正射影では3Dとカメラとの距離が考慮されずそのままの大きさが射影される。 |
右手座標系 | OpenGLでは手前の物体ほど値が大きい右手座標系を利用する。(対義語:左手座標系) |
ビューポート | 2D化された射影画像をデバイスなどへその表示領域を設定する。方形の原点がデバイスの左下隅であることに注意。 |
アンチエイリアス化(anti-aliasing) | グラフィックスにおいて、テキストや線画、画像などのグラフィカルオブジェクトを描画したときに現れることのある、ギザギザになった(エイリアス化した)エッジを滑らかにしたり、ぼやかしたりするテクニック。 |
フォグ(fog) | オブザーバからの距離に基づき、背景色へと色をフェードすることによって達成される効果。フォグは、オブザーバに深度の手がかりを与える。 |
フラグメント(fragment) | プリミティブをラスタ化するときに計算された色と深度の値。各フラグメントは、フレームバッファに格納されているピクセルとブレンドする前に一連のテストを通過しなければならない。 |
GLUT (OpenGL Utility Toolkit) | OpenGL Utility Toolkit とは、3次元コンピュータグラフィックス処理のプログラミングインタフェースOpenGLに準拠したC言語のライブラリである。 |
OpenCV | CVとは、Computer Visionの略で元はロボット工学から派生しているが、画像解析や物理演算など3Dグラフィックにも共通で利用される技術も多い。 |
ハイダイナミックレンジ(HDR)レンダリング | 人間が見た感覚というシミュレーションを付加することで、リアルな映像を作り出そうというアプローチ |
VBO | Vertex Buffer Object(VBO)とは、GPU側の頂点データを格納する領域であり、描画呼び出し毎にメインメモリからGPUに毎回データ転送される負荷を緩和させ速度を向上させる機能である。 |
IBO (Index Buffer Object) | 複雑な形状を持つ物体では、面の計算の際に利用する頂点を使い回すことで頂点情報を減らしまたデータ転送量を減らせる為、これら頂点のテーブルをインデックスバッファと呼ぶ。 |
PBO | Pixel Buffer Object(PBO)とは、GPU側にピクセル情報(テクスチャー等)を保存させる領域であり、メインメモリとはDMA転送することで、CPUの負荷やピクセル情報の高速転送を可能にしている。またフレームバッファからのピクセル情報のデータ送受信も行える。 |
FBO | Frame Buffer Object(FBO)とは、オフライン(実際の描画領域ではない)として利用できるフレームバッファであり、RBOとテクスチャオブジェクトを関連付けることでテクスチャへのレンダリングが可能となり.よく利用するものとして自動車ゲームのバックミラーなどに利用できる |
RBO(公式サイト) | Render Buffer object(RBO)とは、通常FBOと共に作成される、RBO自身はテクスチャー的に扱われ、FBOとバインドすることでポリゴンのテクスチャーとして指定できる。 |
ブルーム効果 | 強い光が溢れて見えるような効果。グレア効果ともいう。 |
ミップマップ | 描画の大きさによって、あらかじめ登録された複数の解像度のテクスチャーを自動的に切り替えることで、拡大縮小時の画像の粗を押さえる機能 |
バンプマップ | 平面テクスチャーのα値の部分を面の高さと見なし、擬似的に1ポリゴンの中でも細かい起伏を付けることが出来る技術 |
法線マッピング | テクスチャーのRGB値を、それぞれXYZの法線ベクトル値とすることで、ポリゴンの表面の陰影をよりリアルにみせることができる技術 |
テクスチャユニット | テクスチャマッピングの処理を行うハードウェアのことを,テクスチャユニットと呼ぶ。ユニット数がマルチテクスチャの枚数と合致する。 |
3次元テクスチャー |
フレームバッファ内の呼称 | 役割 |
カラーバッファ | 実際に描画に利用される色情報が格納されたバッファ。ダブルバッファや立体視用(stereo)などで複数存在することも多い。 |
デプスバッファ | いわゆるZバッファ、ポリゴンの描画の順番だけだと重ね合わせが、大雑把になりすぎて表示がおかしくなるため、ピクセル毎にZ座標を持ってピクセル描画時に座標をチェックしピクセル描画することで精度を高める機能 |
ステンシルバッファ | 値を見てピクセル描画の有無が判定できる機能、Zバッファと似ているが、Z値でなく任意の値を設定できる。これにより、鏡面や影の描画、立体同士の集合演算で定義された複雑な形状の描画を効率的に行うことができるようになる。 |
アキュームレーションバッファ | カラーバッファの値を加工するための演算用カラーバッファ。モーションブラーなどのエフェクトに利用される。ロストプラネットでのブラー |
フォーマット名 | 概要 | 制限 |
PVRTC (Power VR Texture Compression) | iPhone独自の独自のテクスチャ圧縮フォーマット。PNG や JPEG などと違って圧縮展開する時間がロスにならず、テクスチャとして読み込んだバイナリファイルがそのままグラフィックスハードウェアで利用できるので効率がいい。 | 1.最小pixelは8以上 2.pixel数は2の累乗 3.画像は正方形 |
ETC1 |
リンク
GPU名称 | 対応テクスチャーフォーマット |
PowerVR SGX | ETC1, PVRTC |
Qualcomm Adreno | ETC1, ATITC, 3DC, PALETTE |
ATI Imageon | ETC1, ATITC, 3DC, PALETTE |
NVIDIA Tegra2 | ETC1, S3TC(DXT), LATC |
ZiiLabs ZMS-08 HD | ETC1, S3TC(DXT), PALETTE |
フォーマット | α付 | FourCC | ピクセル深度 |
PVRTC | RGB | 4bpp | |
PVRTC | RGBA | 4bpp | |
PVRTC | RGB | 2bpp | |
PVRTC | RGBA | 2bpp | |
ATITC | RGB | 'ATC ' | 4bpp |
ATITC | RGBA | 'ATCA' | 8bpp Explicit Alpha |
ATITC | RGBA | 'ATCI' | 8bpp Interpolated Alpha |
S3TC | RGB | 'DXT1' | 4bpp BC1 |
S3TC | RGBA | 'DXT1' | 4bpp BC1 (1bit alpha) |
S3TC | RGBA | 'DXT3' | 8bpp BC2 |
S3TC | RGBA | 'DXT5' | 8bpp BC3 |
ETC | RGB | 'ETC ' | 4bpp |
|DDS|RGB '1TXD' DXT1 '2TXD' DXT2 '3TXD' DXT3 '4TXD' DXT4 '5TXD'
用語 | 概要 |
光源 | 光っている点。点座標で表現され、環境光・拡散光・鏡面光の3つが設定できる。またハードによって光源の設定できる数に上限がある。(通常8個程度)初期値:座標(0,0,1)、環境光 (0,0,0,1)、拡散光(1,1,1,1)、鏡面光(1,1,1,1) |
マテリアル(質感) | 物体の表面にも光源と同じように、環境光・拡散光・鏡面光の3つが設定できる。これにより光源とのマテリアルの値の2つを利用して質感の表現を行う。初期値:環境光(0.2, 0.2, 0.2, 1.0)、拡散光(0.8, 0.8, 0.8, 1.0)、鏡面光(0, 0, 0, 1) |
環境光 (ambient) | |
拡散光 (diffuse) | |
鏡面光 (specular) |
テクスチャーとは、ポリゴンの表面に画像を貼り付けることで少ないポリゴン数で物体表現を向上させる技術であり、OpenGLではテクスチャーオブジェクトを作成し、そこにテクスチャー画像をバインドすることで利用することができる。また特徴的な点として、OpenGLでは、テクスチャ名は内部的には番号(整数)で管理される。
種別 | 関数名 | 機能 |
Texture | InitTexture | テクスチャーをGLuintの配列を通して登録する |
glGenTextures | ||
glDeleteTextures | ||
glTexCoord2f | テクスチャーをポリゴンに貼り付ける | |
glEnable(GL_TEXTURE_2D) | テクスチャーマップを有効にする | |
glDisable(GL_TEXTURE_2D) | フラットシェーディングに戻す | |
glActiveTexture | テクスチャーユニットを切り替える | |
Texture Object | glBindTexture | テクスチャーオブジェクトを設定する |
DrawTexture Extention | glDrawTexfOES |
定数 | 意味 |
GL_TEXTURE_1D | テクチャーの次元を表す。2Dが2次元で、1Dが1次元テクスチャとなる |
GL_TEXTURE_2D | |
GL_PROXY_TEXTURE_2D |
GLint maxTex; glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTex); // ここでは最大テクスチャーサイズの取得
iPhpne3G | iPhone3GS以降 | |
テクスチャーサイズ(GL_MAX_TEXTURE_SIZE) | 1024 | 2048 |
テクスチャメモリ上限 | 24MB | 制限無し |
3次元テクスチャーの上限(GL_MAX_3D_TEXTURE_SIZE) | ||
テクスチャーユニット数(GL_MAX_TEXTURE_UNITS) | 2 | 8 |
ライトの数(GL_MAX_LIGHTS) | 8 | 8 |
const char* res = (const char*)glGetString( GL_VERSION );
glGetString用の定数 | 概要 |
GL_VERSION | OpenGLのバージョン |
GL_VENDOR | GPUの製造会社 |
GL_RENDERER | チップセットの名称と型番 |
GL_EXTENSIONS | 対応している extention の一覧 |
GL_SHADING_LANGUAGE_VERSION | 対応しているシェーダー言語のバージョン |
※この GL_EXTENSIONS に記載されていても、対応していない機能や、逆の対応している場合など、メーカーによってここの記載はいい加減な場合がある。
OpenGLライブラリを実装した機種では、ハードに依存する問題ではあるが、テクスチャーのサイズが、2^n(2のn乗)でなければならないものがあったり、サイズに制限が無い場合でも、描画速度に2倍ほどの違いが発生する。(2^nのサイズの方が約2倍速い)
glBlendFunc(src_factor, dest_factor)を利用する。
src = 元画像(テクスチャー)の色 dest = 描画先画像(つまり、画面バッファ)の色
とした場合、計算式的は、
実際に画面に描画される色 = src * src_factor + dest * dest_factor
合成名 | Src Factor | Dest Factor |
アルファ合成 | GL_SRC_ALPHA | GL_ONE_MINUS_SRC_ALPHA |
加算合成 | GL_SRC_ALPHA | GL_ONE |
乗算合成 | GL_ZERO | GL_SRC_COLOR |
反転合成 | GL_ONE_MINUS_DST_COLOR | GL_ZERO |
スクリーン合成 | GL_ONE_MINUS_DST_COLOR | GL_ONE |
排他的論理和合成 | GL_ONE_MINUS_DST_COLOR | GL_ONE_MINUS_SRC_COLOR |
OpenGLでは、通常のOpenGLの命令の他に次世代命令およびメーカー依存命令などをExtensionと呼び、利用することでGPUの能力を最大限に活用することができる。