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


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
0210
アキアキノヒロロバッファに表示した文字の透過表示方法11解決


アキアキノヒロロ

リンク

2021/2/10(Wed) 09:44:24|NO.92236

黒色で塗りつぶしたバッファに表示した文字を、主画面に透過表示する方法がわかりません。

[gmode 2] (= 透明色付きコピーモード)で [celput] すると、バッファそのままがコピーされ、黒色透過になりません。何故なのでしょうか。ヘルプの解説にある
> RGBがすべて0(完全な黒)のドットは透明色とみなされコピーされません。
は機能していないように思えます。(これは以前からです)
ただ、[mesopt_outline] 等、文字装飾を施していると、その装飾部位だけ透過します。
別に、「GIMP」の透過色処理を試して見ました。バッファに見立てた画面でもって、バッファ同様に黒色で塗りつぶし、文字表示して、プリントスクリーン、画像保存。その画像を「GIMP」で透過色処理して、[celload] したものなら、[gmode 2] でもちろん透過表示できます。
しかし、プログラム上のみでは、どうやったらいいか、考えつきません。[celbitmap] を使うのでしょうか。その正確な使い方もよく分かりません。
[gmode 7] (= ピクセルアルファブレンドコピー)に変えて、ブレンド率[128](= 50%)程度で [celput] すると、文字以外も含めた、バッファ全画面が半透明でコピーされます。これは当然でしょうが、文字以外の部分だけを完全な透過にし、文字だけをそのままコピーするようにはできません。

[gmode] [celput] [gzoom] [gcopy] [grotate] 色々モードを変えたり、組合せを変えてやってみていますが、うまくいきません。

お教え願います。

以上、「HSP3.6β3テストのお願い」の「NO.92230」からの課題です。

別の問題になりますが、法貴優雅さんのスクリプトで使われている [AddFontMemResourceEx] の意味、分かりました。
フォントファイルをコントロールパネルのフォントフォルダではなく、「.hsp」と同じフォルダに置いてやればいいのですね。



この記事に返信する


アキアキノヒロロ

リンク

2021/2/11(Thu) 10:55:24|NO.92243

[gsel]の中で[color : boxf]するのではなくて、[buffer]設定したところで[cls 4](黒)でクリアしてみました。これでもって、[gmode 2] (= 透明色付きコピーモード)で [celput] すると、バッファが黒色透過でコピーされ、文字が表示されました。
バッファに表示した文字の透過表示方法?、という問題はこれで解決したようです。

しかし、「HSP3.6β3テストのお願い」の「NO.92230」からの課題は、この透過表示方法を取り入れてみても、解決しませんでした。
透過だけでなく、拡大縮小も取り入れなければなりません。
拡大縮小は[gmode]を反映しないとのことなので、[cls 4]されたバッファに文字表示したら、黒色透過コピーする前に、一旦、別バッファに倍率を指定して[gzoom]しておきます。この別バッファを、主画面に黒色透過コピーします。
これで、バッファに表示した文字の拡大縮小透過表示ができます。
次に、"hgimg4.as"で[redraw] [gpdraw] したバッファ画面を主画面にコピーした上に、この文字の拡大縮小透過表示をしてみました。すると、文字はしっかり透過表示されましたが、"hgimg4.as"でのバッファ画面が消えてしまいます。
逆に、先に主画面にこの文字の透過表示をしたところに、"hgimg4.as"でのバッファ画面をコピーしてみました。
すると、今度は、"hgimg4.as"表示だけです。当然といえば当然です。ここがうまくいきません。
で、主画面に文字の透過表示をしたら、その主画面に直接 [gpdraw] して"hgimg4.as"表示してみました。
これなら、文字表示と"hgimg4.as"表示ができますが、文字が後ろに行って、前面になりません。そもそも、"hgimg4.as"のバッファ画面の拡大縮小になっていませんし。



アキアキノヒロロ

リンク

2021/2/12(Fri) 16:32:56|NO.92254

苦肉の策として、文字の透過表示は諦めて、拡大縮小のみを考えてみます。

主画面と同じ大きさのバッファを文字とは別色(黒色にかぎらず)で下塗りして、本来の文字設定、文字サイズでそのバッファに表示しておく。このバッファの文字表示範囲を求めておく。(ginfo_mesx : ginfo_mesy)
次に、この文字用バッファを別バッファに望む大きさに拡大縮小しておく。(当然、文字表示範囲も拡大縮小されている)

主画面にHGIMG4で [gpdraw] した後、または、別バッファにHGIMG4で [gpdraw] し、そのバッファを主画面に拡大縮小した後、上の文字用バッファの拡大縮小された文字表示範囲を主画面の望む位置にコピーする。

こうすれば、バッファの文字を望む大きさに拡大縮小して、下地色付きの文字表示となります。文字表示範囲の下地色で、その範囲のHGIMG4の表示が隠れてしまう弊害は我慢することになりますが。



アキアキノヒロロ

リンク

2021/2/14(Sun) 11:34:12|NO.92267

法貴優雅さんにお教え頂いた、しまくろねこさんの「mod_picmes.as」を使ってみました。

オフスクリーンバッファ上のHGIMG4での独自フォントの、主画面への拡大縮小透過表示が可能であること、確認致しました。
HGIMG4の [gpdraw] ならば、[gppbind] 等も正常に拡大縮小表示されています。3Dも拡大縮小表示されてアニメーションします。
これは、HGIMG4の [gpdraw] したところへ、透過処理した文字を1字ずつ表示しているのですから、当然といえば、当然ですが、この文字表示をモジュール化するとともに、「mod_picmes-Editor.exe」も作られた しまくろねこさんには、敬意を評します。
ただ、サイズ、色、ブレンド率、横間隔、角度、縦間隔が設定可能ですが、[mesopt_outline] 等、文字装飾を施すことは難しいようです。



アキアキノヒロロ

リンク

2021/2/15(Mon) 07:00:17|NO.92270

前に、
> [buffer] を [color : boxf] ではなく、[cls 4] (黒)でクリアしたものならば、
> [gmode 2] (= 透明色付きコピーモード)で、黒色透過コピー可能だ
と言いました。
色々と検証すると、確かにその通りなのですが、ここで問題なのは、「HGIMG4」では、画面はバッファを含めて全て、[setcls] されてしまうことです。せっかくの黒色透過が、[setcls] されてしまうのです。
この[setcls] は、明示的に記述されていなくとも、機能していて、既定で [setcls CLSMODE_SOLID(1), $000000] となっているようです。
これを前もって、[setcls 0] としておいて、試すと、これで初めて黒色透過がそのまま通ります。
ただし、[setcls] の画面クリア設定をはずしているので、「mainLoop」で毎回描画が重なってしまいます。これを避けるため、背景として何らかのノード(?)を設定して、画面背景を覆い隠す必要があります。
これさえ施してあれば、法貴優雅さんの求める
> HGIMG4で独自フォントを使い、バッファーの画像を拡大縮小してスクリーンに描画
が違和感なく、再現できるはずです。

一応の解決と致します。



アキアキノヒロロ

リンク

2021/2/15(Mon) 10:45:33|NO.92272

解決としましたが、追記です。

[setcls 0] とした時に、「mainLoop」で毎回描画が重なってしまうのを回避する方法として、背景用ノードで背面を覆い隠すようにする、と言いました。
これでも可能ですが、背景用ノードは用いずに、「HGIMG4」描画用[buffer] を [color (何らかの色) : boxf] で塗りつぶしても可能でした。
ただし、[gpdraw] して「HGIMG4」による描画をするのは、[boxf] で塗りつぶした後です。決して [gpdraw] 命令を先に記述してはいけません。
これを先にすると、「HGIMG4」描画用[buffer] の「HGIMG4」による描画は、[boxf] で塗りつぶされてしまいます。

redraw 0 //gpdraw // ここはダメ color (何らかの色) : boxf gpdraw // ここに記述 // 「HGIMG4」による描画を記述 redraw 1



アキアキノヒロロ

リンク

2021/2/15(Mon) 12:01:04|NO.92273

しつこいようですが、念のため、「HSP3.6β3テストのお願い」の
NO.92220 の法貴優雅さんのもの、NO.92230 の私のものと引き継いだ、まとめとしてのプログラムを載せておきます。
「hsp364/sample/hgimg4」に入れてやってみて下さい。
フォント「マキナス 4 Square」をダウンロードして、その中の"Makinas-4-Square.otf"を、同「hgimg4」フォルダか、コントロールパネルのフォントフォルダに入れてやっています。


#include "hgimg4.as" #include "hsp3dish.as" #include "gdi32.as" GX = 320 GY = 180 SX = 1280 SY = 720 ;………………………………………………………………… // 横/縦方向の表示倍率(実数)を取得 zoomx = 1.0 * (SX / GX) zoomy = 1.0 * (SY / GY) ;………………………………………………………………… onexit *_exit ;………………………………………………………………… // HSPTV!掲示板 NO.27103-[Kpan]さん // hspファイルと同じフォルダに、フォントファイル"Makinas-4-Square.otf"を置いたうえで、 // 同フォルダ内でそのファイルにアクセスする命令 [AddFontMemResourceEx] を使う // そのため、同フォルダ内にないと、正常に実行されないため、有無は [stat] で判断 notesel buf noteload "Makinas-4-Square.otf" AddFontMemResourceEx varptr(buf), strsize, 0, varptr(pcFonts) hFont = stat ;………………………………………………………………… screen 0, SX, SY, 0 gpreset buffer 1, GX, GY, screen_offscreen + screen_usergcopy buffer 2, SX, SY, screen_offscreen + screen_usergcopy cls 4//黒でクリアは、ここでなくとも、[gsel 2] の時点でもよい buffer 3, SX, SY, screen_offscreen + screen_usergcopy ;================================================== setcls 0// ここがキモ ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 // "hgimg4.as" 用 データロード /* // 例).背景用ノード(画面塗りつぶしをしない場合用) gpusermat id_cubemat, "res/shaders/skybox.vert", "res/shaders/skybox.frag" gpmatprmt id_cubemat, "u_diffuseTexture", "res/cubemap.png", GPOBJ_MATOPT_NOMIPMAP|GPOBJ_MATOPT_CUBEMAP gpmatprm4 id_cubemat, "u_voffset", 0,14.0,0,0 gpbox id_sky,-30,-1, id_cubemat setpos id_sky,0,13,0 */ ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 // 例).モデル等読み込み設定 setpos GPOBJ_CAMERA, 0, 2, 5 gpload id_model,"res/tamane2" setpos id_model,2, 0, 0 setscale id_model, 0.01,0.01,0.01 gpact id_model gpbox id_box, 0.5, 0xFF0000 setpos id_box, 0, 3, 0 gppbind id_box, 1, 0.5 gpfloor id_floor, 300,300, $404040 gppbind id_floor, 0 //setreq SYSREQ_USEGPBFONT, 1 ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 *mainLoop title "Mes_W = "+Mes_W+" / Mes_H = "+Mes_H ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ;━━文字専用バッファ [gsel 2] ━━━━━━━━━━━━━━━━━━━━━━ // [SX x SY] = [1280 x 720] [screen 0] と同じ大きさのバッファを // [gmode 2] = 透明色付きコピーモードを使うため、[cls 4] 黒色で塗りつぶしておき、 // ここに本来の "マキナス 4 Square" を、本来の大きさ [60] で、本来の位置 [pos 0, 0] に [mes] する // 文字表示のみなので、[gpdraw] なし gsel 2 //cls 4//黒でクリアは、ここでなくとも、[buffer] 命令の記述時点でもよい redraw 0 color 255, 255, 255 objcolor 16, 16, 16 font "マキナス 4 Square", 60, font_antialias, 6// [outline=6]として明瞭化 pos 0, 0:mes "テスト1234567890ABC", mesopt_outline ;………………………………………………………………… Mes_W = ginfo_mesx : Mes_H = ginfo_mesy // [font "マキナス 4 Square", 60]の場合、プリントスクリーンして測ると、 // 文字表示範囲の大きさは、[540x48]ほどになるようだが、 // 取得値は、[ginfo_mesx = 540 : ginfo_mesy = 59] になっている // [mesopt_outline] 等、文字装飾のスペース確保のためか? ;………………………………………………………………… redraw 1 ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ;━━文字専用バッファ [gsel 3] ━━━━━━━━━━━━━━━━━━━━━━ // [SX x SY] = [1280 x 720] [screen 0] と同じ大きさのバッファ gsel 3 redraw 0 gmode 0, GX, GY pos 0, 0:gzoom SX, SY, 2, 0, 0, GX, GY // [buffer 2] = 大きさ[SX x SY]のバッファの[ 0, 0, GX, GY]の範囲を // 大きさ[SX x SY]の[gsel 3]に大きさ[SX x SY]に[gzoom] redraw 1 ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ;━━文字以外全部専用バッファ [gsel 1] ━━━━━━━━━━━━━━━━━━ // [GX x GY] = [320 x 180] の大きさのバッファ // "hgimg4.as" 用であるので、[gpdraw] 必須。記述位置に注意 gsel 1 redraw 0 // gpdraw// ここはダメ color 0, 255, 0 : boxf// 仮に緑色で塗りつぶし gpdraw// ここに記述。これ以下、[redraw 1] との間に、"hgimg4.as" による描画を記述 color 255 boxf 0, 0, 64, 64 addang id_model,0,0.02 ; ノード回転 redraw 1 ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ;〓〓主画面 [screen 0] 〓〓━━━━━━━━━━━━━━━━━━━━━━━━ ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ // コピー表示のみなので、[gpdraw] なし gsel 0 redraw 0 pos 0, 0:gzoom SX, SY, 1, 0, 0, GX, GY// "hgimg4.as" 用バッファ [buffer 1] のコピー表示 gmode 2// = 透明色付きコピーモードで、[gcopy] を使う pos 0, 0:gcopy 3, 0, 0, SX, SY// 文字専用バッファ [buffer 3] 全体のコピー表示 // [buffer 3] の文字表示範囲部分のみのコピー表示ならば // pos 0, 0:gcopy 3, 0, 0, Mes_W * zoomx, Mes_H * zoomy redraw 1 ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ await 16 goto *mainLoop ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 *_exit RemoveFontMemResourceEx hFont end



アキアキノヒロロ

リンク

2021/2/17(Wed) 11:42:29|NO.92278

[setcls] について、訂正いたします。

> この[setcls] は、明示的に記述されていなくとも、機能していて、既定で [setcls CLSMODE_SOLID(1), $000000] となっているようです。

と言いましたが、これは、間違いでした。明示的に記述されていなくとも、既定で

> [setcls CLSMODE_SOLID(1), $ffffff]

となっていて、"hgimg4.as"では、全ての画面の初期化時に、白色で画面クリアが行なわれます。

「hsp364/sample/hgimg4」の [setcls] を使った全てのサンプルで、[setcls] をコメントアウトしてみて下さい。
どのサンプルでも、メーンループでの[color (何らかの色):boxf] がない限り、毎回の初期化時(メーンループ毎時)に、白色で画面クリアされているのがわかります。
また、[setcls] を使っていない全てのサンプルで、メーンループでの[color (何らかの色):boxf] をコメントアウトしてみて下さい。すると、やはり、メーンループ毎時に、白色で画面クリアされています。
ところが、画面初期化後に( [screen] [buffer] 命令記述後に)、[setcls 0] とすると、画面クリアされず、メーンループ毎の描画が重なっていきます。

以上のことから、やはり、"hgimg4.as"と記述した時点で、

> [setcls CLSMODE_SOLID(1), $ffffff]

となっている、と言えます。これは、[gpreset] や [gpdraw] 以前のことで、[gpreset] [gpdraw] に関わりなく言えるようです。


またもう一つ、「黒色透過が、[setcls] されてしまう」という意味のことを書きましたが、これは正確には

> 「[setcls] された画面に、黒色透過されたものが表示される」

ということです。
[setcls] が明示的に記述されていない場合、クリア画面は白色画面です。また、[setcls 0] としても、画面は白色画面です。しかしこれは、見た目の結果です。
[setcls 0] での画面とは、クリアしない、何らかの色でクリアしない、言い換えれば、その画面は透明だ、ということです。色のない、透明なガラスの画面なのです。
背景黒色( or ある特定な色)で、何らかのものを描画して、その画面の黒色透過( or その特定な色の指定色透過)をしようとする時、この [setcls 0] の透明ガラス画面を使わないと、透過処理したものとして利用することが出来ないのです。
理屈から言えば、透明ガラス画面でなら、[gmode 4] = 透明色付き半透明合成コピーも出来そうですが、これはうまくいきません。..........何故?
背景黒色というのも、曲者です。透明ガラス画面ならば [color : boxf] でも大丈夫と思いましたが、やってみると、透過はしているようですが、画面がちらついて安定しません。これは、特定な背景色での、[gmode 4] でも同様なのです。
正常な透過処理コピーは、 [cls 4] での [gmode 2] でしか出来ません。

この透明ガラス画面でないと、確かに透過処理されても、結局は、その後ろには [setcls] された背景色(白色であっても)があって、透過処理したものとしての利用は不可能。このことが、正確な理解を妨げていたのです。
という訳で、透過処理コピーは、[setcls 0] で、[cls 4] での [gmode 2] を。



アキアキノヒロロ

リンク

2021/2/17(Wed) 17:53:28|NO.92282

すいません、解決としていながら、いつまでも繰返しますことを、お許し願います。

[gpreset] する場合のその位置は、[setcls] のあるなしに関わらず、[buffer] 命令の後では、[buffer] 自体もリセットされて、機能しなくなり、プログラムが強制終了しますので、[buffer] 命令の前にして下さい。これは、当然ですね。
[setcls 0] を明示的に記述する場合に、[gpreset] を使う時は、[gpreset] の位置は、このこと、[buffer] 命令の前であるとともに、[setcls 0] 命令の前でもなければならない、このことも当然です。
また、[setcls 0] 命令の位置は、透過表示しようとしているウィンドウを初期化した後でなければ、なりません。その前では、当然ながら、そのウィンドウは初期化されてしまい、[setcls 0] 命令の意味がなくなってしまいますから。
バッファ画面自体に透過表示しようとするなら、その[buffer] 命令の後ということになるのです。一般的には、[screen 0] に透過表示するでしょうから、[screen 0] 命令の後ならば、どこでも大丈夫でしょう。

以上、追記いたします。



アキアキノヒロロ

リンク

2021/2/20(Sat) 13:28:08|NO.92293

追_追記.)です、すいません。

「HGIMG4」での [buffer] と [setcls] の関係についてです。
[setcls] を使っていない場合、[buffer] に [redraw] 命令することなく、その [buffer] を主画面にコピーすると、黒色になっていますが、[redraw] 命令すると、たとえ何も描画していなくとも、白色になります。
なので、[setcls] を明示的に記述していない、既定のこととしては、[redraw] 命令をした時点で、[buffer] は、
> [setcls CLSMODE_SOLID(1), $ffffff]
となることがわかります。
[setcls 0] としてみると、その [setcls 0] の位置が [buffer] の前でも後でも、[buffer] に [redraw] 命令するしないに関わらず、黒色になります。
この状態で、[gmode 2] で黒色透過コピーすると、その [buffer] は確かに黒色透過でコピーされています。

以上のことから、[setcls 0] すれば、それだけで [buffer] 自体、黒色透過コピー可能な形で設定されるということになります。
なので、「NO.92273」のプログラムで言うと、 [buffer 2] は、 [cls 4] しなくても同様に実行されます。ここをコメントアウトしてみて下さい。

また、「HGIMG4」では、[setreq SYSREQ_USEGPBFONT,0] と明示されていなくても、既定で [res/font.gpb] を使わず、その代りにフリーフォントが使えるようになっていますが、この仕組みも似ているようです。

これはその第一段階で、[font] 命令された時点で、キャッシュ用として未使用のバッファが主画面と同じ大きさで、なおかつ背景黒色で作られる。
第二段階で、そこに文字表示される。
第三段階で、そのバッファ画面がキャッシュされる。
そして第四段階で、そのキャッシュされたバッファ画面を主画面に黒色透過コピーする。

このようにして、フリーフォントの文字表示がされていると考えると、[font] 命令に関わった時、それ用のバッファが背景黒色であった方がスムーズにいきます。
ただし、通常このバッファは明示させることができないので、背景黒色かどうかは確認できませんが、おそらく、この文字専用のバッファはそうなのだろうと思います。
そして、文字専用のバッファでなくとも、[setcls 0] した場合、それと同時に同じように、どのバッファも背景黒色になるのでしょう。



アキアキノヒロロ

リンク

2021/2/20(Sat) 15:37:29|NO.92294

続追_追記.)
オフスクリーンバッファ上のHGIMG4での独自フォントの、主画面への拡大縮小透過表示。

バッファへの、独自フォントの [font] 命令記述時に、その時点で「HGIMG4」の [font] 独自の働きとして、[font] 命令された画面バッファ(オフスクリーンバッファ、仮に、『オフバッファ』)と同サイズで、なおかつ背景黒色の文字専用のバッファ(仮に、『自動バッファ』)が作られ、その『自動バッファ』に [font] 命令(文字表示)された画面がキャッシュされ、そのキャッシュされた画像が黒色透過コピーで、『オフバッファ』に文字表示されることになる。
なので、元々の[font] 命令での文字サイズのものを、特定の倍率に拡大縮小するためには、『オフバッファ』を主画面と同サイズにしておき、その『オフバッファ』を、求める倍率で、新たな『別オフバッファ』に拡大縮小コピーしておく必要があります。
拡大縮小はこれでいいが、キャッシュされた画像を『オフバッファ』に黒色透過で文字表示させることはできません。
何故なら、この時、[font] 命令は、[redraw] 命令で表示するしかないので、その時点でその『オフバッファ』は、 [setcls CLSMODE_SOLID(1), $ffffff] され、このままでは黒色透過に使えないからです。
ところが、[setcls 0] していると、『オフバッファ』は背景黒色となるので、[cls 4] することなく、『別オフバッファ』へ背景黒色で、拡大縮小コピーすることが出来ます。
この『別オフバッファ』も [setcls 0] で背景黒色なので、『オフバッファ』の拡大縮小で隙間が生じても、そのまま主画面へ黒色透過できます。


という訳で、透過処理コピーは、[setcls 0] で、[gmode 2] を。[cls 4]は、ことさらには要しないことになります。



アキアキノヒロロ

リンク

2021/2/22(Mon) 07:47:06|NO.92313

再続追_追記.)
「HSP3.6β5テストのお願い」での、ふにくらさんとのやり取りで気付いたことです。

[celload] [celput] と [buffer] との関係です。今までは、次のように理解していました。

[celload] 命令がされた時、その時点で [buffer] が対象の画像の大きさに初期化される。
そこにその画像が読み込まれる。
[celput] では、その画像だけの大きさになった [buffer] の画像がコピーされる。

こう思っていましたが、どうも次のようになっているようです。

[celload] 命令がされた時、その時点で [buffer] が背景黒色で初期化される。
そこにその画像が読み込まれる。
[celput] では、その [buffer] 全体の画像が黒色透過コピーされる。[gmode 2] 命令は必要ない。

[setreq SYSREQ_CLSMODE,0] か [setcls 0] で、画面クリアをOFFにすると、このことがわかります。
画面クリアをOFFにしたことで、メイン画面も画面クリアOFFとなり、背景黒色の[buffer] 全体の画像がメイン画面に毎フレーム重なってコピーされていきます。
この時、メイン画面は透明なのですが、見た目の表示としては、白色になってしまうので、白黒に明滅しています。



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