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


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0310
まぐhgimg3の解像度について7未解決


まぐ

リンク

2016/3/10(Thu) 17:36:50|NO.74849

hgimg3にて解像度を1024x768に設定してDirectXを初期化しました。

bgscr 0,1024,768,0
hgsetreq SYSREQ_DXMODE,1
hgsetreq SYSREQ_DXWIDTH,1024
hgsetreq SYSREQ_DXHEIGHT,768

しかし、使用しているグラボやモニターの解像度が異なるPCで実行すると、
pos,hgrotate命令で描画したテクスチャの位置がずれてしまいます。
どのグラボ、モニターでも位置ずれを起こすことなく描画する方法はないでしょうか。



この記事に返信する


kanamaru

リンク

2016/3/10(Thu) 17:41:57|NO.74850

ginfoで画面の解像度を取得し、
取得した値を用いてDirectXを初期化すればいいと思います。



まぐ

リンク

2016/3/10(Thu) 23:40:18|NO.74855

konamaruさん、
返信はありがたいですが、ちゃんとやってみた結論でしょうか?
申し訳ありませんが憶測で言われても困ります。

1024x768と強制で解像度を指定しているのは、制作しているコンテンツの解像度の理由から
この解像度でやらざるを得ない状況だからです。
konamaruさんの言う通り、ginfoで解像度を取得し1024x768に満たない環境ではdialogで
強制終了させることはしています。
ただ今回の件は、例えば1920x1080の環境を上記のプログラムで1024x768に初期化し、
posとhgrotateで描画を行たっときと、
1280x720の環境で上記プログラム1024x768に初期化して行ったのでは
描画先にずれが生じてしまい困っています。簡単に言うとpos 100,100でhgrotateとしたとき
同じ1024x768で初期化をしていても1920x1080と1280x720の環境ではpos先が違ってしまうと
いうことです。1024x768で初期化をしているなら、pos命令で同じ描画先に描画するのは可能
だと思っているのですが、なぜずれが生じるのかわかりません。
わかる方おりましたら教えてください。



kanamaru

リンク

2016/3/10(Thu) 23:50:41|NO.74856

それは失礼しました。
まぐさんのいうとおり、憶測で言った部分があります。
しかし、コンテンツの都合で解像度を変えられないということを質問に含めて欲しかったです。
解像度を変えない前提で話を進めますが、
スケーリングを行ったらどうでしょうか。
例えば、僕が学校で使っているパソコンは1366*768なのですが、
固定する解像度は1024*768とのことなので、
171pxごとでしょうか。
左右に黒い部分を作り、その内側のみに描画します。
そのようにすれば、モニターの解像度に関係なく、
posの座標がずれないと思います。



KA

リンク

2016/3/11(Fri) 07:42:30|NO.74858

>>申し訳ありませんが憶測で言われても困ります。

憶測で答えざる負えない質問内容の方が困りますよ?

後出しじゃんけんをするのなら、回答者に敬意を表しましょう。



SOU1

リンク

2016/3/11(Fri) 10:43:58|NO.74861

> kanamaruさん
「スケーリング」というのはいわゆる拡大縮小の事を指すと思うので
この場合「周囲に黒枠を」というアプローチだとスケーリングと言わないかも。蛇足ですが。

> まぐさん
仰る環境を気軽に用意/再現出来るわけでないので憶測というより可能性論ですが、
そもそも「結果的に望む解像度に初期化出来なかった」可能性があります。
(故に描画ズレも発生する)
これも当然ハードウェアやドライバの仕様に起因する物です。

端的な打開策でなくて申し訳無いですが、
そもそもhgimg3のメリットを最大限享受する為には
直接描画命令をなるべく避け、解像度を意識しないようにしておくのがより良いかと思います。
とはいえ方法論は幾つかあります。

・hgrotateをやめてaddplateなどを活用するようにする
・やりたかった解像度と実際の解像度の差異を倍率として予め調べておき、
 直接描画命令の都度拡大縮小するか素材を読み込んだ際に予め解像度を変えておく
・バッファとするウィンドウIDに描画を済ませておいてから拡大表示

どの手法でも「画面解像度のアスペクト比の調査が重要」になる事も忘れないで下さい。
「hgimg3を使用したい理由」や「作りたいコンテンツ」が分からない以上最適解をオススメしにくいですが、
2Dゲームや3Dゲームをhgimg3でやる、という事であればaddplate等に移行するのをオススメします。
「デスクトップ定規」的なコンテンツであれば確かに素材の解像度を重視すべきですが、
ゲームとかでは素材の解像度に縛られる必要はありませんよ。



まぐ

リンク

2016/3/15(Tue) 15:42:03|NO.74925

SOU1様
 返信ありがとうございます。

>そもそも「結果的に望む解像度に初期化出来なかった」可能性があります。
>(故に描画ズレも発生する)
>これも当然ハードウェアやドライバの仕様に起因する物です。

そうなんですよね。私もそれはあるかなと思いました。
色々やってみたのですが、NVidia(GeForce)だと自動的に解像度を変更してくれますし、
アスペクト比がいくつだろうが、posの指定ポジションに描画してくれました。
Radeon,Intelだとズレます。1024x768とわかっているので、素材の解像度はいくつに
すればいいかなどはわかっていましたので、予め指定して用意しアプスケは行わないで
描画してます。しかし、こういった現象がドライバによって引き起こされてるのだとしたら
素材の解像度やアプスケ機能を使うとGeForceに影響が出るのではないかと思っています。

念のため確認させて頂きたいのですが、画面の初期化を私は
bgscr 0,1024,768,0
cls 4
hgsetreq SYSREQ_DXMODE,1 ; フルスクリーンモードを指定
hgsetreq SYSREQ_DXWIDTH,1024 ; フルスクリーン解像度X
hgsetreq SYSREQ_DXHEIGHT,768 ; フルスクリーン解像度Y
hgini
dmmini
gsel 0,2
としているのですが、上記の記述では間違ってますでしょうか。
時間をとらせて申し訳ないのですが、間違いがあればご指摘頂けますと助かります。
宜しくお願い致します。



SOU1

リンク

2016/3/17(Thu) 23:32:22|NO.74939

> NVidia(GeForce)だと自動的に解像度を変更してくれますし
メーカーによって必ずしも決まる物では無いと思います。
むしろグラフィックボードだけでなくディスプレイ等の仕様のほうが問題になるかも。

> 素材の解像度やアプスケ機能を使うとGeForceに影響が出るのではないか
前にも書いた通り「解像度を意識しない」つまり
「いかなる環境でも適切に描画される」ようにコーディングするのが最適解かと思います。

> 画面の初期化
確実に言えるのは
・自分の思う通りの解像度に全画面初期化というのは環境依存により諦めざるを得ない
・これまでの問題が全画面初期化による物であるかを判別する為に
 上記初期化の後改めて画面解像度を取得するスクリプトを作るべき
です。
更に言えば、画面解像度に依存しない作りになっている場合の正しい初期化の流れは
1. 現在の画面解像度を取得
2. その解像度通りにbgscr以下を処理
になります。今時なら1920x1080あたりが最も多くなるかと思いますが、
1920x1200やその他変態的な解像度も決して少なくない事も考慮すべきですね。
(特にこの手のアスペクト比率が違うディスプレイで問題が発生しやすい為)

まぁ論より証拠という事でごく簡単なサンプルを。雑ですが。


#include "hgimg3.as" #define dw 1920 #define dh 1080 if (1.0*dh/dw>0.75){ r=1.0*dw/1024 }else{ r=1.0*dh/768 } buffer 1,1024,1024 color 96,96,96 boxf color 255,255,255 mes "解像度はなんでもええねん" bgscr 0,dw,dh hgsetreq SYSREQ_2DFILTER2,2 hgini gsel 1 settex 1024,768,0 tid=stat gsel 0 gmode 0,1024,768 repeat 200 hgdraw pos dw/2,dh/2 hgrotate tid,0,0,0,r*1024,r*768 hgsync 16 loop end



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