トップページgamedev
987コメント315KB

鬱だ氏のう DirectX (Part 5)

■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものですた。02/07/23 00:32ID:DsnWt/i.
DirectXについてマターリと技術情報交換&雑談するためのスレッド。
初心者用相談室では扱わないような少し高度な話題も受け持つ。

■旧スレ(プログラム板)
http://piza.2ch.net/tech/kako/966/966655286.html  (Part 1)
http://pc.2ch.net/test/read.cgi/tech/997101556/   (Part 2)
http://game.2ch.net/test/read.cgi/gamedev/1005119775/ (Part 3)
http://game.2ch.net/test/read.cgi/gamedev/1016276254/ (Part 4)

コピペスマソ
0552名前は開発中のものです。02/09/05 15:24ID:XAnwUSlO
だれかOgg Vorbis形式の再生方法教えて!
ov_openするとアクセス違反になる..なぜじゃー(>_<)
0553名前は開発中のものです。02/09/05 15:36ID:???
>>552
もしかしてDLLのプロジェクトで作ってたりする?
俺も前にやったんだけど同じところでアクセス違反になって不思議だったんだが…
違ったらごめん。ちなみに解決策はコード生成でDLL(マルチスレッド)だ。
なんでそれで動くかはわからん(ぉ
0554名前は開発中のものです。02/09/05 15:40ID:XAnwUSlO
>>553
うおぉぉーーー!あなたは神様です(T-T)
マジでそれでうまく行きました(^^)
ありがとうっす♪
0555名前は開発中のものです。02/09/05 18:31ID:???
>>554
まさか本当にDLLで作っていたとは(笑 まぁ、解決してよかった。
それにしてもOgg Vorbisは本当にいいな。
再生するだけなら扱いも楽だし。ライセンス料かかるMP3は消えてよし。
0556名前は開発中のものです。02/09/06 01:43ID:3M9KUq9c
DirectX7から8へ乗り換え中です。
SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
7のときはこんな感じでアルファブレンドができたのですが、8だと
ただの抜けあり描画になってしまいます。
テクスチャはBMPでカラーキーを使用しています。
他になにか設定が必要なのでしょうか?
0557名前は開発中のものです。02/09/06 01:48ID:???
>>556
試しに↓も入れてみてくれ

SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
0558名前は開発中のものです。02/09/06 01:48ID:???
SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
もな
0559名前は開発中のものです。02/09/06 01:55ID:???
>>556
8からカラーキーの使用は無くなった筈だが…
TGA若しくはDDSでアルファ情報があるテクスチャを使うんじゃ?
因みにDDSはSDKのUtilitiesのTextureToolで作れるよ。
056055602/09/06 02:19ID:3M9KUq9c
>>557
入れてみましたが駄目でした。
SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
これも入ってます。
SetRenderState(D3DRS_SRCBLEND,D3DBLEND_ONE);
SetRenderState(D3DRS_DESTBLEND,D3DBLEND_ONE);
この設定で加算はできています。
>>559
7にあったカラーキーが無くなって今までアルファブレンドだった
設定でカラーキーが使えるようになったと解釈して良いですか?
今までのアルファブレンドはどこに?
TGAのアルファプレーンは反映されるのですが、それだとプログラム側で
アルファ値をコントロールできないので、頂点アルファあたりを使って
アルファブレンドをやりたいのです。なにか良い方法ないでしょうか?
0561名前は開発中のものです。02/09/06 02:25ID:KmTxppnE
なあ、テクスチャの方はαを設定したのか?
056255602/09/06 02:29ID:3M9KUq9c
>>561
テクスチャのアルファって?
0563名前は開発中のものです。02/09/06 02:29ID:KmTxppnE
SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_BLENDDIFFUSEALPHA );
これやらないとテクスチャはαブレンドにならないけど、
こういう話とは違う?>>560
056455602/09/06 02:54ID:3M9KUq9c
すいません。この設定が効いてませんでした。
SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
ちゃんと出るようになりました。カラーキーの部分の抜けを適用したまま
半透明レートを頂点カラーでコントロールできます。
答えてくださったみなさんありがとうございましました。

0565名前は開発中のものです。02/09/06 02:56ID:KmTxppnE
良かったね。おめでたう。
0566名前は開発中のものです。02/09/06 03:02ID:NU3TRrfk
凄く初歩的な質問なんですが。
床などにテクスチャを貼る場合、
テクスチャの画像を大きくして並べる数を少なくするのと、
テクスチャの画像を小さくして並べる数を増やすのではどっちが軽いんでしょうか?
0567名前は開発中のものです。02/09/06 03:05ID:???
速度的には同じ。
メモリ的には小さい方が軽い。
0568名前は開発中のものです。02/09/06 03:06ID:???
テクスチャの画像を大きくして並べる数を少なくするのは歪みが生じない?
今のDirectXは平気になったんか?
0569名前は開発中のものです。02/09/06 03:14ID:???
昔のソフトでよくあった、テクスチャの繋ぎ目に隙間が開いてしまう現象
はなんだったんだろう?

今でもコントロールパネルから調整できるよねぇ?
0570名前は開発中のものです。02/09/06 03:26ID:m11JpBjY
ありがとうございます。
画像を小さくして並べる数を増やす方が良いのですね。
参考になりました。
0571名前は開発中のものです。02/09/06 03:31ID:???
テクスチャ繋ぎ目のすきま。
プログラマが固定小数点信者だったからとかない?(憶測
0572名前は開発中のものです。02/09/06 03:37ID:???
おいおい、ポリ数が多くなりすぎて逆に遅くなるだろ
0573名前は開発中のものです。02/09/06 03:51ID:???
面がでかすぎるとライティングも困る
0574名前は開発中のものです。02/09/06 03:58ID:???
その辺のバラス取りが泣ける。性能UPによって変わっていくし…
0575名前は開発中のものです。02/09/06 04:30ID:???
Gx00系は画面真っ暗。表示されず。
0576名前は開発中のものです。02/09/06 04:49ID:???
Gx00系ってMatroxのアレのことと今知った
0577名前は開発中のものです。02/09/06 05:05ID:???
>>575
Gx00系で何をすると画面真っ暗なんだ。大丈夫なのかお前。
0578名前は開発中のものです。02/09/06 05:10ID:???
Gx00系って、、、G4x0以外は使えねぇだろ…g200とか
0579名前は開発中のものです。02/09/06 05:16ID:???
G400もつかえねーけどな
450は氏欄
0580名前は開発中のものです。02/09/06 05:17ID:???
G400はバンプマップで地球儀だせるよ。それ以上は無理
0581名前は開発中のものです。02/09/06 05:24ID:???
>>579
どうでもいいが、つかえねー理由ぐらい書いとけよ。
0582名前は開発中のものです。02/09/06 05:25ID:???
抜き色がおかしくなる
0583名前は開発中のものです。02/09/06 05:31ID:???
俺はGeForce4Tiが現役マシンだが、G400も過去に使ってた。
具体的にDirect3Dの何を使ったら抜き色が変になったかを
書けば対策方法を教えるが?
0584名前は開発中のものです。02/09/06 05:43ID:???
>>579=>>582
>抜き色がおかしくなる

なぜ抽象的な表現を使う。
具体的に書いてみ。
何をしたら抜き色が変になったんだ。
0585名前は開発中のものです。02/09/06 05:58ID:???
つーか
○×のビデオチップが使えねーとかどうだとか
そういう話以前の問題だろ。
0586名前は開発中のものです。02/09/06 06:44ID:???
RenderState設定をいい加減にしてるだけだろ
0587名前は開発中のものです。02/09/06 11:26ID:2HBzLxJN
Gx00だと半透明の出具合が違うな。
GeForce系やRADEONでは大丈夫な設定でも。
なにか設定抜けてるのかな。
0588名前は開発中のものです。02/09/06 15:51ID:f2V/Iqy/
Ogg vorbisの曲データからPCMデータを抜き出して
DirectSoundに渡して再生するサンプルを誰か作ってー
0589名前は開発中のものです。02/09/06 15:57ID:???
すごいクレクレ君だな。
0590名前は開発中のものです。02/09/06 16:59ID:???
>>588
1)OggVorbisをWAVEファイルへ変換するソフトを作る
2)WAVEをDirectSoundで再生するソフトを作る

1はOggVorbisのSDKに九割方は同じのがあるし、2なんてWeb探せばどこにでもあるだろう?
しかも両方とも100行以内でかけるような簡単なものだ。
1と2ができるなら一緒にしてできないなんてことはありえまい。少しは自力でやってみ。
059153102/09/06 17:13ID:???
DirectMusicのSetVolume×10パス分を毎フレーム呼んだら死んだ。
なんじゃコリャ。激重い。
やっぱゲームの効果音にはDirectSoundなの?
0592名前は開発中のものです。02/09/06 18:15ID:???
>>591
もしかしてSetVolumeって自動でフェードっぽいことしてくれないかなぁ?
ちとわからないんだけど、英語ヘルプにどうもそれっぽいことが書いてある気が…
dwDulationに与える値を設定してみてちょ
059359202/09/06 19:08ID:???
>>591
今実験してみたけど、DirectMusicって自動フェードしてくれるみたいよ。
やっぱDirectMusicマンセーだな(w
0594名前は開発中のものです。02/09/06 19:55ID:???
う〜ん。フェードっつっても超非線形なのでやっぱ毎フレーム指定したいかも。
既にインターフェースそのままでDSoundにごっぞり鞍替え中。
でも自動でフェードしてくれるのは知らなかった。サンクスコ
0595名前は開発中のものです。02/09/06 20:36ID:???
PerformanceのInitAudioでDirectSoundのインターフェイスをとれば、
DMusicとDSoundを共存させられる気も。
0596名前は開発中のものです。02/09/06 22:43ID:/3OZCZxa
DirecDrawで、オフスクリーンサーフェスにTGA形式の画像を読み込みたいんだけど
これって自前でTGA解釈するしか方法ないのかな?
(バイナリとして読み込んでヘッダフッタ削ってDIBにするとかみたいな)

・・・今更DirectDrawとかいうな
0597名前は開発中のものです。02/09/06 23:19ID:???
>>596
海外のその手のサイトに行けば腐るほどそういうライブラリが
転がってるんでないの
0598名前は開発中のものです。02/09/06 23:27ID:/3OZCZxa
ごめん、ぐぐってたら考えが変わってきた

DirectX8.0SDKからDirectDraw弄る際のリファレンスってどこにありますか?
手持ちの日本語ヘルプファイルには無かった・・・
059953102/09/06 23:27ID:???
鞍替え完了。サクッとFPSキープ。
DSUtilを読んでたら、publicメンバのGet関数を発見した。

>>595
DirectMusicは規模がでかいのであんまり関わりあいたくないかも。
waveしか使わなかったらDSoundのみもありですな。
0600名前は開発中のものです。02/09/06 23:31ID:???
>>598
ない。DX7のヘルプはMicrosoftのサイトに置いてあるからそれをDLしる
0601名前は開発中のものです。02/09/06 23:42ID:???
>600
すいません
ddutil.h読んでたら謎が解けました

ごきげんよう
0602名前は開発中のものです。02/09/07 00:24ID:iRBKvDit
IRC/opennap
http://opennap.scenecritique.com
0603名前は開発中のものです。02/09/07 07:36ID:???
DirectXに何の関係が?
0604名前は開発中のものです。02/09/07 08:16ID:???
DirectX9beta
0605名前は開発中のものです。02/09/09 03:59ID:oCHjDl9e
とりあえず、待ちきれないやつは後藤たんの記事でハァハァしとけ

■【9/6】DirectX 9のスーパーセットとなるNV30
http://www.watch.impress.co.jp/pc/docs/2002/0906/kaigai01.htm
■【9/5】DirectX 9世代のGPU戦略〜0.13μmに賭けるNVIDIA
http://www.watch.impress.co.jp/pc/docs/2002/0905/kaigai01.htm
0606名前は開発中のものです。02/09/09 11:58ID:LhGt96LR
Ogg Vorbisって1回全部読み込んでPCMデータにしてからじゃないと
再生できないのかなぁ??(ov_readを全データ分,前処理でするって事)
それとも手作業で別スレッド作って読み込みつつ再生しないといけないの?
MCIみたいに自動的に別スレッドで読み込みつつ再生してくれる方法ってないの?
どなたか知ってたら教えてくださいm(__)m
0607名前は開発中のものです。02/09/09 12:23ID:???
>>606
すれ違い。
それにストリーミング再生くらい自分で作れないと駄目。
しかもOggVorbisに限った話じゃないし。
0608名前は開発中のものです。02/09/09 22:13ID:???
リアルタイムアクションゲーのBGMってことで
DirectSound + OggVorbisで64bpsの曲を流したら、
数秒に1回、一瞬ラグ入るんですが、みんなもそう?
やはり重いのかな。
CPUはP4 1.7G です。
0609名前は開発中のものです。02/09/09 22:26ID:???
>>608
BGM切ると正常になるならOggVorbisのせいかもしれないが、
OggVorbisのデコードの仕方に問題がある可能性も否定できない。
うちでもOggVorbis使ってるが固まることがないから。
0610名前は開発中のものです。02/09/10 07:41ID:???
>>609
バッファがでか過ぎたようでした。500kありました。
十分小さくしたら問題なくなりました(16kでも行けた)
0611名前は開発中のものです。02/09/11 01:56ID:???
半日悩んだんだけど、どうしてもわからない・・・
DirectX8.0SDK+BCC5.5.1+ttp://www.geocities.com/foetschのBorland用Libファイルで
自作のD3Dラッパーが動かない・・・(コンパイルは通る)

ちなみにチュートリアルはコンパイルできて、期待通りの振る舞いをします
ランタイムのバージョンは8.1です

チュートリアルとほとんど変わらない事をやってるはずなのに
ログ見たところCreateDeviceでInvalidCallが返ってくるです

以下にソースを晒しますので、お暇な方はちょっと見てやってください

http://naha.cool.ne.jp/lichterlo/myd3d.h.txt
http://naha.cool.ne.jp/lichterlo/myd3d.cpp.txt
061261102/09/11 02:23ID:6aqmQWZz
age忘れゴメソ
0613名前は開発中のものです。02/09/11 03:33ID:???
>>611
コンパネ→DirectX→Direct3D で Use Debug Version にして
デバッガで走らせると、アドバイス的なメッセージもガンガンでてくるぞ
0614名前は開発中のものです。02/09/11 03:36ID:???
デバッグメッセージを受け取れる状態で実行しないと効果がない罠
0615名前は開発中のものです。02/09/11 04:03ID:???
デバッガで走らせると、と書かれてあるように見えるが
0616名前は開発中のものです。02/09/11 05:13ID:QUS9ooCg
>611
ハードウェアアクセラレータ最大 になってる?
061761102/09/11 06:07ID:???
>613
デバッグバージョンのランタイム持ってなかったのでDL中です
アドバイスthx

>616
環境はPenIV1.8GHz512MB
GeForce4Ti4200DDR128MBと申し分ない雰囲気です
061861102/09/11 06:59ID:???
デバッグ用ランタイムで走らせてみたら
「指定されたウィンドウはフォーカスを受け取れない」
・・・

えぇ、ウィンドウもラッパークラス作ってたんですが
メンバじゃなくて関数ローカルのHWNDでCreateしてました・・・

はずかしー
0619名前は開発中のものです。02/09/11 12:16ID:???
ヤレヤレだぜ。
0620名前は開発中のものです。02/09/11 22:17ID:RNHebZSv
DirextX8.1のIDirect3D8::CreateDeviceに渡す構造体の
D3DPRESENT_PARAMETERSのFullScreen_RefreshRateInHzに
D3DPRESENT_RATE_DEFAULTとか
D3DPRESENT_RATE_UNLIMITEDを設定してデバイスを作成した時
設定されたリフレッシュレートを知りたい場合はどうすればいいんですか?
0621名前は開発中のものです。02/09/11 23:02ID:???
>>620
http://www.microsoft.com/japan/developer/library/jpdx8_c/_dx_idirect3d8_getadapterdisplaymode_graphics.htm
これ使っちゃダメ?
でもデフォルトだと0が取得できちゃったりする罠。
0622名前は開発中のものです。02/09/11 23:09ID:???
>>650
http://www.microsoft.com/japan/developer/library/jpdx8_c/_dx_idirect3ddevice8_getdisplaymode_graphics.htm

あ、こういうメンバ関数もあるんだ…。
でもデフォルトの0はD3DDISPLAYMODE型の仕様で定められてるっぽいので
それを確実に回避してリフレッシュモードを調べようと思ったら、
単位時間内のフリップ回数を数えるのがベストかなぁ…。
0623名前は開発中のものです。02/09/11 23:52ID:???
Visual C#とDXVBLib(Direct X 7.0 for Visual Basic)で簡単なチャットをつくろうと思っています。
DirectPlayのReceiveでDirectPlay4のQueryInterfaceに失敗しました。
というエラーメッセージが出ます。
エラーメッセージの意味がわかりません。
解決方法とかってあるんでしょうか。
0624名前は開発中のものです。02/09/12 00:03ID:???
Visual C#とDXVBLib(Direct X 7.0 for Visual Basic)
~~~~~~~~~~                  ~~~~~~~~~~~~~
1行目の時点で何か失敗しそうな予感がするのは私だけなのでしょうか…?
0625名前は開発中のものです。02/09/12 00:09ID:???
レスありがとうございます。
Visual C#でDirect Xを使おうとすると
DXVBLib(Direct X7.0 for Visual Basic)ぐらいしか見当たらなかったので
今はDXVBLibを使っています。
DXVBLibはComコンポーネントなので、
どの言語でも利用可能かと、、、
それと今のところは上以外不具合はありません。
よろしくお願いします。
0626名前は開発中のものです。02/09/12 00:22ID:xMICRC4q
>>621-622
うーんやっぱりデフォルトのときに0が戻ってくるのが困りますね
マイ黒ソフトの考えることはよーわかりません
可変FPSはあきらめて60固定でするしかないのかな?

どうもありがとうございました
0627名前は開発中のものです。02/09/12 00:24ID:???
ハァ?
可変FPSについて誤解してないか?
普通はフレーム処理にかかった時間を記憶して調整するだろ
0628名前は開発中のものです。02/09/12 00:45ID:???
液晶のリフレッシュレートってどうなってるの?
0629名前は開発中のものです。02/09/12 01:53ID:???
液晶ベンダー次第
0630名前は開発中のものです。02/09/14 10:16ID:???
日本語マニュアルって8.1のはないの?
0631名前は開発中のものです。02/09/14 12:34ID:???
>>630 MSDN内にあるよ。
0632名前は開発中のものです。02/09/14 14:53ID:???
ないよ
0633名前は開発中のものです。02/09/14 18:32ID:???
フルスクリーン<->ウィンドウの切り替えって
IDirect3D8::CreateDeviceで対応したデバイスを作り直すって事でいいのかな・・・
0634名前は開発中のものです。02/09/14 19:21ID:???
>>633
renda- sute-to de risetto
0635名前は開発中のものです。02/09/14 19:22ID:???
まちがい
プレゼントパラメータ設定してリセット
あーはずかし・・
063663302/09/14 23:21ID:???
リファレンス見ました
テクスチャとか全部破棄してIDirect3DDevice8::Resetするんですね
ありがとう
0637名前は開発中のものです。02/09/15 00:27ID:???
D3DPOOL_MANAGEDにしとけば破棄しなくても済む?
0638名前は開発中のものです。02/09/15 01:30ID:???
>>637
うん。
でもD3DXSPRITEとかあのへんのは破棄するしかないので諦めてやるしかない。
0639名前は開発中のものです。02/09/15 10:12ID:???
>D3DXSPRITE
使う必要性が見あたらないので、使わなければ良いだけでは?
0640名前は開発中のものです。02/09/15 10:40ID:???
ターゲットが WindowsXP なので
mciSendCommand , mciSendString の代わりにDIRECTSOUND で
音を出す必要が出てきました。
(NT4で動いたプログラムが動かんとは…)

そこで mciSendString("play hogehoge notify", NULL, 0, hWnd);
のように実行が終わったら特定のウィンドウにメッセージを
送るための仕組みはあるのでしょうか?

なかったら別スレッドを立ててそういうルーチンを組まないといけないのでしょうか?
0641名前は開発中のものです。02/09/15 10:45ID:???
>>640
DirectX7のヘルプだとチュートリアルの中に「再生の通知の処理」という項目があるけど。
064264002/09/15 18:00ID:???
わかりました。もちっとDirectXのサンプルソースをなめまわしてみます。
0643名前は開発中のものです。02/09/17 08:49ID:???
>>640
うちでは、mciで普通に動いているけれど・・
0644名前は開発中のものです。02/09/17 09:43ID:???
時々TRIANGLESTRIPはパフォーマンスがいいからそっち使おうって話を聞きますけど、
実際のところTRIANGLELISTなんかよりもよかったりするんですか?

例えばハイトフィールドをDrawIndexedPrimitiveで描画するとして、
TRIANGLELISTなら一発で描画できるけど、
TRIANGLESTRIPでは帯を何度か描画しなきゃならないっすよね。

COM呼び出し回数を減らすのも十分な高速化だと思うんですが…
0645名前は開発中のものです。02/09/17 12:08ID:???
原則的にはそう。
ただしご指摘の通りDrwPrimitiveのオーバーヘッドが大きいのでDirectXでは効果が薄い
(OpenGLなんかは早いよ)

市販ゲーなら必須かもしれんが、趣味プロなら要らないかも
まぁそーいったチューンを楽しむのも趣味プロの一環だろうけど
064664402/09/17 16:13ID:???
>>645
オーバーヘッド考慮しなければ高速なんですね。
Strip化とDrawPrimitiveの回数減らすのって全く逆になりそうだし、
実際どちらがいいのか不思議で仕方なかったんですがスッキリしました。
ありがとうございます〜
0647名前は開発中のものです。02/09/17 16:23ID:???
3角形を書くのには3頂点必要だけど、ストリップなら+1頂点で三角形が書けてしまう
100個の三角形書くのに listなら 300頂点、stripなら99+3頂点。役1/3

後オーバーヘッドだけじゃなくて、最近のビデオカードは頂点キャッシュがあるので、キャッシュヒットすれば
演算が省かれるので差がつきにくいつーのもありかと

0648名前は開発中のものです。02/09/17 21:35ID:???
皆さんはSetTextureStageStateとかSetRenderStateとかでステータスを変えて描画した後どうしてますか?
変える前のステータスはGetで保存しておいて、終わったら全部復元みたいな感じなんですかねぇ
書き換えたステータスが他のところで影響したりしてしまって結構面倒。。

Direct3Dにレンダーステートのスタック機構が整ってるとうれしいとか思う今日この頃
0649名前は開発中のものです。02/09/17 21:48ID:???
COM呼び出しってそんなにオーバーヘッド無いぞ、
コストは普通の仮想関数呼び出しと変わらない。
DCOMはプロセス超えるからオーバーヘッドあるけど。
0650名前は開発中のものです。02/09/17 21:49ID:???
んじゃ単に関数呼び出しが重いってだけ?
0651名前は開発中のものです。02/09/17 21:50ID:???
>>648
スタックだとOOPと相性が良くない罠。
ステートマシンだからD3D8の様な形に出来たと思う。
■ このスレッドは過去ログ倉庫に格納されています