あかすくぱるふぇ

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

CUDA samplesのbilateralFilterの中身を解析してみました。

・メモリ領域の確保とデバイスへのコピー(.cuの118行目)
二次元配列を連続領域として確保したいのでcudaMallocPitch()とcudaMemcpy2D()を用いている。
http://www.slis.tsukuba.ac.jp/~fujisawa.makoto.fu/cgi-bin/wiki/index.php?%A5%EA%A5%CB%A5%A2%A5%E1%A5%E2%A5%EA%A4%C8CUDA%C7%DB%CE%F3

・テクスチャメモリ
テクスチャメモリの生成(.cuの17行目)
テクスチャメモリと画像の関連付け(cudaBindTexture2D(), .cuの186行目)
テクスチャメモリの参照(tex2D(), .cuの99行目)
http://gpu.fixstars.com/index.php/%E3%83%86%E3%82%AF%E3%82%B9%E3%83%81%E3%83%A3%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E3%82%92%E4%BD%BF%E3%81%86

・PBOをCUDAからいじる
PBOをCUDAへ登録(cudaGraphicsGLRegisterBuffer(), .cppの401行目)
PBOのポインタを取得(cudaGraphicsResourceGetMappedPointer(), .cppの167行目)
PBOの値をいじる(.cuの114行目)
http://shouyu.hatenablog.com/entry/2011/12/05/192410

・PBOの描画(.cppの178行目)
PBOをテクスチャに設定して、テクスチャマッピング。

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)

↑このページのトップヘ