トップページ⇒tech
979コメント315KB

鬱だ氏のう DirectX (Part 9)

■ このスレッドは過去ログ倉庫に格納されています
0001998 ◆oqSJWu4Ch2 NGNG
DirectXについて、お兄ちゃんたちがマターリと
技術情報交換&雑談するためのスレッド。
初心者用相談室では扱わないような少し高度な話題も受け持つ。

ちなみに、言語はC++がメイン。
C# / VB.NET 使いは、専用スレの方が話がスムーズに進むと思われ。
0002998 ◆oqSJWu4Ch2 NGNG
/** 過去スレ **/
Part 1 http://piza.2ch.net/tech/kako/966/966655286.html (迷子)
Part 2 http://pc2.2ch.net/tech/kako/997/997101556.html
Part 3 http://game.2ch.net/gamedev/kako/1005/10051/1005119775.html (ゲ製作板)
Part 4 http://game.2ch.net/gamedev/kako/1016/10162/1016276254.html (ゲ製作板)
Part 5 http://game.2ch.net/test/read.cgi/gamedev/1027351925/ (ゲ製作板)
Part 6 http://game.2ch.net/test/read.cgi/gamedev/1033920036/ (ゲ製作板)
Part 7 http://pc2.2ch.net/test/read.cgi/gamedev/1039509250/ (ゲ製作板)
Part 8 http://pc2.2ch.net/test/read.cgi/gamedev/1046676308/ (ゲ製作板)

/** 外部 **/
MSのDirectX関連ページ
- DirectX Home Page
http://www.microsoft.com/japan/windows/directx/default.asp
- MSDN>DirectX
http://www.microsoft.com/japan/msdn/directx/default.asp

- DirectX Info Lib (デバイス情報のデータベース。すばらしい!)
http://www.netsphere.jp/dxinfo/
- BBX(掲示板)
http://isweb8.infoseek.co.jp/computer/bbx/
- spin
http://spin.s2c.ne.jp/
- 宇治社中改(3D基礎講座)
http://www.cc.rim.or.jp/~devilman/
0003998 ◆oqSJWu4Ch2 NGNG
/** 関連 **/
- DirectX C# vol.1
http://pc2.2ch.net/test/read.cgi/tech/1040435898/
- vb.NETでやるDirectX
http://pc2.2ch.net/test/read.cgi/tech/1039357620/
- Direct3D
http://pc2.2ch.net/test/read.cgi/tech/1011762546/
- DirectShowと戦うスレ
http://pc2.2ch.net/test/read.cgi/tech/1026666092/
- OpenGL VS Direct3D
http://pc2.2ch.net/test/read.cgi/tech/1044308707/

- C++相談室 part19
http://pc2.2ch.net/test/read.cgi/tech/1052625846/
- ★初心者にVisual C++を教えるスレ★ Part6
http://pc2.2ch.net/test/read.cgi/tech/1052931903/
- Win32API 質問箱 Build11
http://pc2.2ch.net/test/read.cgi/tech/1052651750/
0004デフォルトの名無しさんNGNG
スレタイ見て鬱になった
0005デフォルトの名無しさんNGNG
以後放置
0006デフォルトの名無しさんNGNG
>1オツ
1000ワラタ
0007デフォルトの名無しさんNGNG
厨房隔離板から出てくんなよ……
0008デフォルトの名無しさんNGNG
キター
0009デフォルトの名無しさんNGNG
板違い
ゲ制作技術
http://pc2.2ch.net/gamedev/
0010デフォルトの名無しさんNGNG
煽りに負けずマターリ逝きましょう
0011デフォルトの名無しさんNGNG
おつ〜
0012デフォルトの名無しさんNGNG
>>9
こっちへ誘導しろよ。

鬱だ氏のう DirectX (ゲ製作技術避難所)
http://bbs.gamdev.org/test/read.cgi/gamedev/1054109966/
0013デフォルトの名無しさんNGNG
>>1
おつかれ、なんかこっちでやるのは懐かしい気すら
0014デフォルトの名無しさんNGNG
DirectXはゲームだけが目的ではないので、特に板違いではないよ。他にもスレあるしね。
まあ、ゲ製板避難所のスレと平行してやってくってことで。
0015工房って高校生?NGNG
じゃ、一発目の質問です。
サンプルやヘルプ、WinAPIバイブルと格闘して初期化して何も描画しないプログラム
(Tutorialの01と同じ結果になる物)を組んで見ました。
一応、Libryにしたいので処理を分けて組みました。
VC++6.0 DirectX9 Win2000環境です。
一瞬上手く行ってる見たい何ですが、テストアプリケーションを落すと
Clearメソッドで例外ハンドルを指してデバッグモードになってしまいます。
これってアプリケーション実行中はINVALIDCALLを返してないので
開放時の問題でしょうか?
悩む事三日目の悩める高校生です。どなたか助けて下さい。
0016デフォルトの名無しさんNGNG
VC6あるのならデバッガでおいかければ?
0017デフォルトの名無しさんNGNG
>>15
どこにどう処理をわけたのかわかんなきゃ答えようがない質問だと思うんだが。
0018デフォルトの名無しさんNGNG
>>一応、Libryにしたいので処理を分けて組みました。
ここら辺りがよくわかりませんな。
0019工房って高校生?NGNG
すみません。
処理を分けたってのは、初期化してグラボの性能みてデバイス制作部分(関数単位)
とClearだけ実装した関数、Presentだけ実装した関数、Windouwsの処理部分
各オブジェクトをReleaseする部分と分けたのです。
つまり、ソースファイルなりLibなりをプロジェクトに組み込めば
関数単位で呼び出してアプリを構築出来る様にしたいのです。
で、Clear部分は、Libraryのglobal領域にZバッファやステンシルを使用したかの
フラグがありそれを見て適応したクリアーを呼び出してるのです。
引き数にXRGBの型を渡せるようにしてあり、任意のカラーでクリアできます。
0020デフォルトの名無しさんNGNG
初期化し忘れだったら笑うなw
0021デフォルトの名無しさんNGNG
俺のおすすめは、処理を分ける云々はひとまず置いといて、まず
六つのチュートリアルをすべてやってみたほうがいいと思うけど。(すでにやってたらスマン)

>>アプリを終了させると、、、
WM_DESTROYメッセージでどんな処理をしてるの?
g_pd3dDevice->Clear(...); はどこで処理してます?
0022デフォルトの名無しさんNGNG
スコープの問題に一票
0023デフォルトの名無しさんNGNG
ライブラリに分けるのは相当うまく設計していない限りお勧めはできないな
0024デフォルトの名無しさんNGNG
分けるのは当たり前として、分ける理由が個別のグローバル領域確保という時点で、
うまく設計されている可能性はゼロ
0025デフォルトの名無しさんNGNG
ソース出せ、といいたい……
安心しろ、誰もパクらんからw
0026デフォルトの名無しさんNGNG
DirectX用のライブラリがいくつかあるみたいだけど、
どれが出来が良いのかな?この板(スレ?)的にお勧めが
あったら教えてください。
0027工房って高校生?NGNG
皆さん解決しました。
親身な問い、辛口問い、でしたが一人で詰まっていたら解決しなかったです。
ちなみに、問題は設計でした。
Windowsのメッセージ処理で各オブジェクトを開放したあとも
一回だけClear,begin,end,presentが回ってしまい
Clearの呼び出し前に!NULLの条件を付けたら問題はなくなりました。
勿論、beginやpresentにも付けてなかったです。
精進が足りないみたいです。
ちなみにVCはもっと精進が足りません、MFCはチンプンカンプンで
デバッカで変数の値やアドレス追う程度しか使えません。
0028デフォルトの名無しさんNGNG
>>26
よほど高度な機能があってサポートが期待できない限り、
(ぶっちゃけ市販のゲームエンジンほどに)
DirectXを生で使うのが一番いいんじゃないかと愚考します。
0029デフォルトの名無しさんNGNG
>>28
同意。
質問文からはどの程度の機能があればいいのかもサッパリわからんしね。

そこそこいいんじゃないか、と思うのがLuna。
ttp://www.twin-tail.jp/
0030デフォルトの名無しさんNGNG
今のDirect3Dは下手にライブラリ化する必要が無いくらいに使いやすいと思う。
0031デフォルトの名無しさんNGNG
ライブラリ化はするだろう
ただしそれは自分が使うために機能をまとめることであって、
それをわざわざ他人にしてもらう必要性がないということ
0032デフォルトの名無しさんNGNG
Wizardが吐いたコードをそのまま使うヘタレですが、何か?
さすがにシーンクラスは作るけど……。
0033デフォルトの名無しさんNGNG
そら正道や思うでー。

CD3DApplicationに不満を覚えて自分でフレームワーク作ったけど、頭痛いトラブル続出で、
ほぼ安定した今でも素直にCD3DApplication使ったほうが苦労がなくて済むんちゃうかと
揺れてる今日この頃。
003426NGNG
みなさんありがとうございます。
生で使うのは難しくはないでしょうか?
というか知り合いにそういう風に脅されてまして。

C言語は一通り勉強してて、UNIX上で小さなゲームやら
システムやら開発したことはありますが、Windowsプログラミング
に関しては素人で、DirectXもまだ扱ったことがありません。
いずれは自力でDirectXのコードを書く予定なので、それくらいなら
はじめから自分で勉強して自力で記述した方が良いんですかね?
003526NGNG
29さん、Luna見てみようと思います。
ありがとうございます。

どの程度の機能というのも難しいですが、
ある程度汎用的で、将来自力でやることを踏まえて
良い勉強になるようなライブラリが良いですね。
って要求多すぎっすか?すんません・・・。

最近のDirectXは使いやすいのでしょうか?9.0とか。
あと、皆さんははじめはどのように勉強しました?
マイクロソフトのドキュメントをゴリゴリ読んでいった
んでしょうか?それとも書籍やネットで勉強したんでしょうか?
参考までに教えてくださると嬉しいです。
0036デフォルトの名無しさんNGNG
>>26
俺simpleXっていうライブラリ使ってるんだけど
超初心者の俺でもめっちゃつかいやすいよ
あんたもつかってみ

http://www.geocities.co.jp/SiliconValley-SanJose/8134/
0037_NGNG
http://homepage.mac.com/hiroyuki43/jaz09.html
0038デフォルトの名無しさんNGNG
26さんがどういう層のライブラリを欲しいのか分からない…

本はI/OのDirectX8実践プログラミングがある。周りで評判が良いので買った。
この本は大まかな指針を提示してくれるので、DirectX入門にはよいと思う。
でもDXSDKのヘルプやサンプルが最高の教科書。後はネット上のサンプルなど。

もし3Dデビューしたいのなら、Direct3Dを叩いて勉強するのが一番だよ。
3Dやってく上での問題はAPIの形式じゃないから。
0039デフォルトの名無しさんNGNG
>>Windowsプログラミングに関しては素人で、DirectXもまだ扱ったことがありません。

ということでしたら、まずはWindowsプログラミングに慣れることから
初めてはいかがでしょうか。
私もはじめてWindowsのコードを見たときは難しそうだなと思いましたが、
Petzoldを読み始めてからは、意外と簡単に感じるようになりました。
DirectXに関しては公式の日本語ヘルプで十分だと思います。しかし、
このヘルプのコードを理解するには、Windowsプログラミングの知識が必須です。
004026NGNG
確かに、ヘルプを少し読んでみましたが良く分かりませんでした。
Windowsプログラミングの知識が必須ですか・・・、
頑張って勉強しようと思います。38さんの仰る本も
今度見てみようと思います。勉強しなければいけないことが
たくさんあるなぁ。早くみなさんの会話についていけるように
頑張りたいです。
0041デフォルトの名無しさんNGNG
もしWindowsプログラミングの参考書を買おうと思っているなら、これがおすすめです。
http://www.ascii.co.jp/pb/msp/36001/36001.htm
004226NGNG
>>41
わお、わざわざありがとうございます。このスレの
人たちはホント親切で感動しますた!
個人的にはあの有名な猫でも〜のサイトでも読むか、あの人の
書いた本でも買ってみようかと思ったんだけど、41のがいいっすか?
買ってみようかな。それにしても高い・・・。なんでこんなプログラミング
関係の本とかアホみたいに高いんだろう・・・。書籍もアカデミック版
とか出してくれ・・。
0043デフォルトの名無しさんNGNG
図書館に頼むのが吉
0044デフォルトの名無しさんNGNG
Petzold本は一家に一冊あって損はないと思う。
0045デフォルトの名無しさんNGNG
ちと、お聞きしたいのだが、

Windows Media Player 9 で、avi ファイルとか再生して、
そのあと更に別のファイルを見ようと、ファイルを Media Player 9 に投げると、
必ずといっていいほど、"ASSERT Failed" というダイアログが出てくる。
DirectShow あたりのソースコードでアサートに引っかかってるみたいなんだけど……
(ちなみに、Media Player 6.4 での再生だと出てこない。)

更に、MIDIシーケンサの「Sonar 2.1」で、VSTプラグイン等を設定しようとすると、
やっぱり似たような アサートダイアログが出てくる。
正直鬱陶しい。


DirectX コンパネでの、デバッグ出力レベルをすべて Less にしても出てくるし、
Retail 版のランタイムを使用する設定にしても出てくる……

……これって、どうにかならんのですかね?
004626NGNG
大学の図書館でPetzold本を検索してみたら、
一応あったが・・、1989年出版って・・、初版かいな!
ある意味貴重かもしれないけど。
>>43
図書館に頼んだら入れてくれますかね?
0047デフォルトの名無しさんNGNG
>>46
図書館によると思われ

>>45
解決方法知らないから力になれんが、こっちも参考に見てみるといいかも。
ttp://pc2.2ch.net/test/read.cgi/win/1053402028/l50
ttp://www.experts-exchange.com/Networking/Broadband/DSL_Cable/Q_20294228.html
004826NGNG
このスレでみんな絶賛するから、とうとう買っちまったよ。
petzold。高かった・・・。まぁ先行投資だと思って頑張ろう。
DirectXへの道のりは遠いのであった・・・。

スレ違いスマソ。
0049デフォルトの名無しさんNGNG
みごとに騙されて増すな
0050デフォルトの名無しさんNGNG
みてね〜♪
http://www1.free-city.net/home/s-rf9/page002.html
0051工房って高校生?NGNG
書き込みが多くてすみません。またまた質問です。
8.xの頃のFVFは使い方は分るのですが、VERTEXELEMENT構造体についてです。
頂点データの構造体を宣言して、一つの構造体で座標や法線やUVなどを扱う場合に
VERTEXELEMENT構造体に値をセットする方法は、ストリームを0指定、offsetでストリームを区切ってくと
考えて宜しいのでしょうか?

またその場合(データタイプの宣言時)、実際の頂点バッファサイズ(頂点数)はコーディングするまで未定ですね?
つまりFVF時代は出来た、良く使う宣言をヘッダーに宣言しておいて使うってような感覚で
良く使う組み合わせのVERTEXELEMENT構造体を予め宣言しておくって出来ませんよね?
(offsetが未定の為)

どなたか御講義お願いします。HELPだと上記の理解が精一杯です。
0052デフォルトの名無しさんNGNG
前者はそう。

後者はできる。実体をどこかのcppで定義してヘッダでexternなど。
でもそんなことをする必要があるかどうかは疑問。
毎回シェーダにあわせて専用の形式を作ればいいんでは?
0053デフォルトの名無しさんNGNG
>>49
全然
0054デフォルトの名無しさんNGNG
DX9を使ってますが、
スキンメッシュ作成のサンプルってどこかにないですかね。
Xファイルから読み込むやつじゃなくて、
メッシュを新規にスキンメッシュ化する方法で。

ID3DXSkinInfoがうまく動いてくれないんだよ。
0055デフォルトの名無しさんNGNG
メッシュのデータと別にボーンのデータを持っておいて、
自力で頂点の重み付けをしたい、ってこと?
そんなのはLightWaveとかに任せちゃえばいいと思うんだが。

ていうか、D3DXで出来ないことを実装したいのならともかく、何か不満があるの?
基本的なことは大体出来る気がするんだがなあ。
0056動画2音声NGNG
DirectXの初心者です。
さっそく質問ですが、
DirectShowサンプルとして提供されている
WavDestというフィルタを拾ってきました。
そして、「REGSVR32.EXE wavdest.ax」でフィルタ
の登録もでき、GraphEditで使用できるようになりました。
そこで、CLSIDを定義してプログラム上からフィルタグラフ
マネージャを利用してWavDestフィルタを呼び出したい
のですが、なにをどうしていいかわかりません。
初歩的な質問でもうしわけないですが、
ご教授おねがいします。
0057デフォルトの名無しさんNGNG
SHLSLHSHLSHHHSHSLLLHHHSLHSLHSLSHHHLSHLHSLHSLHLHHHLSLHSLHS
0058デフォルトの名無しさんNGNG
なんでアセンブラのニーモニックのSHLを連呼してるのかと思ったがHLSLのことか
0059デフォルトの名無しさんNGNG
  ∧⊂ヽ   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  (゚Д゚)ノ <  シェーダ
  | ⊃|   \__________
  |  |
  ⊂ノ〜
  ∪
0060デフォルトの名無しさんNGNG
d3dx9d.dllを自作ゲームと一緒に配布したらまずいかな?
名前を変えればバレないかな?


VC++を買う踏ん切りがつかん、、、
0061デフォルトの名無しさんNGNG
>>60
再配布パッケージを使いなよ
0062デフォルトの名無しさんNGNG
デバッグ環境のDLLって再配布パッケージに入ってたっけ?
っていうか、なぜデバッグ環境のを配布せにゃならんのだろう。
0063デフォルトの名無しさんNGNG
>>59
不覚にもワラタ
0064デフォルトの名無しさんNGNG
directxを始めたばかりの初心者です。
directx9 sdkについているdirect graphicsのsampleを
実行すると一瞬だけウインドウが表示されてその後消えてしまいます。
何が原因なのかさっぱりわからずに困っています。
誰か教えてもらえないでしょうか?
0065デフォルトの名無しさんNGNG
自分でコンパイルしてデバッグ環境でどこで落ちてるのか調べてみては?
そのくらいの情報量じゃ、当人でない人から見たらお手上げだよ。
0066デフォルトの名無しさんNGNG
>>64
65に同意。
ただ「消えます」って言われてもねぇ。
0067デフォルトの名無しさんNGNG
DirectX9でポイントのサイズを変えて描画しようとして、
DWORD m_Pointsize = 4;
hr = m_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_POINT)
hr = m_pd3dDevice->SetRenderState( D3DRS_POINTSIZE, *(DWORD*)&m_Pointsize);
として描画しようとすると、描画時に
Direct3D9: (INFO) :Result of drawing primitives with D3DFILL_POINT fill mode
and point size not equal 1.0f could be different on different devices
と出ます。
REFの場合、正しく描画されますが、HALの場合は1ポイントで頂点が描画されます。
HAL時にD3DCAPS9.MaxPointSizeを調べ、64でしたので、HALの制限ではないと思います。
「ポイントサイズが1じゃないと、他のデバイス上で描画結果が異なるかも」
というのは分かったので、この情報がもうでないようにする方法と、
HALで正しく表示させる方法に、心当たりがあれば教えてください。
0068デフォルトの名無しさんNGNG
>>67
DWORD じゃなく float でサイズ指定しないとまずいのでは?
006967NGNG
試しに、
hr = m_pd3dDevice->SetRenderState( D3DRS_POINTSIZE, *(FLOAT*)&m_Pointsize);
と、やってみましたが、だめでした。

また、ヘルプに
「Direct3DDevice9::SetRenderState メソッドは DWORD 値を使うため、
次のコードに示すように、アプリケーションでは値を格納した変数を
キャストしなければならない。
pDevice9->SetRenderState(D3DRS_POINTSIZE, *((DWORD*)&PointSize));」
と書いてるので、ここが原因ではないと思います。
0070デフォルトの名無しさんNGNG
>>67
D3DFVF_PSIZE あたりが臭いような。
何の根拠もないけど……w
007154NGNG
>>55
いや、Mikotoもどきを作ろうとしているんだよ。
それに動的なボーンの追加、変更とかをやりたいんだ。

LightWaveは高いって。
MikotoがXファイルに出力してくれれはいいんだが。
0072デフォルトの名無しさんNGNG
>>69
SetRenderStateのプロトタイプの型がDWORDだからfloatで直接渡せないので
型を騙してコンパイルを通すようにしているだけ
float値が必要なのにDWORDの値を送ったら正常に動かないのは当たり前
少しは考えろ
0073デフォルトの名無しさんNGNG
>>67
んー、それは要するにハードウェアが対応してないってことでは?(w
MAXPOINTSIZEって、もしかするとポイントスプライトの時専用だったりするとか、
そういうことはないかね。

>>68
そのままだとDWORDに暗黙変換されるから、ああやってメモリイメージ渡すのよ。

>>71
自力で頂点重み付けをしたいと。。。
ぶっちゃけその辺のサンプルは見たことがないっす。
しらみつぶしに頂点に最も近いボーンに関連付けさせるしかないんでは…
もちろん、二つのボーンに影響しそうな部分は適当にブレンドして。
Gemsにスキニングの話があったような気がしないでもないなぁ…。
0074デフォルトの名無しさんNGNG
>>72
いや、だから本人はそうやっていたんでは?
68が言ってるからわざわざ試しただけで。
0075デフォルトの名無しさんNGNG
なんか最近あちこちで句点が使えない攻撃的なヤツを見かけるが、気のせいか。
0076デフォルトの名無しさんNGNG
>>74
書いてあることを考えようともしていないだろう
それとも説明されても分からないほど馬鹿なのか?
floatの構造を持つデータをDWORD型と騙してプロトタイプを回避するように、
ヘルプにも書いてあるだろ

>>68が言っていることを試したって、やっていることを全然はき違えている
>>67の段階で
>DWORD m_Pointsize = 4;
何故この程度の間違いに気が付かない?
007769NGNG
一応、
floatm_Pointsize;
hr = m_pd3dDevice->SetRenderState( D3DRS_POINTSIZE, *(DWORD*)&m_Pointsize);

floatm_Pointsize;
hr = m_pd3dDevice->SetRenderState( D3DRS_POINTSIZE, *(float*)&m_Pointsize);

DWORDm_Pointsize;
hr = m_pd3dDevice->SetRenderState( D3DRS_POINTSIZE, *(DWORD*)&m_Pointsize);
は試しました。
だめだったけど。
0078デフォルトの名無しさんNGNG
DirectX9のDirect3Dで2Dアプリケーションを作ろうとしています。
FAQのような気がしますが、答えを見つけられなかったので質問させて下さい。

画面サイズは640x480を考えています。

以前は、テクスチャサイズが2のn乗でなければならないという制限があったと
思うのですけれど、試してみたところ640x480のテクスチャでも表示できてい
ます。(DrawPrimitiveでテクスチャを描画しています。)

DirectXが新しくなって、テクスチャのサイズの制限がなくなったのではと少
し期待しているのですが、これは、たまたま私のビデオカードで表示できてい
るだけで、ビデオカードによっては表示されない場合があるのでしょうか?

以前のDirectXのマニュアルには「テクスチャサイズは2のn乗にしろ」という
ような記述があったような気がするのですが、DirectX9のマニュアルでは見つ
けられません。
007968NGNG
>>77
正しいのは一番上のやつです。
>DWORD m_Pointsize = 4;
だけ見て書き込んじゃったけど
エラーメッセージ見てみたら D3DFILL_POINT がまずいんじゃない?
D3DFILL_SOLID でやってみるといいかも。
0080デフォルトの名無しさんNGNG
68が指摘してたのは変数宣言のほうだったのな。
申し訳ないが適当にソースを読んでたのが悪かった。
だからってなんでそーいう攻撃的な発言するんだ。
正しいこと言っててもそれじゃ敵を作るだけだ。

>>77
floatで宣言した変数をDWORDに代入すると暗黙の変換が起こるだろ?
ソレを避けるためにFLOATのメモリイメージを77の一番上の方法で渡すの。

>>78
nVidiaの一部のドライバが2^nじゃないテクスチャにも対応していたらしい。
やっぱり2^n制限はあるから2^nで作るとよいです。
0081デフォルトの名無しさんNGNG
>>76は、なぜそんなに必死なんだ。



会社や学校で嫌われていないかい?
0082デフォルトの名無しさんNGNG
>>78
D3DPTEXTURECAPS_NONPOW2CONDITIONALでヘルプを検索。
0083デフォルトの名無しさんNGNG
>>75
2ch中毒、疑心暗鬼
>>81
不毛
0084デフォルトの名無しさんNGNG
香ばしい人がいるな
008578NGNG
>>80
>>82

ありがとうございました。モヤモヤしていたのがクリアになりました。

うちは、ATI RADEON9000なのですが、DirectX Caps Viewerで見ると、
確かに D3DPTEXTURECAPS_NONPOW2CONDITIONAL がついていました。

やはりテクスチャを分割して組み合わせないといけないということですね。こ
ういう場合、皆さんはあらかじめグラフィックファイルを256x256などに分割
したりしているのでしょうか?それとも、ファイルを読み込んでから、分割し
てテクスチャにコピーしているのでしょうか?

D3DXCreateTexture系の関数で手抜きをするとなると、後者は難しそうですね。
この辺をうまくラップしてくれるようなスプライトライブラリは公開されてい
ないですかねぇ。なければ自分で作るしかないですが。
0086デフォルトの名無しさんNGNG
D3DXCreateTextureは拡大させずにピクセルをそのまま読み込めるはず。
拡大フィルタだったかなんだったか忘れたが、その辺の設定をするべし。

分割して組み合わせってのは、テクスチャメモリを効率よくさせたいということかね?
それは普通はめんどくさいから、画面サイズより大きなテクスチャを確保する。
例えば640*480の画面に一枚絵を張りたいなら1024*512のテクスチャを用意。
流石に256*256が限界なVGAは無視してもかまわんと思う。
そのようなVGAはちょっと古すぎだし、3Dのサポートもままならん。
008778NGNG
>>86
D3DCreateTexture*Ex()で、Width,Heightを1024,512にして、Filterを
D3DX_FILTER_NONEにして、テクスチャ座標を
(0., 0.)-(640./1024., 480./512)にして期待通りに動きました。

これでずいぶん楽になります。
あとで、他のビデオカードでもうまくいくか、試してみます。

テクスチャ座標の誤差が出て、ピクセルが欠けたりしないかちょっと心配して
しまいますが、3DのAPIっていうのはこういうものなのでしょうね。

基本的な質問に、重ね重ねありがとうございました。
008886NGNG
ああ、テクスチャ座標とピクセル座標の関係だが、ヘルプに出ているよ。
ピクセルは点のように思えがちだが、面積を持つ正方形ということらしい。
だから640*480の画面のスクリーン座標は(-0.5,-0.5)-(639.5,639.5)になる。
008986NGNG
ぶっ
(-0.5,-0.5)-(639.5,479.5)だぜ
鬱死
0090デフォルトの名無しさんNGNG
(・∀・)イイヨーイイヨー
0091デフォルトの名無しさんNGNG
n/1024とかn/512とかは浮動小数では有限小数になるので、
あとはグラフィックプロセッサがどうラスタライズしてるかですな。

>>89のようにちゃんと座標合わせてフィルタ切っておけば
まず100%正確な描画は保証されると思う。
バイリニアでもたしか各ピクセル±1〜2くらい誤差が出たと思ったけど、
見た目で分かるほどではない。
0092デフォルトの名無しさんNGNG
DirectX Texture Toolを使おうとしたら
「This program uses the reference rendering device.
Your computer has a reduced-functionality reference device installed.
You can still use this program to manipulate textures, but the textures will not be visible in this program.
Install the DirectX SDK to install the reference device.」
というコメントが出ます。翻訳したところ、
「テメーの状態では全ての機能が使えない。SDK入れろ」と言われているようです。
DirectXSDK8.1bを入れているのですが、まだ何か足りないのでしょうか?
0093デフォルトの名無しさんNGNG
いままで OpenGL でプログラムを書いていましたが、DirectX9も勉強してみたくなり、
OpenGLのプログラムをDirectX9に移植しています。

作業はおおむね順調で、大部分はすんなり移植できたのですが、
2つほど問題にぶつかってしまいました。

1. DrawPrimitiveで D3DPT_LINESTRIP をかくときに、 線種/線幅は
どうやって指定するのでしょうか? 線種に関しては、DirectXのヘッダをのぞくと
D3DLINEPATTERN なんてのがあってそれっぽいことができそうなのですが・・・
線幅はまったく情報がつかめませんでした。

2. テクスチャに関しても DrawPrimitiveUP のように メインメモリのデータを
直接テクスチャとして貼り付けることはできないのでしょうか?
現在は pTex->GetSurfaceLevel()で取り出したサーフェスに対して
D3DXLoadSurfaceFromMemory() を呼び出していますが、
OpenGLに比べてだいぶ遅くなってしまいました。
(OpenGLで glBindTextureを毎回呼び出したときぐらい遅い)

開発環境は VC++です。以上、よろしかったらご教授お願いいたしますです。
0094デフォルトの名無しさんNGNG
1→ID3DXLineでヘルプを検索。

2→CreateTextureでD3DUSAGE_DYNAMICを指定すると、動的テクスチャを作ることができます。
ただ、D3DPOOL_DEFAULTなんかと一緒に指定しなきゃいけなかったり制約があるので、
その辺はヘルプを参考にしてくらはい。
0095デフォルトの名無しさんNGNG
>>91
ピクセルが欠けたりはしないけど、色が微妙に変わってしまうことがあるから
100%正確ではないな。32bitカラーでRGB値が1小さくなったりする。(GeForce)

>>93
Direct3Dでは線種/線幅の変更は不可能。
線種はテクスチャで、線幅はポリゴン化して自分で処理する必要有り。
DX9ならID3DXLineがやってくれるから、そっちを利用するのがいいかと。

それと、メインメモリのデータをテクスチャとして貼ることもできない。
必要なら毎回転送しないと駄目。
D3DXLoadSurfaceFromMemoryはピクセルフォーマットの変換をしながら
1ピクセルずつCPUが更新していくから、フォーマットの変換がいらない
場合はUpdateTextureかUpdateSurfaceで転送した方がいい。
(メインメモリ側のバッファもTextureやSurfaceにする必要有り)
頻繁に更新するテクスチャはD3DUSAGE_DYNAMICを指定するのも忘れずに。
009693NGNG
情報ありがとうございます。おかげさまで助かりました。

まだ触り始めて1週間ぐらいの感想ですが、
OpenGL も DirectX も一長一短がありますね。
でも、DirectX の方がローレベルなところまで細かく制御できて
面白いです。

ちなみに、その他のOpenGLオンリーの便利機能は
・セレクション/フィードバック
・ディスプレイリスト
あたりかと思ってますが、あってますかね?(DirectXにももしかしたらあります?)
本当にセレクションがないとしたらちょっと残念。
0097デフォルトの名無しさんNGNG
昔のDirect3Dには似たような物はあったが、今は自分で実装しろって
ことになってる。
0098デフォルトの名無しさんNGNG
最近のDirectX9とかは昔に比べると鬱ではないですか?
0099デフォルトの名無しさんNGNG
DirectX8以降のDirectX Graphicsはいいね。
0100工房って高校生?NGNG
昔かどうかは分りませんが、手元にある3Dグラフィックスの本にある
3Dモデルを空間内で座標変換しビュウ画面にスキャンラスタライズして描画する部分の説明を読んでると
座標変換やシェーディングしたojbectのピクセル単位の描画などは、
とても簡単に実装できるようになってると思います。

DirectDrawとの比較は分りません。8.1からのヒヨッコ世代ですので。
0101デフォルトの名無しさんNGNG
DirectXのビルド番号とバージョン番号の対応表みたいなの
持ってる人とかURL知ってる人とかいたら教えてくれませんか?
おながいします。
■ このスレッドは過去ログ倉庫に格納されています