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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
zy

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

#1

投稿記事 by zy » 13年前

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

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

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

#2

投稿記事 by ISLe » 13年前

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を使ったプログラムを開発することは可能です。

naohiro19
記事: 256
登録日時: 14年前
住所: 愛知県

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

#3

投稿記事 by naohiro19 » 13年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#4

投稿記事 by softya(ソフト屋) » 13年前

naohiro19 さんが書きました:
ISLe さんが書きました:Direct3D 11はWindows XPでは動作しません。
Windows XPで動作するのはDirect3D 9までです。
グラフィックボード(GeFourceの最新版やRadeonの最新版)に取り換えればDirectX 11が理論上可能ですよ
DirectX APIのサポートなしにDirectX 11相当の機能がXPで使えるんでしょうか?
と言うよりもDirectX 11のAPIインターフェイスが使えるんでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

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

#5

投稿記事 by ISLe » 13年前

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

zy

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

#6

投稿記事 by zy » 13年前

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でも動作可能なゲームを開発できるということでしょうか?

zy

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

#7

投稿記事 by zy » 13年前

送信失敗してしまいました、失礼します・・・・

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#8

投稿記事 by softya(ソフト屋) » 13年前

ゲームをつくろーの記事にフォント表示編があります。
「DirectX9技術編」
http://marupeke296.com/DirectXMain.html
「DirectX10技術編」
http://marupeke296.com/DX10_main.html

まぁ、ISLe さんが書いた方法の一つなのですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

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

#9

投稿記事 by ISLe » 13年前

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

zy

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

#10

投稿記事 by zy » 13年前

つまりWin32 APIの機能のGetGlyphOutlineを使えば、printfのようにエラーが出ずに文字を表示できるのですね?

zy

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

#11

投稿記事 by zy » 13年前

※追記※
調べてみると他にもTextOutやDrawTextという関数もあるようですが
具体的にGetGlyphOutlineとの機能の差異などはどのようなものがあるのでしょうか?

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

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

#12

投稿記事 by ISLe » 13年前

zy さんが書きました:つまりWin32 APIの機能のGetGlyphOutlineを使えば、printfのようにエラーが出ずに文字を表示できるのですね?
GetGlyphOutlineだけでは表示できません。

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

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

zy

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

#13

投稿記事 by zy » 13年前

DiretcXの開発環境ではTextOutやDrawTextは使えないということですか?
それともGetGlyphOutlineと同時には使えないということですか?
GetGlyphOutlineは聞いている限りだと結構ややこしい処理をしないと文字を表示できないみたいですね
それこそprintfのように簡単に文字を表示する関数とか無いんでしょうかね・・・・

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

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

#14

投稿記事 by ISLe » 13年前

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

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

zy

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

#15

投稿記事 by zy » 13年前

D3DXFontは重いと聞きましたから素直に会話文など文字を多く使う所でも
GetGlyphOutlineを使えばよいのですね
ありがとうございました

閉鎖

“C言語何でも質問掲示板” へ戻る