あかすくぱるふぇ

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

D3DXCreateTextureの引数とLockRect, SetRenderTargetの成否との関係について記します。
想定しているのは下図のような状況。
無題
・関数の説明
- D3DXCreateTexure
テクスチャを生成する関数。引数としてUsageとD3DFORMATを与える。

- LockRect
テクスチャのデータを読み書きするための関数。

- SetRenderTarget
レンダーターゲットを設定する関数。

・D3DXCreateTextureの引数
- Usage
テクスチャの使われ方を示す引数。
引数の主な値としてD3DUSAGE_DYNAMICとD3DUSAGE_RENDERTARGETがある。
D3DUSAGE_DYNAMICはデータの読み書きを行えることを示す。
D3DUSAGE_RENDERTARGETはレンダーターゲットとして設定できることを示す。

- D3DFORMAT
テクスチャのフォーマットを示す引数。
カラー情報を格納するもの(D3DFMT_A8R8G8B8など)とデプスステンシル情報を格納するもの(D3DFMT_D24S8など)に大別される。

・D3DXCreateTextureの成否
- 複数のUsageを設定すると失敗。
- カラー情報を格納するD3DFORMATは、D3DUSAGE_DYNAMICとD3DUSAGE_RENDERTARGETの両方と組み合わせて設定できる。
- デプスステンシル情報を格納するD3DFORMATは、D3DUSAGE_RENDERTARGETと組み合わせて設定することができない。

・LockRectの成否
- D3DUSAGE_DYNAMICなら成功。

・SetRenderTargetの成否
- D3DUSAGE_RENDERTARGETなら成功。

以上のような条件があるため、下記サイトに示されているような問題が面倒が発生するようです。
http://marupeke296.com/DXG_No43_ZBufferTexture.html

工学社の"はじめてのCUDAプログラミング"のまとめ。
内容が古かったり、分からなかったりしたところを補完します。

・GPUのアーキテクチャ(p.26~28)
演算性能[Flops] = SP数 * SPクロック * 2(積和演算)
メモリバンド幅[bit/sec] = メモリインターフェース[bit] * メモリクロック

・スレッドの階層構造(p.44~46)
1つのGPUで1グリッド。
グリッドは複数のブロックで構成される。1SMで1ブロック。ブロック数はGPUごとに異なる。
ブロックは複数のスレッドで構成される。1SP(CUDAコア)で1スレッド。スレッド数は世代ごとに異なる。

・高速アクセスのコツ
ウォープ:連続するスレッドでは同じ分岐を通るようにする。
コアレッシング:アライメントずれはSharedMemoryを使って解決する。
バンクコンフリクト:SharedMemoryの同じバンクに同時アクセスしない。

バッファオブジェクトやシェーダなどOpenGL拡張機能を使う場合、GLEWを利用するのが一般的かと思います。
ただ、GLEWなしでOpenGL拡張機能を使えるようにすることは可能ですし、それほど手間もかかりません。
余計なライブラリを使いたくない場合などは試してみるとよいかと思います。

まず、使い方の例から。
無題
1. glext.hをインクルード
2. 使いたい拡張関数に対して、PFN”関数名"PROC型の変数を宣言
3. wglGetProcAddress()
4. 拡張関数を使う

・glext.h
OpenGLの拡張機能が宣言されているヘッダファイルです。
OpenGLの公式ページからダウンロードできる安心安全な代物です♪
GLEWなんていらなかったんや!
https://www.opengl.org/registry/

・PFN"関数名"PROCの意味
定義へ移動してみると分かりますが、これは関数ポインタの型です。
関数ポインタの説明は以下のページが分かりやすいと思います。
http://www7b.biglobe.ne.jp/~robe/cpphtml/html03/cpp03009.html
例えば、PFNGLGENFRAMEBUFFERSPROCは、引数が(GLsizei, GLuint), 返り値がvoidの関数ポインタの型ということです。
なお、APIENTRYPはエントリポイント(関数のアドレス)という意味なので、単に"*"と読み替えればよいです。

・wglGetProcAddress()
デバイスドライバから関数のアドレスを取得し、glGenFrameBuffers(という関数ポインタ型の変数)に代入します。
上記リンクにあるように、関数の呼び出しは"関数のアドレス()"で行うので、glGenFrameBuffers()と書くことで、拡張機能を呼び出すことができます。

↑このページのトップヘ