2008年02月16日

RHWモード互換の未変換頂点モードをできるようにしておく

PCの画面は下に向かってYが増えているのでRHWのついている
「変換済みモード」は分かりやすく使いやすい。
変換モードに突入してさまざまな点で気に入らないので
互換にしてみることにした。

問題点はVIEWCLIP行列ははずせない点だ。
そこでVIEWCLIP行列でやっている逆をやってやることにした。
今回の件は2DゲームやFlash Playerもみこんでいる。
最初思いついたのは


  1. VIEW行列は単位行列

  2. ortho行列で処理


だ。

その場合Viewclipというか画面幅がwinpo.width、winpo.heightとすると

OrthoLH(projmat^, winpo.width, -winpo.height,0.0, 1.0);

でとりあえずどうにかなる。
Z値は最初から0〜1とこれも互換前提、ようするにスプライト用というところか、
スプライトベースでない場合は別にVIEW行列はあってもよさそうだ。

但しちょっと気に食わないことがある。
この場合画面中央が(0,0)になるのだ。
そこでOrthoを簡略化して以下のようにしてみた。


function OrthoLHW(out mOut: SMatrixf; w, h ,zn, zf: Single): PSMatrixf; //
begin
asm
pxor xmm0,xmm0
movaps [eax],xmm0
movaps [eax+16],xmm0
movaps [eax+32],xmm0
movaps [eax+48],xmm0
end;

with mout do begin
l[10]:=$3F800000;//1.0
l[15]:=$3F800000;
l[12]:=$BF800000;//-1
l[13]:=$3F800000;

d[0]:=2/w;
d[5]:= -2/h;

end;

result:=@mOut;
end;


しかしPROJECTION行列はしょっちゅう呼ぶわけでは無いからこれだったら

OrthoLH(projmat^, winpo.width, -winpo.height,0.0, 1.0);
projmat^.l[12]:=$BF800000;//-1.0
projmat^.l[13]:=$3F800000;//1.0

の方が汎用性が効く。

今回はWindowというかバックバッファの幅でやっているが
VIEWPORTを設定している場合はその縦横を入れてやればいい、
PerspectiveFovLHWは同様というわけにはいかない。
パラメーターを増やすか別関数にするかというところだが

function PerspectiveFov(out mOut: SMatrixf; fovy, x,y, zn, zf: Single): PSMatrixf;

として

PerspectiveFov((PSMatrixf(bp3))^, PI/4, 400,-300, 0.0, 100.0);
projmat^.l[12]:=$BF800000;//-1.0
projmat^.l[13]:=$3F800000;//1.0

とすることで奥行き付で左上が(0,0)の3D系座標設定ができた。
この座標系の良い点はテクスチャーの座標軸と一致している点だと思う。

実はこのYが下の座標系はFlashもなのだが
FlashはZ値はデプス管理だけだが手前が大きい。
直接扱えるわけでは無いのでこれは無理に専用にしないほうがいいだろう。
RHWなんて値は使わないのでバックバッファに直接描き込まない場合は
今回の行列が活きてきそうだ。

ちなみに今回分かったのだが以前Orthoで変換済みモードがどうしても隠れるのは
単にZのスケーリングの問題でクリアになっている。


ラベル:Direct3D9 RHW projection
posted by Xo_ox at 21:00| Comment(0) | Win出直し | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。