あかすくぱるふぇ

同人サークル「あかすくぱるふぇ」のブログです。

glVertex()の代わりとしてglVertexAttrib()、glVertexPointer()の代わりとしてglVertexAttribPointer()が存在します。
これらの関数の存在意義は何か。
それはGLSL(OpenGL)のバージョンと大きく関係しています。

新しいバージョン(GLSL1.5くらいから?)では、gl_Vertexなどの自動で設定されるAttribute変数が廃止となっており、アプリケーションプログラムからglVertex()を呼んだだけではシェーダーによる描画ができなくなっています。
そこで必要となるのがAttribute変数の明示的な設定であり、それを行うのが前述の~Attrib()です。
Attribute変数の明示的設定の手順は以下の通りです。

1. glGetAttribLocation()で、Attribute変数のインデックス(アドレスみたいなもの?)を取得。
  →GLuint appPos = glGetAttribLocation(program, "vertexPos");
2. gEnableVertexAttribArray(appPos)で、Attribute変数を有効にする。
3. glVertexAttrib()で、頂点情報を設定する。
4. glDrawArrays()で描画。

なお、GLSLのバージョン指定は、シェーダープログラムの最初に、#version 120などと書くことによって行います。
この指定をしないとPCに入っているOpenGLのバージョンなどによって挙動が変わってしまいますので、ちゃんと指定した方がよいと思われます。

参考サイト
http://mklearning.blogspot.jp/2014/08/opengl.html
http://wlog.flatlib.jp/item/1633
http://www.arakin.dyndns.org/glsl_qualifier.php

"リファクタリング-既存のコードを安全に改善する-"を読んだので、気になったところをまとめます。

・リファクタリングと機能追加の作業は区分すべき(p.54)
・コードの理解のためにリファクタリングする(p.56)
・インタフェースを変更した場合、古いインタフェースで新しいインタフェースを呼べばよい(p.64)
・リファクタリングを採用すれば、唯一無二の完璧な事前設計をする必要がなくなる(p.67)
・コメントが多い箇所はリファクタリングが必要である可能性が高い(p.77)
・機能追加の際はテストから書き始めよ(p.90)
・テストを書く際に、はじめは失敗するようにしておく(p.95)
・バグレポートを受け取ったら、そのバグを明らかにする単体テストを書く(p.97)
・テストをたくさん書こうとするな。一番妖しいと思う部分からテストせよ(p.97)
・継承のテストは全組み合わせではなく、各選択肢をテストすれば十分(p.101)
・メソッド名の長さは問題でない。メソッド本体との間の意味的な距離が重要(p.110)
・意味のあるメソッド名が思いつかなければ、メソッドは抽出しない(p.111)
・一時変数に値を設定するのは一度だけにすべき(p.128)
・一方があまり起こらない条件である条件分岐ではガード節を使う(p.250)
・switch文はポリモーフィズムに置き換える(p.255)
・例外は、正常処理とエラー処理を明確に分離する点でエラーコードよりも優れている(p.310)
・リファクタリングは何か別の目的を前提とし、その目的を達成するのに必要な分だけやればよい(p.360)

DirectXだけでなく、OpenGLでも同じだと思いますが。

・ウィンドウサイズ
CreateWindow()においてピクセル単位で指定する。

・バックバッファサイズ
CreateDevice()の引数であるD3DPRESENT_PARAMETERSのBackBufferWidthとBackBufferHeightで指定する。
ウィンドウサイズと同じにしないと、後述するビューポートの設定で混乱する。

・ビューポート
バックバッファ中の描画対象領域を指定する。
ウィンドウサイズとバックバッファサイズが同じであれば、ピクセル単位で設定すればよい。
ビューポートをいじっても描画内容自体は変わらない。指定されなかった領域に描画されないだけ。

・トランスフォーム済み頂点(D3DFVF_XYZRHW)
2D描画の場合は、トランスフォーム済み頂点(D3DFVF_XYZRHW)を用いる。
これで、頂点座標がトランスフォーム済み(スクリーン座標)として扱われる。

・UV座標
テクスチャのうち描画する領域を指定。
左上が(0,0)、右下が(1,1)。

・ポリゴン頂点座標
指定した大きさのポリゴン全体に、UV座標で指定した領域のテクスチャが貼られる。
トランスフォーム済みなので、ポリゴンの大きさ=バックバッファに描かれるテクスチャの大きさとなる。
バックバッファ(ビューポート)よりポリゴンが大きいこともあり得る。
その場合は(当然の帰結として)テクスチャの一部が描画されることになる。

↑このページのトップヘ