AlphaLib32 ver4.1

Direct3D 2D Graphics library


概要

Direct3Dを使った2D描画ライブラリ。
私がStgEngine用に必要に駆られて作ったもの(笑


VersionUp情報

 

Version4.2
・8近傍グレイスケールのバグを修正
Version4.1
・αチャンネルマスクの自動生成機能を追加
Version4.0
・クラスの大幅改良
・曲線命令の追加
・デバッグ出力ファイルを「AL32Debug.Txt」に変更
・合成の種類を追加
・その他バグ修正

 



機能・仕様

このライブラリの提供する機能と仕様です。
ふる〜いVGAは根こそぎ却下するような仕様なので、よ〜く読んでね。

必要最低開発環境

・Delphi6(6以外はコンパイルしたことないのでわからない)
・DDDD(QD)
・DirectX7以上をサポートしたVGA(ビデオカード)

こんなかんじ?最近のPCなら動きます(笑

Direct3Dでハードウェアを酷使します(ぉ

Direct3Dを使います。
VGAが対応して無ければこのお話は無かったことに・・(藁
また、テクスチャの仕様上、サイズが必ず2の累乗の正方形という制限が付きます。

ARGBピクセルフォーマットを使います(ぉ
このライブラリの標準ではテクスチャのピクセルフォーマットはARGBとなっています。
むかし〜のものだとこれがサポートされていません。
俗に言う「指定色くり抜き転送」も出来ますが、おまけ機能です。
半透明の描画順番を管理
半透明における奥と手前の描画順位を管理し、レンダリング時にソーティングし正しい順序で転送します。
よ〜するに、物体を手前・奥の順に重ねて転送しても、正しくソートして転送されるよ〜ということです。
ただし、その分全体的なレスポンスは低下します。数万個というパーティクルを表示させることには向いていませんし、最大で8192個までしか一度に転送出来ません。
テクスチャ重複読み込み防止機構

よく、敵キャラをパーツに分けると同じBMPファイルを何枚も読み込む場合があります。こういう場合、同じ内容な訳ですからかなり無駄です。それに、ビデオメモリも限られた資源です。
そこで、同じBMPを重複して読み込んでも、内部で重複をまとめ、一枚に統括する機構を備え付けてあります。

αチャンネル自動生成機能付き
マスクとして使用するαチャンネル画像が無い場合は、自動で黒をくり抜き色とするαチャンネルを生成します。(もちろん機能を切ることも可能)
自分で用意した場合はそれを使用するようになります。



合成の種類

AlphaLib32で使える合成の種類。

PSはPhotoShopの意味。
テクスチャαは、テクセルのARGBのAが合成に考慮されるかどうか。
指定色は、テクスチャカラーとの関係。

合成方法 宣言 説明 テクスチャα 指定色xテクセル
α合成 BM_NORMAL PSの通常合成 乗算
フラッシュ BM_FLASH PSの通常 加算
加算 BM_ADD PSのスクリーン × 乗算
減算 BM_SUB 加算の逆。 × 乗算
乗算 BM_MODULATE PSの乗算 × 加算
反転 BM_NOT PSの差の絶対値? × 乗算
減加算 BM_SUBADD 減算して加算 × 乗算
彩度 BM_DIV

おい焼き?彩度?

× 乗算

減加算合成は、減算した後に加算する合成を指す。
加算に近い合成方法ではあるが、ホワイトアウトしにくい特性を持つ。

※VooDoo2ファミリーにおいては、フラッシュと乗算に支障が出るらしぃ


メソッド・プロパティ

使えるものだけピックアップ(w

プロパティがわからない場合は初期値でままで弄らない方が賢明ですよ。

TAlpha32

メソッド
説明
Create クラス生成
Free クラス解放
DrawPoly 自由形テクスチャ転送
DrawTex 単形テクスチャ転送
DrawCurve 線分連結テクスチャ転送
DrawSuf サーフェイス転送
FillRect 単形塗りつぶし
DrawTexLine 線分テクスチャ転送
DrawLine 線分塗りつぶし
Rendering レンダリング
Clear 画面クリア
SetAspect 画面比設定
LoadTexture テクスチャ読み込み(おまけ)
FreeTexture テクスチャ解放(おまけ)
AL32_DebugMessag デバッグ出力(おまけ)
プロパティ
説明
テクセル・ピクセル座標補正系
LINEARTEXELFIX リニアフィルタ時のテクセル座標修正値
POINTTEXELFIX フィルタを使わない場合
PIXELFIX 転送先座標修正値
別名カリング補正値(w;
クオリティ設定系
ALPHATEXTURE ARGBテクスチャを使うかどうか
初期値はTRUE(ARGB)
FALSEにするとカラーキー(くり抜き色)による転送モードになります。
くり抜き色は黒($000000)固定です。
LINEARFILTER リニアフィルタを使うかどうか
初期値はTRUE(使用)
テクスチャフォーマット設定系
RGBPIXELFORMAT RGBピクセルフォーマット
指定方法は文字列。
ARGBPIXELFORMAT ARGBピクセルフォーマット
指定方法は文字列。
テクセル・ピクセル座標補正系
AUTOALPHAMASK マスク用αチャンネル画像が無い場合、黒をくり抜き色として自動作成するかどうか。
初期値はTRUE。
AUTOALPHAMASKMODE

マスク用αチャンネルを自動生成する場合、どの方法を用いるかを設定する。

AM_BINARY(二値化)
AM_GRAY(8近傍グレースケール)

ぐろ〜ばる♪(便利関数)

Global

定数
説明
AL32_MAXDRAW 最大描画(転送)オブジェクト数。
初期値は8192
AL32_DebugMode デバッグログをはき出すか?
初期設定ではTRUE。
関数
説明
_ARGB 32Bitカラーを作る
_BlendARGB 2つの32Bitカラーをαブレンドする
_ModulateARGB 2つの32Bitカラーを乗算する

 


 

constructor TAlpha32.Create(tQD : TDDDD);

引数
説明
tQD DDDDオブジェクト(クラス/コンポーネント)
解説
クラス生成。
ついでにDirect3Dのビューポートの設定もしちゃいます。ゴメン。
AL32 := TAlpha32.Create(DDDD1);

 

procedure TAlpha32.Free;

引数
説明
なし  
解説
クラス解放。
LoadTextureで読み込んだテクスチャに関しては、解放忘れが有れば勝手に解放してくれるよん(w
AL32.Free;

 

procedure TAlpha32.DrawPoly(
src: TDDDDTexture;
sx1, sy1, sx2, sy2, sx3, sy3, sx4, sy4,
dx1, dy1, dx2, dy2, dx3, dy3, dx4, dy4: single;
col: DWORD;
BM: BLENDMODE;
pri: Integer
);

引数
説明
src 転送元テクスチャ
sx1,sy1.... 転送元座標。
順序は左上・右上・左下・右下でおねがい(w
dx1,dy1... 転送先座標。
順序は転送元座標と同じ。
col 色(ARGB)32Bit
BM 合成方法
Pri 描画優先順序。数が多いほど手前に表示。
解説
四角形ポリゴンを転送します。
四頂点を自由に設定できますが、自由すぎて不便です(笑
AL32.DrawPoly(src,
sx1,sy1, sx2,sy1, sx1,sy2, sx2,sy2,
xx2[0],yy2[0], xx2[1],yy2[1], xx2[2],yy2[2], xx2[3],yy2[3],
Col,BM,pri);

 

procedure TAlpha32.DrawTex(
src : TDDDDTexture;
sx1,sy1,sx2,sy2 : Single;
dx1,dy1 : Single;
sw,sh,r : Single;
col : DWORD;
BM : BLENDMODE;
Pri : Integer
);

引数
説明
src 転送元テクスチャ
sx1,sy1.... 転送元座標。
sx1,sy1が左上座標
sx2,sy2が右下座標
dx1,dy1... 転送先中心座標。
sw 横伸縮率(1.0で等倍)
sh 縦伸縮率(1.0で等倍)
r 回転角度(1.0で360度)
col 色(ARGB)32Bit
BM 合成方法
Pri 描画優先順序。数が多いほど手前に表示。
解説

伸縮・回転を機能を備えた単形(四角形)テクスチャ転送です。

srcにnilを渡せば、テクスチャを伴わない転送も可能。

AL32.DrawTex(BomImg1, 0,0,64,64, 240,360, 1.0,1.0,180/360,
$AAFFFFFF,BM_SUBADD,104);

 

procedure TAlpha32.DrawCurve(
src: TDDDDTexture;
sx1, sy1, sx2, sy2: Single;
dxa, dya: array of Single;
count: Integer;
Size:Single;
col: DWORD;
BM: BLENDMODE;
pri: Integer
);

引数
説明
src 転送元テクスチャ
sx1,sy1.... 転送元座標。
sx1,sy1が左上座標
sx2,sy2が右下座標
dx1,dy1... 線分頂点データ。
Singleの一次配列で指定する。
Count 線分頂点の数
Size 線の太さ。(半径)
col 色(ARGB)32Bit
BM 合成方法
Pri 描画優先順序。数が多いほど手前に表示。
解説

連続線分(曲線)を表示します。
線分と線分の継ぎ目は中間法を用いて補完されます。

srcにnilを渡せば、テクスチャを伴わない転送も可能。

For i:=0 to 15 do
begin
 xx[i] := cos(3.14159265*(i*20)/180);
 yy[i] := sin(3.14159265*(i*20)/180);
end;
AL32.DrawCurve(LineImage,
 0,0,256,32,
 xx,yy,16,
 8,$AAFFFFFF,BM_SUBADD,104);

 

procedure TAlpha32.DrawSuf(
src : TDDDDSurface;
sx1,sy1,sx2,sy2 : Single;
dx1,dy1,sw,sh : Single;
ColorKey : Boolean;
pri:Integer
);

引数
説明
src 転送元サーフェイス
sx1,sy1.... 転送元座標。
sx1,sy1が左上座標
sx2,sy2が右下座標
dx1,dy1... 転送先中心座標。
sw 横伸縮率(1.0で等倍)
sh 縦伸縮率(1.0で等倍)
ColorKey くり抜き色。黒(0)にしてね〜
Pri 描画優先順序。数が多いほど手前に表示。
解説

サーフェイス転送です。テクスチャ転送と混合して使用することが出来ます。
DirectX7ヘルプには、テクスチャとの混合使用は望ましくないそうです。
・・・・使うかどうかはあなた次第・・・・

AL32.DrawSuf(BackImage, 0,0,640,480, 320,240, 1.0,1.0, 0,10);

 

procedure TAlpha32.FillRect(
sx,sy,ex,ey : single;
col : DWORD;
BM : BLENDMODE;
Pri : Integer
);

引数
説明
sx,sy,ex,ey 転送先座標
col 色(ARGB)32Bit
BM 合成方法
Pri 描画優先順序。数が多いほど手前に表示。
解説

単形転送。
画面全域を塗りつぶすときぐらいかな・・・使うとしたら。

AL32.FillRect(0,0,640,480, $88000000,BM_NORMAL,1000);

 

procedure TAlpha32.DrawTexLine(
src : TDDDDTexture;
sx1,sy1,sx2,sy2 : single;
dx1,dy1,dx2,dy2,
size : single;
col : DWORD;
BM : BLENDMODE;
Pri : Integer
);

引数
説明
src 転送元テクスチャ
sx1,sy1.... 転送元座標。
sx1,sy1が左上座標
sx2,sy2が右下座標
dx1,dy1... 転送先線分座標。
dx1,dy1が線分の始点
dx2,dy2が終点
size 線の太さ(半径)
col 色(ARGB)32Bit
BM 合成方法
Pri 描画優先順序。数が多いほど手前に表示。
解説

テクスチャを模様を使って線を引きます。
レーザーとかに使えと言わんばかりです(何

srcにnilを渡せば、テクスチャを伴わない転送も可能。

AL32.DrawTexLine(LineImage,
0,0,256,64,
0,0,320,240, 16,
$AAFFFFFF,BM_SUBADD,104);

 

procedure TAlpha32.DrawLine(
dx1,dy1,dx2,dy2,size : single;
col : DWORD;
BM : BLENDMODE;
Pri : Integer
);

引数
説明
dx1,dy1... 転送先線分座標。
dx1,dy1が線分の始点
dx2,dy2が終点
size 線の太さ(半径)
col 色(ARGB)32Bit
BM 合成方法
Pri 描画優先順序。数が多いほど手前に表示。
解説

線を引きます。AAはしませんからちょっと汚いかも(ぉ

AL32.DrawLine(0,0,ex,ey, 4, $FFFFFFFF,BM_NOT,1000);

 

procedure TAlpha32.Rendering;

引数
説明
なし  
解説

優先順位にしたがってソーティングし、 バックバッファに描画(反映)します。
Flipは各自で行ってくださいね〜。

バックバッファの内容は消去はしませんので、あらかじめ画像を描画しておいて合成させる事も可能です。

AL32.Clear;
AL32.Rendering;
DDDD1.Flip;

 

procedure TAlpha32.SetAspect(w,h : Single);

引数
説明
w 横比
h 縦比
解説

画面描画比を調整できます。

640x480で作っていたものを1280x960で画面イッパイに表示させたいときなどに使います。この場合は縦・横比を2.0にします。

画面を小さくするとマシンパワーの無い人に有効です。が、DrawSufによってサーフェイスも描画している場合は逆に遅くなる場合があります。(伸縮処理により等倍転送の方が断然速いので)

AL32.SetAspect(ClentWidth/640,ClientHeight/480);

 

procedure TAlpha32.Clear(col : DWORD);

引数
説明
col カラー
解説

指定色でバックバッファを消去します。(ついでにZ-Bufferもクリアしちゃうよ)

ただし、このカラーはバックバッファのピクセルフォーマットに依存します。

AL32.Clear(0);

 

function TAlpha32.LoadTexture(
filename : String
) : TDDDDTexture;

引数
説明
filename ファイル名
返り値
説明
TDDDDTexture TDDDDTextureクラス(ポインタ)
解説

ファイル重複機能を用いてテクスチャを読み込みます。
対応画像形式は「.bmp」と「.jpg」です。
アルファチャンネル情報はファイル名の最後に「_A」をつけることで指定します。
カラー画像:Image1.bmp
α画像:Image1_A.bmp

img1 := AL32.LoadTexture('Image1.bmp');

 

function TAlpha32.FreeTexture(
var t:TDDDDTexture
):Boolean;

引数
説明
t 解放するテクスチャ
返り値
説明
Boolean 解放に成功したかどうか(成功がTRUE)
解説

LoadTextureによって読み込んだ場合はこれを使って解放してクダサイ。

AL32.FreeTexture(img1);

 

procedure TAlpha32.AL32_DebugMessage(mes : string);

引数
説明
なし  
解説

AlphaLib32専用デバッグファイルにログを書き出します。

AL32.AL32_DebugMessage('あは〜');