一枚のテクスチャ(IDirect3DTexture9オブジェクト)をカプセル化します
(凡例:
読み取り専用
Published)
| サイズ情報 | TotalWidth | |
| TotalHeight | ||
| Format | ||
| Width | ||
| Height | ||
| U | ||
| V | ||
| テクセル | Texels | |
| 設定 | AutoKeep | |
| その他 | Texture | |
| Pool | ||
| Usage | ||
| コンストラクタ | Create |
| デストラクタ | Destroy |
| ファイルI/O | LoadFromFile |
| LoadFromStream | |
| LoadFromTBitmap | |
| SaveToStream | |
| テクセル操作 | PerPixelOperation |
| SetColorKey | |
| BlueToAlpha | |
| Fill | |
| サイズ設定 | SetSize |
| ロック | LockRect |
| UnlockRect |
TotalWidth : UINT TotalHeight : UINT
テクスチャ全体の幅・高さをそれぞれ返します。
多くの環境では、テクスチャの一辺のサイズは2の整数冪(2, 4, 8, 16, ... 256 など)である必要があります。このため、環境によっては、テクスチャのサイズは、SetSizeで設定したサイズや、LoadFromFileなどで読み込む画像ファイルのサイズと一致しないことがあります。
そうした場合、TDGTextureは、その環境で指定可能なテクスチャサイズの制限内で、要求されたサイズの画像を包める最小のテクスチャのサイズを計算してIDirect3DTexture9オブジェクトを生成します。ImageWidth,ImageHeightプロパティは、そうして作られたIDirect3DTexture9オブジェクトの幅・高さを返します。
Format : D3DFORMAT
テクスチャのフォーマットを返します
Width : UINT Height : UINT
テクスチャのうち、実際に画像の格納されている幅。高さを返します。
Texels[0, 0,0] .. Textels[0, Width-1, Height-1] までが、画像の格納されている領域となります。
U : Single V : Single
U = Width / TotalWidth
V = Height / TotalHeight
を、それぞれ返します。 画像の右下隅のテクスチャ座標を生成する時に使えるでしょう。
Texels[level:UINT; x,y:Integer]:DWord
levelで指定されるミップマップレベル ( 0が最上位のレベルです) の、座標 (x, y) にあるテクセルを示します。
このプロパティで得られる値は、D3DCOLORやTColorなどと互換のある値では無く、テクスチャのフォーマットに合わせた値になっていますので、この値から例えば R要素やG要素だけを取り出したい場合には、PhysicalToARGB関数などを使って変換を行う必要があります。
複数ピクセルにわたって連続して書き換える場合は、LockRectメソッドを呼び出してから一連の書き換えを行い、その後UnlockRectメソッドを呼び出すと高速に書き換えを行うことが可能です。
AutoKeep : Boolean
Trueならば、デバイスがロストしたり、解像度が切り替わってDirect3DDeviceが再生成されたときに、テクスチャの内容を自動的に復元します。
デフォルトではTrueです。
Texture : IDirect3DTexture9
このオブジェクトがカプセル化している、IDirect3DTexture9オブジェクトへの参照を返します。
Pool : D3DPOOL
テクスチャがどこに格納されているかを示します。
参照 : Create
Usage : UINT
テクスチャの使われ方を示します。
BorderColor : D3DCOLOR
LoadFromFileメソッドなどで画像を読み込む際に、実際に画像の読み込まれる領域よりテクスチャのサイズが大きい場合、BorderColorで指定された色でテクスチャの空いた領域が塗りつぶされます。
参照 : LoadFromFile TotalWidth
constructor Create(AOwner:TDGCarad; formats:Array of D3DFORMAT; _usage:UINT = 0; _pool:D3DPOOL = D3DPOOL_MANAGED; mipLevel:UINT = 0; debugName:String = '');
TDGTextureオブジェクトを生成します。
AOwnerには、使用しているTDGCaradオブジェクトを渡してください。
formatsには、第一希望から順に使用したいフォーマットを列挙します
_usageで、テクスチャの使い道を指定します。0 または、以下の値が指定できます
| D3DUSAGE_RENDERTARGET | レンダリングの対象として使います。メモリクラスにD3DPOOL_DEFAULTを指定して生成されているリソースである必要があります |
_poolで、メモリクラス(どこにテクスチャを格納するか)を指定します。以下の値を指定できます
| D3DPOOL_DEFAULT | ドライバ側でもっとも適切な場所 (おそらくビデオメモリ又はAGPメモリ) を割り当て、そこに格納します。もっとも高速ですが、Direct3DDeviceのロストや再生成が起こると、内容は消去されっぱなしになります。自動復元の必要の無いリソースに用いてください |
| D3DPOOL_MANAGED | 必要に応じて、デバイスからアクセスできるメモリに自動的にコピーされます。自動復元が利きますので、基本的には全てのリソースはこれを指定して生成されることになるでしょう。ただし、内容をロックなどで書き換える都度、メモリにコピーする処理が必要になるので、毎フレーム内容を全部書き換える必要のあるようなリソースには向きません |
| D3DPOOL_SYSTEMMEM | システムメモリに生成されます。これも自動復元が利きます。環境によってはDirect3DDeviceからアクセスできません。バッファ用途に使うことになるでしょう |
mipLevelで、使用したいミップマップレベルの数を指定します。0を指定すると、最下位レベルのサイズがに1x1ピクセルになるまでミップマップチェーンを作成します。1を指定すると、1レベル(最上位レベルだけ)生成します。
debugNameで、デバッグメッセージに出力される、このテクスチャの名前を指定します。プログラムの挙動とは直接関係ありません。
destructor Destroy;
TDGTextureオブジェクトを解放します。
procedre LoadFromFile(filename:String; qdaName:String = '');
テクスチャへ画像を読み込みます。
filename でBMPファイルの名前を指定します。qdaNameが空文字でない場合は、QDAファイルの中のデータIDと解釈されます。
qdaNameでQDAファイル名を指定します。空文字を指定すると、QDAファイルを用いず、filenameで指定されたファイルを直接開きます。
対応している画像フォーマットはWindows Bitmap(*.bmp)形式のうち、以下のとおりです。
procedure LoadFromStream(source:TStream);
ストリームに格納されたWindows Bitmap形式のデータを、テクスチャへ読み込みます。
procedure LoadFromTBitmap(source:TBitmap);
VCLのTBitmapオブジェクトから、テクスチャへ画像データを読み込みます。
procedure SaveToStream(dest:TStream);
ストリームにテクスチャの内容をWindowsBitmapの32ビット画像形式で書き出します。
上位バイトから順に、A,R,G,B値が入ります。
procedure PerPixelOperation(region:TRect; op:TDGPerPixelOp; data:Pointer); TDGPerPixelOp = function (Sender:TDGTexture; srcColor:DWord; x,y:Integer; Data:Pointer):DWord;
regionで示される矩形領域に対して、コールバック関数opで示される処理を行います。
dataは、コールバック関数opのData引数として渡されます。
region内の一ピクセルにつき、一回ずつopが呼び出されます。opのsrcColor引数には、元のピクセルの色が入るので、返り値として処理後の値を返すようにコールバック関数を設計してください。 この時、srcColorとopの返り値は、テクスチャのフォーマットを考慮しなければならない事に注意してください。
procedure SetColorKey(region:TRect; col:D3DCOLOR);
regionで示される矩形領域内の、colに一致するRGB値を持ったピクセルのα値を0に設定します。
procedure BlueToAlpha(region:TRect);
regionで示される矩形領域内の、B(青)要素をα要素にコピーします。
procedure Fill(region:TRect; col:D3DCOLOR; maskA:Boolean);
regionで示される矩形領域内を、colで示される色で塗りつぶします。
maskAをTrueにすると、α要素には影響を及ぼさずに塗りつぶします。
procedure SetSize(w,h:UINT);
wで示される幅、hで示される高さに、テクスチャのサイズを変更します。
function LockRect(level:UINT; rect:TRect; flags:DWORD):D3DLOCKED_RECT; D3DLOCKED_RECT = record Pitch : Integer; pBits : Pointer; end;
levelで指定されたミップマップレベルの、rectで指定された矩形領域を直接アクセス可能にします。
返り値の D3DLOCKED_RECT.Pitchには、テクスチャの一ラインのバイト数が入り、pBitsにはロックした画像の入っているメモリ領域へのポインタが入ります。
一連のアクセスを終えた後や、他の範囲、ミップマップレベルをロックしたい場合は、必ずUnlockRectを呼び出してください。
Flagsには、0または、以下の値の和を指定します。通常は0か、D3DLOCK_READONLYを指定する事になるでしょう。
| D3DLOCK_NO_DIRTY_UPDATE | デフォルトでは、リソースのロックはダーティー領域(ここからここまでが更新されました、という情報)をそのリソースに追加します。このフラグは、リソースのダーティー状態への変更を防ぎます。 |
|
ロック処理自体に少し時間がかかる代わりに、マウスカーソルの移動など、システムでほかの処理を実行することが可能になります。バックバッファをロックして前面書き換えする時のような、ロックが長時間に及び、システムの応答性に悪影響を与えてしまうようなロックに対して有効だそうです。 |
|
バッファに書き込みを行わない事をあらかじめ宣言した上でロックします。ドライバによっては効率的なアクセスを期待できるようです。 |
procedure UnlockRect;
LockRectによるロックを解除します。