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


HSPTV!掲示板


未解決 解決 停止 削除要請

2025
0616
くまHGIMG4でBitBltを使うには13未解決


くま

リンク

2025/6/16(Mon) 07:50:12|NO.103545

HGIMG4でBitBltを使うにはどうすればよいでしょうか?

BitBlt使用時にはhdcを指定する必要があると思うのですが
HGIMG4ではhdcの取得はできないので使うことができません

何年も前におにたま氏が3dishではhdcを使用していないとおっしゃっているので
hgimg4も同様かとは思うのですが
それではbitBltでhdcを指定する所にはいったい何を指定すればいいのか
皆目見当がつかないのでご教示お願いします
https://hsp.tv/play/pforum.php?mode=pastwch&num=78594#78719



この記事に返信する


ねんねこ

リンク

2025/6/16(Mon) 09:46:32|NO.103546

うまくいくかわかりませんが、GetDC関数を使うのはどうでしょうか

#include "hgimg4.as" #uselib "user32.dll" #cfunc GetDC "GetDC" int dialog GetDC(hwnd)



くま

リンク

2025/6/16(Mon) 15:08:17|NO.103549

GetDCとhdcは別物なのでうまくいきません
念の為自分でも確認したので間違いありません
http://hsp.tv/play/pforum.php?mode=all&num=57173



buhio

リンク

2025/6/16(Mon) 15:46:37|NO.103550

こんにちわ。

Bitbltを使われる目的は何でしょうか?(個人的な興味ですが)
hgimg4では、VRAMからの画像データの取得にcelbitmapという命令が用意されていますが、これでは目的がちがいますか?



くま

リンク

2025/6/17(Tue) 07:10:45|NO.103551

こんにちは

BitBltを使う目的ですが、特にありません
HSPを色々触ったりしてるうちにHGIMG4でBitBltを使用できないことに気づき
更に色々触ったり調べたりしてhdcが取得できてないことや
HGIMG4ではhdcを使用していないらしいことを知りました

しかし、redraw命令などはHGIMG4でも使用できていることから
いわゆる裏画面に相当するものは存在してるはずで
であればBitBltのhdcを指定する個所も変わりの何かを入れれば
動作するのではと思った...です

簡潔に言えば気になったからというだけなので
普通にゲームを作ったりする場合はcelbitmapなど既に用意されてる命令で事足りると思います



zakki

リンク

2025/6/17(Tue) 10:13:12|NO.103552

目的がなく呼びたいだけなら、単に呼んでエラーコード返ってきて何も起きなかった、よかったよかったってなっちゃうので…

制限や仕組みは、HGIMG4が使ってるGamePlay3Dが使ってるOpenGLやWGL由来なので、
"OpenGL GDI BitBlt"とかで検索したり、
CなりHSPなりでシンプルなOpenGLサンプル作って挙動確認すると分かりやすいと思います。



窓月らら

リンク

2025/6/17(Tue) 10:22:43|NO.103553

BitBlt(GDI)が仮に使えたとします。
しかしこの処理を挟むことで遅くなることが確実なので、使う理由は無いと思うんですよね。
よって無くても問題ありません。
描画系、サウンド系は、競合が起こる可能性もあってあえて併用する理由がないと思われます。

HSP3Dish/HGIMG4ですが、当初はもっと制限がきつくてAPI呼び出しにも対応しておりませんでした。
後で解放されてユーザーの責任の下でいろいろできるようにはなりましたが、
複数の環境でテストするなどの検証をしっかり行わないとなにが起こるか正直わかりません。



buhio

リンク

2025/6/17(Tue) 11:58:24|NO.103554

>>くまさん
なるほど、なんとなく気になるということもありますよねぇ
デバイスコンテキストは、やっぱWindowsの概念なんでしょうねぇ

<<以下ひとりごと>>
RAM →RAM の BitBlt(CPU メモリ間コピー)
VRAM→VRAM コピー(GPU/ビデオチップによる処理)

だからHGIMG4でBitBltが使えないのはハードウェア仕様的に仕方がない。という理解(しらんけど)
glReadPixelsなど、OpenGLの専用APIを使えば可能(ただし遅い)。
GamePlay3Dを通しているため、VBOなど細かい制御はHSPから行うにはHSP自体を改変して関数を追加しないと難しい。

尚、OpenGLの関数はdllから使用できましたが、HGIMG4の内部データへアクセスすることはOpenGLの仕様から難しそうだったので、
なんとか別の方法を考えるか、ゼロからOpenGLプロジェクトを作るかで思考停止しました。。。
わたくしは素直にcelbitmap(これも遅いけど)にお世話になろう。そうしよう...



usagi

リンク

2025/6/17(Tue) 19:30:29|NO.103555

こんにちわ。

BitBltが使いたいだけなら、GDIのお作法にそって好きなだけビットマップ作って描画し、
その後にbuhioさんがおっしゃられるようにcelbitmapでVRAM転送すれば良いのではないでしょうか?
BitBltのhdcには自分で作ったビットマップを指定すればよろしいかと思います。

皆さんおっしゃられるようにあまり利点は無さそうですがGDIの機能が使いたいのであれば
良いかもしれませんが、ある程度は基本命令で事足りそうかと思いました。
※ちょっと手間は多くかかるかもですね。。。
よろしかったらどうぞ

#uselib "user32.dll" #cfunc GetDC "GetDC" sptr #func ReleaseDC "ReleaseDC" sptr, sptr #uselib "gdi32.dll" #cfunc SelectObject "SelectObject" sptr, sptr #cfunc CreateCompatibleDC "CreateCompatibleDC" sptr #cfunc CreateBitmap "CreateBitmap" sptr, sptr, sptr, sptr, sptr #func GetBitmapBits "GetBitmapBits" sptr, sptr, sptr #func DeleteDC "DeleteDC" sptr #func DeleteObject "DeleteObject" sptr #func BitBlt "BitBlt" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr #func Rectangle "Rectangle" sptr, sptr, sptr, sptr, sptr #include "hsp3dish.as" screen 0, 512, 512 buffer 1,128, 128, screen_offscreen: gsel 0 ; ビットマップ転送用のバッファー ; ビットマップ1 _hdc = GetDC(hwnd) ; ウインドウのデバイスコンテキストを取得 hdcm = CreateCompatibleDC(_hdc) ; メモリデバイスコンテキストを作成(ビットマップを使う為) hbmp = CreateBitmap(128, 128, 1, 32, 0) ; 空のビットマップオブジェクト作成 hold = SelectObject(hdcm, hbmp) ; メモリDCにビットマップをセット ; ビットマップ2 dim bmp, 128*128 : foreach bmp : bmp.cnt = cnt*2 : loop ; 適当なビットマップ配列 hdcm2 = CreateCompatibleDC(_hdc) hbmp2 = CreateBitmap(128, 128, 1, 32, varptr(bmp)) ; 適当なビットマップ配列からビットマップ作成 hold2 = SelectObject(hdcm2, hbmp2) onexit *EXIT *MAIN redraw 0 color 255,255,255 : boxf ; ★hgimg4での描画 x = 0,512,512,0: y = 0,0,512,512: c = $ff0000,$ffff00,$00ff00,$0000ff: gsquare -257,x,y,c ; ★gdiでの描画 ; ビットマップ2をビットマップ1にBitBlt転送 BitBlt hdcm, 0, 0, 128, 128, hdcm2, 0, 0, 0xCC0020/*SRCCOPY*/ ; ビットマップ1に直接矩形を書き込む s = 64-time\64, 64+time\64 : Rectangle hdcm, s.0,s.0,s.1,s.1 ; ビットマップ1をバッファーにコピーする GetBitmapBits hbmp, varsize(bmp), varptr(bmp) ; バッファーを描画 celbitmap 1,bmp : pos 192,192 : celput 1 ; 更新 redraw 1 : await 16 : time++ goto *MAIN *EXIT ; 不要な物を削除 DeleteObject hbmp : DeleteDC hdcm DeleteObject hbmp2 : DeleteDC hdcm2 ReleaseDC hwnd, _hdc end



usagi

リンク

2025/6/17(Tue) 21:52:44|NO.103556

どうせならGDI+と連動すると良いかもです。
Artlet2Dを拡張する形だとスクリプトもシンプルだし便利そうですね。
(速度的にはリアルタイムより、裏画面でイメージ作成用途などでつかうとよき)
BitBltではなくなってしまいますが思い立ったので。。。

#include "a2d.hsp" #include "hsp3dish.as" ; a2dハック--------------------------- #module a2dEx #deffunc alExCopyImageToOffscreen int _src, int _dst alSelectImage _src: alGetBitmapVData size, v: celbitmap _dst, v, 1: return #global ; ここまで--------------------------- screen 0, 512, 512 : buffer 1,512, 512, screen_offscreen: gsel 0 ; Artlet2D を使う alCreateImage 0, 512, 512 if stat = -1 : dialog "GDI+ を初期化できませんでした。" : end *MAIN redraw 0 ; Artlet2D で描画 alColor rnd(255), rnd(255), rnd(255), 128 alDrawLine rnd(512), rnd(512), 256, 256 ; Hgimg4に転送 alExCopyImageToOffscreen 0, 1 ; ★新規命令 ; hgimg4で描画 gradf 0,0,512,512,1,$FF0000, $00FF00 gmode 3,,,255 : pos 0,0 : celput 1 redraw 1 await 16 goto *MAIN



buhio

リンク

2025/6/18(Wed) 13:35:54|NO.103557

https://hsp.tv/play/pforum.php?mode=pastwch&num=96797

調べていたら、GDIについて、とても有用なスレッドだったので再アップさせていただきます。
Artlet2DのヘルプにalGetBitmapVData関数が出てこないな、、、あたしだけかな?秘密の関数なのかな



窓月らら

リンク

2025/6/18(Wed) 15:40:05|NO.103558

alGetBitmapVData はどうやら内部命令ですね。
common > a2d.hsp を開いて検索すればわかります。



くま

リンク

2025/6/18(Wed) 15:42:37|NO.103559

こんにちは

質問の仕方が悪くすみません
余計な背景情報は省いて簡潔にした方がいいかと思ったのですが間違いでした
前の投稿通り現時点で使えては無いけどうまくやれば使えそうだなと思って気になっただけなので
特にメリットデメリットとかはそもそも気にしていません

それはそれとして色々な情報をありがとうございます
そこまで時間が取れてないので改めて少し調べたりした程度ですが
buhioさんの通りbitbltはRAM→RAM用のものだからVRAMへの転送はできない・・・
DsubケーブルでHDMIに挿そうとしても種類違うから無理だけど
という感じの認識であってるのかな?
そしてbitbltを使うだけであればビットマップを作ってしまえば
作ったビットマップ間での転送には使える(ただし画面への描画はやはり別方法になる)
という感じですか

胸を張って理解しましたと言える感じではまだ無いのですが少しスッキリしました
スクリプトまで用意していただき大変参考になりました
ありがとうございました

alGetBitmapVDataは本当に何も情報が出ないですね
a2dのソースを見ると
#deffunc alGetBitmapVData var ps, var pv ; size, vvar
if imgValid { ; LockBits して bitmap image へのポインタを得る rect = 0, 0, imgWidth, imgHeight dim BitmapData, 8 GdipBitmapLockBits imgImage, varptr(rect), 3, PixelFormat32bppARGB, varptr(BitmapData) GdipBitmapUnlockBits imgImage, varptr(BitmapData) ps = BitmapData(0) * BitmapData(1) * 4 ; Width * Height * ByPP dupptr pv, BitmapData(4), ps return 0 } return -1
となっているようです
察するにa2dの内部で使用するためのもので
ユーザーが使用する想定ではないからヘルプには載ってないのかなと解釈しました



buhio

リンク

2025/6/18(Wed) 18:00:19|NO.103560

AI先生が描いてくれた(一部改変)


+-----------+ +-----------+ | | データ読み書き | | | CPU +-----------------> RAM | | | BitBltとか | | +-----+-----+ +-----+-----+ | | | OpenGL(HGIMG4)とか | | コマンド・データ送信 | v v +--------------------------------------+ | GPU | | +-------------------------------+ | | | | | | | VRAM(GPU専用メモリ)| | | | | | | +-------------------------------+ | +--------------------------------------+ | | 描画結果(フレームバッファ) v +-------------+ |ディスプレイ | +-------------+



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.103545への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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