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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
1115
きのよーhgimg3のテクスチャに描画10解決


きのよー

リンク

2013/11/15(Fri) 00:52:22|NO.58113

hgimg3だと、texloadやtexload2でファイルからscreen 3を通じてテクスチャを描画(登録)できますが、
プログラム側で処理した画像を登録させる場合
settex
を使う方法しか知りません。
ただこれだとどうしても重くなってしまうので、hgimg3の命令か何かでテクスチャを描画する方法を探しています。
具体的にしたいことは、3Dオブジェクトにテクスチャを貼る際、拡大縮小を施した画像を表示させたいです。
なにか方法はありますか?回答よろしくお願いします。



この記事に返信する


暇人

リンク

2013/11/15(Fri) 20:38:30|NO.58118

具体的な仕様が分からないと有効な方法は分からない
HSPのバッファを経由し尚且つ常に内容が変化する場合
HSPバッファに描画→HSPからテクスチャにコピー
になるのでどんな方法でも一定の処理時間はかかる
settexはカラーキーを透明化してるので単純にコピーするよりは時間がかかってる(内部処理は1ドットずつビデオメモリに入れてる)
逆に言えば透明カラーキーを有効にしたい場合はsettexより早い方法は無いかもしれない・・・
(カラーキーが黒限定なら方法が無い事も無いが)

場合によっては、HSPバッファを経由せずにテクスチャーにする方法が使える可能性はある
一部はsettexを使って他は別の方法などで切り分けたり



きのよー

リンク

2013/11/20(Wed) 21:52:42|NO.58319

返信が遅れてすみません…
仕様としては、現在はbufferに描画してsettexで読み込んでいます。
ただこれだと遅いので、その他の方法でテクスチャに描画する方法を質問しました。わかりづらくてごめんなさい。
一番の目標みたいなものは、テクスチャに直接描画するようなことができるのかどうか…ということです。
矩形や画像(他のbufferに描画されているもの)などがテクスチャに直接書き込むことができればいいです。
そのような命令や方法はあるのでしょうか…?



暇人

リンク

2013/11/21(Thu) 00:08:23|NO.58328

>仕様としては、現在はbufferに描画してsettexで読み込んでいます。
それの規模(テクスチャサイズ、数)や透明色は使うかなんかが聞きたかったんだが・・・
settexが遅いってどの程度遅くてどれぐらい軽減できれば良いのか

テクスチャに描画する方法(hgimg3じゃ無い命令)は幾つかあるが
何を描画したいのか(用意した画像、boxfとか)そのテクスチャを使った
3Dオブジェクトの使い方(他のオブジェクトと混在するのか)や透明色の有無で
使えない可能性もあるので仕様を聞いてる

bufferに描画したものを使い
黒以外の透明色も必要ならNO.58118 で言ってるようにsettexより速い方法は無いと思う
その場合使い方を工夫するしかない



きのよー

リンク

2013/11/21(Thu) 18:37:47|NO.58341

そういうことでしたか、すみません。

透明色は黒以外使いません。
また、使う大きさは512x1024を7枚、同じテクスチャに詰め込んでいます。
合計で512x7168です。
ただ、将来的に402x402を7枚、とすることも考えています。

使い方としては、ゲームの選曲画面風の設定画面です。
背景のプレート、座標を少しだけずらして文字のプレート(背景透過)、
そしてそれらの間に質問のテクスチャを貼り付けたプレートを挟み込む形をとっています。
また、7枚というのはそれを7枚用意し、矢印キーを押すことで回転しているように見せています。
その画像をアップしました。下のリンクです。
https://docs.google.com/file/d/0B1knS-5B1F2iLVUxdXk2eTkxVFE/edit
質問したテクスチャの使い道は、ジャケット画像を表示するプレートに貼り付けるものです。
画像のように、縁+ジャケット画像、というものを7枚貼り付けるテクスチャになっています。
テクスチャにはジャケット画像を7枚ストックしておくだけです(事前にbufferにいくつもストックしておき、それを選択状況に応じてテクスチャにコピーします)
テクスチャの書き換えは矢印キーを押した際(選択対象を変えるとき)に行います。
矢印キーを長押しするとくるくる回るので、その場合で常に書き換えることになります。

このような仕様になっています。
何か方法はあるでしょうか…?



暇人

リンク

2013/11/22(Fri) 01:46:26|NO.58371

ん?
この使い方ならsettexを使うのは数フレームに1回で済むんじゃない?

>矢印キーを押すことで回転しているように見せています。
これの時に全部のテクスチャ書き換えてるって事?
オブジェクトの方を回転してるように動かせば良いんじゃない?

#include "hgimg3.as" hgini selmax=15 repeat selmax bufid(cnt)=10+cnt buffer bufid(cnt),512,512 picload dir_exe+"\\hsptv\\sozai"+(cnt+1)+".jpg",1 font "MS ゴシック",64 color 255 mes (cnt+1) loop repeat 3 gsel bufid(cnt) settex 512,512 texid(cnt)=stat addplate m_pid(cnt),1,20,40,0,0,512,512,texid(cnt) regobj o_pbj(cnt), m_pid(cnt) setpos o_pbj(cnt),-25+cnt*25 loop clscolor $4040 *main stick k,$f sel=0 if stim {stim--} if k=1 and stim=0 {stim=10:sel-1} if k=4 and stim=0 {stim=10:sel+1} if sel {//移動した selindex=(selindex+sel+selmax)\selmax //左側に来るbufidの要素数 repeat 3 setpos o_pbj((selindex+cnt)\3),-25+cnt*25 //左側に来るオブジェクトIDをo_pbj(selindex)とする loop if sel>0 {//左に移動 gsel bufid((selindex+2)\selmax) //左側の要素数に2を足して右側の要素数にしてバッファIDを取り出す settex 512,512,0,texid((selindex+2)\3) //右側に来るオブジェトが使用してるテクスチャIDに転送 }else{ gsel bufid(selindex) //左側のバッファIDを取り出す settex 512,512,0,texid(selindex\3) //左側に来るオブジェトが使用してるテクスチャIDに転送 } } hgdraw hgsync 16 if k&128 : goto *owari goto *main *owari end



暇人

リンク

2013/11/22(Fri) 21:45:56|NO.58378

NO.58371のは使う画像の数が3で割り切れないとおかしくなるのと
使うオブジェクト一つ増やして回転演出入れて修正

#include "hgimg3.as" hgini buf_selmax=15 repeat buf_selmax buf_selid(cnt)=10+cnt buffer buf_selid(cnt),512,512 fname_sel(cnt)=dir_exe+"\\hsptv\\sozai"+(cnt+1)+".jpg" picload fname_sel(cnt),1 font "MS ゴシック",64 color 255 pos 64,32 mes (cnt+1) loop //使用するオブジェクト数 obj_selmax=4 //必ず偶数にする必要がある(停止中に画面に見えるのは偶数個だが回転中一時的に一つ多く必要になるので) obj_r=(M_PI/2)/obj_selmax //45度をobj_selmax等分する obj_posz=-70.0 //オブジェクトのカメラからの距離 obj_lry=obj_r*(obj_selmax/2-1) //一番左のオブジェクトの角度 obj_next_lry=obj_r*(obj_selmax/2) //次に一番左に来るオブジェクトの角度 obj_next_rry=obj_lry-obj_r*(obj_selmax-1) //次に一番右に来るオブジェクトの角度 getpos HGOBJ_CAMERA,cpx,cpy,cpz repeat obj_selmax gsel buf_selid(cnt) settex 512,512 tex_selid(cnt)=stat addplate m_pid(cnt),1,20,40,0,0,512,512,tex_selid(cnt) regobj o_pid(cnt), m_pid(cnt) setang o_pid(cnt),0.0,obj_lry-obj_r*cnt,0.0 //画面左側から右にずらしてく getang o_pid(cnt),orx,ory,orz fvset fv, 0.0,-ory, 0.0 fvdir fv, 0.0, 0.0, obj_posz fvadd fv, cpx,cpy,cpz setpos o_pid(cnt),fv,fv(1),fv(2) loop clscolor $4040 //一つ移動するフレーム数を指定 rotfps=20 //中央が1番目の画像になるように指定 start_index=-(obj_selmax/2-1) *main stick k,$f,0 if stim=0 { if k=32 {gsel 0:screen 100,,,,ginfo_wx2,ginfo_wy1:picload fname_sel(center_index):title fname_sel(center_index)} if k=1 {start_index=-1} if k=4 {start_index=1} if (start_index ! 0) { //start_indexが0になるまで回転 next_f=1 stim=rotfps sel=start_index/abs(start_index) //回転方向設定 start_index-sel //start_indexを一つ減らす } }else{ if k=32 {stim=1} //回転演出カット } if next_f {//変更した next_f=0 //左側に来るbuf_selidの要素数 buf_index=(buf_index+sel+buf_selmax)\buf_selmax //+buf_selmax)\buf_selmaxはbuf_indexがマイナスにならないようにしてる center_index=(buf_index+(obj_selmax/2-1))\buf_selmax //中央に来る画像の要素数 //左側に来るオブジェクトIDが入ってる配列要素数 obj_index=(obj_index+sel+obj_selmax)\obj_selmax if sel>0 {//左に回転 index=(obj_index+(obj_selmax-2))\obj_selmax//右側に来るオブジェクトIDの要素数 setang o_pid(index),0.0,obj_next_rry,0.0 getang o_pid(index),orx,ory,orz fvset fv, 0.0,-ory, 0.0 fvdir fv, 0.0, 0.0, obj_posz fvadd fv, cpx,cpy,cpz setpos o_pid(index),fv,fv(1),fv(2) gsel buf_selid((buf_index+(obj_selmax-2))\buf_selmax) //右側から次に出てくる画像のバッファIDを指定 settex 512,512,0,tex_selid(index) //右側に来るオブジェトが使用してるテクスチャを更新 }else{//右に回転 setang o_pid(obj_index),0.0,obj_next_lry,0.0//左側に来るオブジェクトIDの要素数(obj_index) getang o_pid(obj_index),orx,ory,orz fvset fv, 0.0,-ory, 0.0 fvdir fv, 0.0, 0.0, obj_posz fvadd fv, cpx,cpy,cpz setpos o_pid(obj_index),fv,fv(1),fv(2) gsel buf_selid(buf_index) //左側側から次に出てくる画像のバッファIDを指定 settex 512,512,0,tex_selid(obj_index) //左側に来るオブジェトが使用してるテクスチャを更新 } gsel 0 title ""+center_index+"  "+fname_sel(center_index) } if stim { stim-- if stim=0 {//回転終了 sel=0 repeat obj_selmax index=((obj_index+cnt)\obj_selmax) setang o_pid(index),0.0,obj_lry-obj_r*cnt,0.0 getang o_pid(index),orx,ory,orz fvset fv, 0.0,-ory, 0.0 fvdir fv, 0.0, 0.0, obj_posz fvadd fv, cpx,cpy,cpz setpos o_pid(index),fv,fv(1),fv(2) loop }else{//回転処理 repeat obj_selmax addang o_pid(cnt),0.0,(obj_r/rotfps)*sel,0.0 getang o_pid(cnt),orx,ory,orz fvset fv, 0.0,-ory, 0.0 fvdir fv, 0.0, 0.0, obj_posz fvadd fv, cpx,cpy,cpz setpos o_pid(cnt),fv,fv(1),fv(2) loop } } hgdraw hgsync 16 if k&128 : goto *owari goto *main *owari end
回転停止中はオブジェクト一つが画面外にあるので
選択変更されたらそのオブジェクトのみテクチャを書き換えてる



きのよー

リンク

2013/11/23(Sat) 20:12:07|NO.58397

なるほど、画面からはみ出たオブジェクトのみを書き換えて、連続的に移動してるんですね…
回転動作には、ダミーオブジェクトと親子設定を使ってました。全部repeatで指定してみることにします。

問題的には解決したのですが、hgimg3じゃないテクスチャの描画方法を教えていただけないでしょうか。
またいつか使うときに活用したいと思うので、よろしくお願いします。



暇人

リンク

2013/11/23(Sat) 21:45:17|NO.58404

>hgimg3じゃないテクスチャの描画方法を教えていただけないでしょうか。

http://hsp.tv/play/pforum.php?mode=pastwch&num=53162
のNO.53363にhgimg3側の画面をHSPバッファにコピーするのをやってるけど
これの逆をやる感じ
自分の環境だとsettexの半分ぐらいの処理時間になる
透明色は使えない(描画も自前でやれば出来るかもしれない)

ただHgimg3のテクスチャIDは使えないので大元のテクスチャのCOMポインタが必要なんだけど
これを取得する命令がXモデル用にしか無い
XモデルにテクスチャID変更する命令はあるので
組み合わせれば一応は取得できる・・・

今作ってるモジュール(かなり放置ぎみだが)ではDirectXが管理してるデバイスバッファを直接参照して使ってる

後はテクスチャに直接レンダリングする方法
これは使う画像を予めテクスチャにする必要があるので
今回みたいな使い方の場合そのままモデル作れば良くなるので意味無い



きのよー

リンク

2013/11/24(Sun) 15:46:58|NO.58432

なるほど…直接内部のポインタを触るんですね。
私が知っている知識を大幅に外れてしまって、プログラムを見ていても何をしているのか全くわからない状態…
もっと色々と勉強してから触れてみることにします。
暇人様、本当にありがとうございました。m(_ _)m



きのよー

リンク

2013/11/24(Sun) 15:47:14|NO.58433

また解決つけ忘れてた…



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