ページ 11

DirectXで文字を表示する方法&互換性

Posted: 2012年7月23日(月) 21:51
by zy
DirectXが使えるように設定するとコンソールアプリのprintf関数が使えなくなりますが
DirectXで制作したゲームで文字(キャラ同士の会話など)を表示するにはどういった方法があるのですか?
また自分の環境はWIndows7なのでDirectX SDKのバージョンは11.0なのですが
この環境で開発されたゲームをWindowsXPなど低いバージョンのDirectXで動作させるには
どうすればよいのですか?

Re: DirectXで文字を表示する方法&互換性

Posted: 2012年7月23日(月) 23:54
by ISLe
zy さんが書きました:DirectXが使えるように設定するとコンソールアプリのprintf関数が使えなくなりますが
DirectXで制作したゲームで文字(キャラ同士の会話など)を表示するにはどういった方法があるのですか?
  • あらかじめ必要なフォントイメージを作成しておき、テクスチャとして読み込んで描画する
    ※使用する文字数が少ないとき
  • GetGlyphOutline APIを使うなどして動的にテクスチャイメージを作成して描画する
    ※文字の大きさが揃っている場合、作成済みテクスチャを使い回して高速化可能
  • DirectWriteを使う
    ※贅沢に高品位な描画を目指すなら(あるいは楽したいなら)。速度はPC性能に依存
zy さんが書きました:また自分の環境はWIndows7なのでDirectX SDKのバージョンは11.0なのですが
この環境で開発されたゲームをWindowsXPなど低いバージョンのDirectXで動作させるには
どうすればよいのですか?
Direct3D 11はWindows XPでは動作しません。
Windows XPで動作するのはDirect3D 9までです。

Windows 7でDirect3D 9を使ったプログラムを開発することは可能です。

Re: DirectXで文字を表示する方法&互換性

Posted: 2012年7月24日(火) 08:01
by naohiro19
ISLe さんが書きました:Direct3D 11はWindows XPでは動作しません。
Windows XPで動作するのはDirect3D 9までです。
グラフィックボード(GeFourceの最新版やRadeonの最新版)に取り換えればDirectX 11が理論上可能ですよ

Re: DirectXで文字を表示する方法&互換性

Posted: 2012年7月24日(火) 12:04
by softya(ソフト屋)
naohiro19 さんが書きました:
ISLe さんが書きました:Direct3D 11はWindows XPでは動作しません。
Windows XPで動作するのはDirect3D 9までです。
グラフィックボード(GeFourceの最新版やRadeonの最新版)に取り換えればDirectX 11が理論上可能ですよ
DirectX APIのサポートなしにDirectX 11相当の機能がXPで使えるんでしょうか?
と言うよりもDirectX 11のAPIインターフェイスが使えるんでしょうか?

Re: DirectXで文字を表示する方法&互換性

Posted: 2012年7月25日(水) 00:24
by ISLe
naohiro19 さんが書きました:グラフィックボード(GeFourceの最新版やRadeonの最新版)に取り換えればDirectX 11が理論上可能ですよ
MSDN DirectX に関してよく寄せられる質問
DirectX 11 は Windows Vista や Windows XP でも使用できますか。
DirectX 10 は Windows XP でも使用できますか。

Re: DirectXで文字を表示する方法&互換性

Posted: 2012年7月25日(水) 17:59
by zy
ISLe さんが書きました:
zy さんが書きました:DirectXが使えるように設定するとコンソールアプリのprintf関数が使えなくなりますが
DirectXで制作したゲームで文字(キャラ同士の会話など)を表示するにはどういった方法があるのですか?
  • あらかじめ必要なフォントイメージを作成しておき、テクスチャとして読み込んで描画する
    ※使用する文字数が少ないとき
  • GetGlyphOutline APIを使うなどして動的にテクスチャイメージを作成して描画する
    ※文字の大きさが揃っている場合、作成済みテクスチャを使い回して高速化可能
  • DirectWriteを使う
    ※贅沢に高品位な描画を目指すなら(あるいは楽したいなら)。速度はPC性能に依存
つまり文字はあらかじめ画像編集ソフトなどで画像化しておかなければ表示できないのですか?
DirectWriteは確かDirectX11の機能だからwindowsXPの環境じゃ動作しませんよね。
printfのように簡単にキーボードでソースコードに文字を入力して表示する方法とか無いんですか?

zy さんが書きました:また自分の環境はWIndows7なのでDirectX SDKのバージョンは11.0なのですが
この環境で開発されたゲームをWindowsXPなど低いバージョンのDirectXで動作させるには
どうすればよいのですか?
Direct3D 11はWindows XPでは動作しません。
Windows XPで動作するのはDirect3D 9までです。

Windows 7でDirect3D 9を使ったプログラムを開発することは可能です。

つまりDirectX11 SDKで開発してもDirectX9.0の機能だけを使えば
WIndoswXPでも動作可能なゲームを開発できるということでしょうか?

Re: DirectXで文字を表示する方法&互換性

Posted: 2012年7月25日(水) 18:00
by zy
送信失敗してしまいました、失礼します・・・・

つまり文字はあらかじめ画像編集ソフトなどで画像化しておかなければ表示できないのですか?
DirectWriteは確かDirectX11の機能だからwindowsXPの環境じゃ動作しませんよね。
printfのように簡単にキーボードでソースコードに文字を入力して表示する方法とか無いんですか?

そしてDirectX11 SDKで開発してもDirectX9.0の機能だけを使えば
WIndoswXPでも動作可能なゲームを開発できるということでしょうか?

Re: DirectXで文字を表示する方法&互換性

Posted: 2012年7月25日(水) 18:07
by softya(ソフト屋)
ゲームをつくろーの記事にフォント表示編があります。
「DirectX9技術編」
http://marupeke296.com/DirectXMain.html
「DirectX10技術編」
http://marupeke296.com/DX10_main.html

まぁ、ISLe さんが書いた方法の一つなのですが。

Re: DirectXで文字を表示する方法&互換性

Posted: 2012年7月25日(水) 18:41
by ISLe
zy さんが書きました:つまり文字はあらかじめ画像編集ソフトなどで画像化しておかなければ表示できないのですか?
DirectWriteは確かDirectX11の機能だからwindowsXPの環境じゃ動作しませんよね。
GetGlyphOutlineを使う方法はスルーですか?
softyaさんが解説サイトを紹介されてますが、GetGlyphOutlineはWin32 APIなのでWindows XPでも使えます。
zy さんが書きました:printfのように簡単にキーボードでソースコードに文字を入力して表示する方法とか無いんですか?
Windows XPで動かす前提なら、DXライブラリとかDirectX9のD3DXFontとかを使えば楽はできます。
zy さんが書きました:そしてDirectX11 SDKで開発してもDirectX9.0の機能だけを使えば
WIndoswXPでも動作可能なゲームを開発できるということでしょうか?
はい、そうです。

Re: DirectXで文字を表示する方法&互換性

Posted: 2012年7月26日(木) 19:15
by zy
つまりWin32 APIの機能のGetGlyphOutlineを使えば、printfのようにエラーが出ずに文字を表示できるのですね?

Re: DirectXで文字を表示する方法&互換性

Posted: 2012年7月26日(木) 19:23
by zy
※追記※
調べてみると他にもTextOutやDrawTextという関数もあるようですが
具体的にGetGlyphOutlineとの機能の差異などはどのようなものがあるのでしょうか?

Re: DirectXで文字を表示する方法&互換性

Posted: 2012年7月27日(金) 00:11
by ISLe
zy さんが書きました:つまりWin32 APIの機能のGetGlyphOutlineを使えば、printfのようにエラーが出ずに文字を表示できるのですね?
GetGlyphOutlineだけでは表示できません。

softyaさんの紹介したサイトにコード付きで解説されていますが、
  1. GetGlyphOutlineを使って指定した文字のビットマップイメージを得ます
  2. そのビットマップイメージを使ってDirect3Dのテクスチャを作成します
  3. そのテクスチャをポリゴンに貼り付けて描画します
という手順を必要な文字種分繰り返し行なって表示します。
さらに頻繁に使用する文字や使用頻度の高い文字のテクスチャをなるべく再利用して高速化を図ります。
zy さんが書きました:※追記※
調べてみると他にもTextOutやDrawTextという関数もあるようですが
具体的にGetGlyphOutlineとの機能の差異などはどのようなものがあるのでしょうか?
GDIとDirect3Dは排他的な関係にあるので、同時に表示することはできません。
GDIでオフスクリーンを作って描画してその内容を取り出してDirect3Dのテクスチャとして利用することは可能です。

テキスト表示(というかフォントのレンダリング)は重い処理です。
描画する都度フォントにアクセスするのを避けて、テクスチャを作り置きするようにしないと、場面転換のエフェクト時に処理落ちするようなことになります。
そういう場合は場面転換時にテキストを表示しないのも手ですが。

Re: DirectXで文字を表示する方法&互換性

Posted: 2012年7月27日(金) 00:56
by zy
DiretcXの開発環境ではTextOutやDrawTextは使えないということですか?
それともGetGlyphOutlineと同時には使えないということですか?
GetGlyphOutlineは聞いている限りだと結構ややこしい処理をしないと文字を表示できないみたいですね
それこそprintfのように簡単に文字を表示する関数とか無いんでしょうかね・・・・

Re: DirectXで文字を表示する方法&互換性

Posted: 2012年7月27日(金) 01:48
by ISLe
zy さんが書きました:DiretcXの開発環境ではTextOutやDrawTextは使えないということですか?
それともGetGlyphOutlineと同時には使えないということですか?
使えますよ。同時には見えないというだけのことです。
GDIとDirect3Dの関係はテレビのチャンネルのようなものだと思ってもらったら良いのではないでしょうかね。
いちおう補足しておきますが、ゲームの会話テキストということで、同じウィンドウのクライアント領域を対象にした場合という前提ですけど。
zy さんが書きました:GetGlyphOutlineは聞いている限りだと結構ややこしい処理をしないと文字を表示できないみたいですね
それこそprintfのように簡単に文字を表示する関数とか無いんでしょうかね・・・・
ちょっと前にDXライブラリとかDirectX9のD3DXFontとかを使えばできるとも回答していますが。
Direct3Dの機能だけでやるのなら、テクスチャを作ってポリゴンに貼って描画、という手順を自前で踏むしか無いです。

GetGlyphOutlineはそこそこ高品質での描画ができるし工夫すれば高速化もできるのでゲーム用途に向いていると思います。
メッセージを枠内で折り返すなど文字単位で行う処理が既に実装済みであれば、大した手間にはならないのではないかと。

Re: DirectXで文字を表示する方法&互換性

Posted: 2012年7月27日(金) 16:43
by zy
D3DXFontは重いと聞きましたから素直に会話文など文字を多く使う所でも
GetGlyphOutlineを使えばよいのですね
ありがとうございました