hspdxfixのDirect3Dを使った描画命令es_excopyがよくわかりません
ieyasu 2013/8/6(Tue) 14:21:41|NO.56178
hspdxfixのes_excopyについてなのですが、縦横のどちらかもしくは両方が2048ドットを超えるウィンドウ(HSP側)から画像を転送しておいたオフスクリーンバッファから画像コピーを行おうとすると、失敗してしまいます。
これが環境によるものなのか、仕様なのか、スクリプトのミスなのかもよく分かりません。ビデオカードによってオフスクリーンバッファに転送できる画像のサイズが違ったりするようですが、その場合は転送ミスを調べるスクリプトに引っかからないのでしょうか。
;初期化----------------------------------------------------
#include "hspdxfix.as"
#include "hsp3util.as"
es_ini 100,100,360:es_screen 640,480,32,,1,1
screen 0,640,480,0
if stat : dialog"HSPDXFIX : DirectXの初期化に失敗":end
*start
gsel 0:mmstop:es_cls:es_draw:es_sync:wait 100
;--------------------
moji="☆","★"
msx=2048;←画像のサイズ
msy=2048
f=0
*md
buffer 2+f,msx+f,msy;msx+fなのはHSP側のスクリーンのサイズが影響しているのかどうか確かめる為
gsel 2+f
cls 4
color 255,255,255
mx=0:my=0
*md_l
pos mx*16,240
mes moji(f)
if mx<msx / 16:mx+=1:goto *md_l
es_buffer 2+f,0,$FFFFFF,,1
;転送失敗時
if stat=1 {
es_bye
dialog "転送に失敗しました。",1,"Error"
end
}
if f<1{f++:goto *md}
w_x=0:w_y=0:d=0
;----------メインルーチン----------
repeat
getkey l,37:getkey r,39;方向キーで左右に移動
w_x+=(r*5)-(l*5)
if w_x<=0:w_x=0
if w_x>=msx-640:w_x=msx-640
getkey esc,27;escで終了
if esc=1:es_bye:end
getkey c,67;cを押下する度に描画するオフスクリーンバッファを変更
d+=c
if d>1:d=0
;------------描画------------
gsel 0
pos 0,0
es_cls
es_excopy 2+d,w_x,w_y,640,480
es_draw
es_sync 16
;------------------------------------
wait 5
loop
暇人 2013/8/6(Tue) 23:26:52|NO.56183
>これが環境によるものなのか、仕様なのか、スクリプトのミスなのかもよく分かりません
ハード側の制限で制限されたサイズまでしか扱えない
エラーが出ないのは扱えないはずのサイズ以上でもバッファは作られてるから(これは環境依存なのかDX7、hspdxだからなのかは分からない)
es_getbufでHSPバッファに取得してみると分かる(screenに取得した場合redrawしないと見えない)
DirectX7のDirect3Dでテクスチャー最大サイズを取得する方法は良く分からないので
1024ぐらいまでに抑えて分割するかDirectX9のGetDeviceCapsで最大テクスタサイズを取得するか・・・
ieyasu 2013/8/7(Wed) 10:50:02|NO.56188
度々詳しい回答をありがとうございます。
分割する方法で挑戦しようと思います。
暇人 2013/8/7(Wed) 22:31:36|NO.56196
一応作ってみた
DirectX3Dで使用できるテクスチャサイズ取得モジュール
#module
#uselib "d3d9"
#cfunc Direct3DCreate9 "Direct3DCreate9" int
#usecom IDirect3D9 "{81BDCBCA-64D4-426d-AE8D-AD0147F4275C}"
#comfunc IDirect3D9_GetDeviceCaps 14 int ,int,int,int
#define D3DDEVTYPE_HAL 1
#define D3DDEVTYPE_REF 2
#define D3D_SDK_VERSION 32
//使用できるテクスチャーの最大サイズを取得
//dx9_GetTexMaxSize tmaxx, tmaxy
// tmaxx:テクスチャー最大Xサイズ
// tmaxy:テクスチャー最大Yサイズ
//DX9が利用できない時はstatに-1以下が返る
#deffunc dx9_GetTexMaxSize var tmaxx,var tmaxy
dim D3DCAPS9,128
if varptr(Direct3DCreate9) = 0 {return -1} //Direct3DCreate9が無い
newcom objd3d, , -1, Direct3DCreate9(D3D_SDK_VERSION)
IDirect3D9_GetDeviceCaps objd3d,0,D3DDEVTYPE_HAL,varptr(D3DCAPS9)
if stat<0 {
IDirect3D9_GetDeviceCaps objd3d,0,D3DDEVTYPE_REF,varptr(D3DCAPS9)
if stat<0 {return -2} //D3D9_GetDeviceCapsが失敗した
}
tmaxx=D3DCAPS9(22)
tmaxy=D3DCAPS9(23)
delcom objd3d //Direct3DCreate9のcom削除
return 0
//dx9_GetCaps(index)
// index:取得するD3DCAPS9 構造体の場所(0〜127)
//D3DCAPS9構造体については下のURL先を参照
//http://msdn.microsoft.com/ja-jp/library/cc323925.aspx
#defcfunc dx9_GetCaps int index
if index<0 or index>=128 {return 0}
return D3DCAPS9(index)
#global
//モジュールここまで
//使用サンプル
dx9_GetTexMaxSize texmaxsizex,texmaxsizey
if stat <0 {dialog "DX9を利用できません"}
mes texmaxsizex
mes texmaxsizey
D3DDEVTYPE="","D3DDEVTYPE_HAL","D3DDEVTYPE_REF","D3DDEVTYPE_SW"
mes "DeviceType="+D3DDEVTYPE( dx9_GetCaps(0) )
それか
mod_d3d9vsync(ティアリングを無くしFPS安定化)の更新と、ヘルプ
http://hsp.tv/play/pforum.php?mode=pastwch&num=53549
のモジュール使って
#include "mod_d3d9vsync.hsp"
d3d9vsync_init
if stat<0 and stat>-3 {dialog "DX9を利用できません":end}
texmaxsizex=D3DCAPS9@mod_d3d9vsync(22)
texmaxsizey=D3DCAPS9@mod_d3d9vsync(23)
mes texmaxsizex
mes texmaxsizey