HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0806
ieyasuhspdxfixのDirect3Dを使った描画命令es_excopyがよくわかりません3解決


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



ONION software Copyright 1997-2023(c) All rights reserved.