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


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0303
as9221dfpng画像の透過について9未解決


as9221df

リンク

2018/3/3(Sat) 22:50:45|NO.82613

もともと透過情報を持っているpng画像の透過のさせ方がよくわかりません。
一応調べたのですがうまくいきませんでしたどなたか教えてください。



この記事に返信する


あまら

リンク

2018/3/4(Sun) 00:30:45|NO.82614

HSP標準命令では透過情報は無視されます。

ただほとんど使ったことが無いのでうろ覚えですが
Artlet2Dで透過情報持ちの画像を使うことが出来たような気がします。

もしくは透過PNG対応のプラグイン利用ですかね。



暇人

リンク

2018/3/4(Sun) 04:40:27|NO.82615

標準命令の場合はpicload でモード1を指定した時だけ有効
picloadなのでgcopyのような一部だけ表示とかは出来ない

color 0,60,60 boxf pos 50,16 picload dir_exe+"\\hsptv\\hsptv_img.png",1

描画速度が必要な場合はhgimg系やhsp3dish等を使う
HSPに付属されてない物でもDirectX系のプラグインで透過PNG使えるのはあったと思う



as9221df

リンク

2018/3/6(Tue) 19:00:00|NO.82642

返信が遅れて申し訳ありません。picload1を試してみたらできました。有難うございます。
ただpicload1だとループさせると透過できなくなっていく、gcopyだと縁が透過されない問題が
発生しました。これに解決法は有るのでしょうか?



暇人

リンク

2018/3/6(Tue) 19:58:42|NO.82645

>ただpicload1だとループさせると透過できなくなっていく
半透明で重ね塗りしてるようなものなので
背景が書き換わってないのに再度読み込むとそうなる

あと、picloadのpngアルファ値再現は少しおかしくて
本来透明な部分も重ね塗りされる事で黒くなってしまう
(完全な透明に出来てない)

repeat redraw 0 color 0,60,60 boxf pos 200,200 picload dir_exe+"\\hsptv\\king_knight.png",1 redraw 1 await 16 loop
毎回背景も書き換えれば良い



GENKI

リンク

2018/3/6(Tue) 23:34:16|NO.82651

gcopyを使われるのでしたら gmode 7 を活用する方法があります。
前処理として透過情報を gmode 7 対応に分離する処理が必要ですが、手軽にできるツールがあるので試してみてはいかがでしょうか。

PixelA メーカー
http://mclab.uunyan.com/dl/dl34.htm

他の方も同じようなツールを作られている方がいるので使いやすい方を選んでください。


> gcopyだと縁が透過されない問題が

gmode 2か4で使用していませんか?
2と4が透明にできるのは1色のみです。



as9221df

リンク

2018/3/7(Wed) 00:04:32|NO.82654

>>暇人さん
有難うございました。表示ができました。



暇人

リンク

2018/3/7(Wed) 19:27:11|NO.82665

↓にgmode7用の画像をbufferに作るモジュールを書いたけどバグがあったので
http://hsp.tv/play/pforum.php?mode=pastwch&num=57945

修正したのを↓に

#include "a2d.hsp" //必ず#include "a2d.hsp"の後に挿入 #module //アルファ値付き画像をgmode7で使えるようにidで指定したバッファへ指定サイズ毎に画像を左、アルファ値(グレースケール)を右にして全て縦に並べる //gmode7picload fname, id, sizex, sizey // fname "ファイルネーム" // id = 読み込むHSPバッファID // sizex = 画像が複数キャラからを含んでる時に1キャラのXサイズ(celdivにも設定される)[省略か0の場合画像サイズが使われる] // sizey = 画像が複数キャラからを含んでる時に1キャラのYサイズ(celdivにも設定される)[省略か0の場合画像サイズが使われる] // cpx = celput時の中心X座標 // cpy = celput時の中心Y座標 //statに分割数が返る(celput用の分割数では無い) //celputを使用する時の分割画像Noは 0からの偶数 を使用してください //読み込んだ画像のサイズを知りたいときはalGetWidth()、alGetHeight()を使用 #deffunc gmode7picload str fname,int id,int sizex,int sizey,int cpx,int cpy gsel_bak=ginfo_sel alCreateImageByFile 99, fname if sizex<=0 {_sizex=alGetWidth()}else{_sizex=sizex} if sizey<=0 {_sizey=alGetHeight()}else{_sizey=sizey} divx=(alGetWidth()/_sizex) divy=(alGetHeight()/_sizey) buffer id,_sizex*2,divx*divy*_sizey color boxf alResetCopyMode repeat divx*divy alCopyImageToScreen 99, id, 0, _sizey*cnt, _sizex,_sizey,_sizex*(cnt\divx),_sizey*(cnt/divx) //通常の画像を縦に並べてコピー loop if length(cmatrix)=1 {; アルファチャネルをグレースケールに変換設定値 cmatrix(MAT_R) = 0.0, 0.0, 0.0, 1.0, 0.0 cmatrix(MAT_G) = 0.0, 0.0, 0.0, 1.0, 0.0 cmatrix(MAT_B) = 0.0, 0.0, 0.0, 1.0, 0.0 cmatrix(MAT_A) = 0.0, 0.0, 0.0, 0.0, 1.0 } alCopyModeColorMatrix cmatrix //アルファチャネルをグレースケールに変換設定 alCopyImageToImage 99, 99, 0,0,alGetWidth(), alGetHeight(), 0, 0 //コピー(アルファチャネルがグレースケール画像になる) alResetCopyMode //変換設定を元に戻す repeat divx*divy alCopyImageToScreen 99, id, _sizex, _sizey*cnt, _sizex,_sizey,_sizex*(cnt\divx),_sizey*(cnt/divx) //グレースケールを通常画像の右に縦に並べてコピー loop celdiv id,_sizex,_sizey,cpx,cpy gsel gsel_bak return divx*divy #global //モジュールここまで p_id=1 gmode7picload dir_exe+"\\hsptv\\king_knight.png",p_id,64 title "読み込んだ画像サイズ X="+alGetWidth()+" Y="+alGetHeight() repeat redraw 0 color 0,60,60 boxf pos 200,200 gmode 7 //gmode7picload内でceldivの設定をしてるのでcelputで描画するならコピーサイズを指定する必要は無い celput p_id,0 pos 350,200 celput p_id,2 redraw 1 await 16 loop
直接picloadで描画した時みたいなアルファ値再現がおかしいのは無くなるし
速度的にもpicloadよりは良いと思う



aba

リンク

2018/3/9(Fri) 07:21:26|NO.82685

>alCopyImageToScreen 99, id, 0, _sizey*cnt, _sizex,_sizey,_sizex*(cnt\divx),_sizey*(cnt/divx) //通常の画像を縦に並べてコピー
完全透明ならいいけどこれだと左側の画像はアルファチャネルが適用されて半透明の部分は背景と混ざると思うけど
こんな感じであらかじめアルファチャネル無効にしとかないと
cmatrix(MAT_R) = 1.0, 0.0, 0.0, 0.0, 0.0
cmatrix(MAT_G) = 0.0, 1.0, 0.0, 0.0, 0.0
cmatrix(MAT_B) = 0.0, 0.0, 1.0, 0.0, 0.0
cmatrix(MAT_A) = 0.0, 0.0, 0.0, 0.0, 1.0



暇人

リンク

2018/3/9(Fri) 19:20:19|NO.82689

あ、そう言えばそうですね
gmode7用の右側の画像がα値適用された画像になってしまってた・・・
修正版↓

//必ず#include "a2d.hsp"の後に挿入 #module //アルファ値付き画像をgmode7で使えるようにidで指定したバッファへ指定サイズ毎に画像を左、アルファ値(グレースケール)を右にして全て縦に並べる //gmode7picload fname, id, sizex, sizey // fname "ファイルネーム" // id = 読み込むHSPバッファID // sizex = 画像が複数キャラからを含んでる時に1キャラのXサイズ(celdivにも設定される)[省略か0の場合画像サイズが使われる] // sizey = 画像が複数キャラからを含んでる時に1キャラのYサイズ(celdivにも設定される)[省略か0の場合画像サイズが使われる] // cpx = celput時の中心X座標 // cpy = celput時の中心Y座標 //statに分割数が返る(celput用の分割数では無い) //celputを使用する時の分割画像Noは 0からの偶数 を使用してください //読み込んだ画像のサイズを知りたいときはalGetWidth()、alGetHeight()を使用 #deffunc gmode7picload str fname,int id,int sizex,int sizey,int cpx,int cpy gsel_bak=ginfo_sel alCreateImageByFile 99, fname if sizex<=0 {_sizex=alGetWidth()}else{_sizex=sizex} if sizey<=0 {_sizey=alGetHeight()}else{_sizey=sizey} divx=(alGetWidth()/_sizex) divy=(alGetHeight()/_sizey) buffer id,_sizex*2,divx*divy*_sizey cmatrix(MAT_R) = 1.0, 0.0, 0.0, 0.0, 0.0 cmatrix(MAT_G) = 0.0, 1.0, 0.0, 0.0, 0.0 cmatrix(MAT_B) = 0.0, 0.0, 1.0, 0.0, 0.0 cmatrix(MAT_A) = 0.0, 0.0, 0.0, 0.0, 1.0 alCopyModeColorMatrix cmatrix repeat divx*divy alCopyImageToScreen 99, id, 0, _sizey*cnt, _sizex,_sizey,_sizex*(cnt\divx),_sizey*(cnt/divx) //通常の画像を縦に並べてコピー loop cmatrix(MAT_R) = 0.0, 0.0, 0.0, 1.0, 0.0 cmatrix(MAT_G) = 0.0, 0.0, 0.0, 1.0, 0.0 cmatrix(MAT_B) = 0.0, 0.0, 0.0, 1.0, 0.0 cmatrix(MAT_A) = 0.0, 0.0, 0.0, 0.0, 1.0 alCopyModeColorMatrix cmatrix //アルファチャネルをグレースケールに変換設定 repeat divx*divy alCopyImageToScreen 99, id, _sizex, _sizey*cnt, _sizex,_sizey,_sizex*(cnt\divx),_sizey*(cnt/divx) //グレースケールを通常画像の右に縦に並べてコピー loop alResetCopyMode //一応変換設定を元に戻しとく celdiv id,_sizex,_sizey,cpx,cpy gsel gsel_bak return divx*divy #global



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