鬱だ氏のう DirectX (Part 5)
■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものですた。
02/07/23 00:32ID:DsnWt/i.初心者用相談室では扱わないような少し高度な話題も受け持つ。
■旧スレ(プログラム板)
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)
コピペスマソ
0648名前は開発中のものです。
02/09/17 21:35ID:???変える前のステータスはGetで保存しておいて、終わったら全部復元みたいな感じなんですかねぇ
書き換えたステータスが他のところで影響したりしてしまって結構面倒。。
Direct3Dにレンダーステートのスタック機構が整ってるとうれしいとか思う今日この頃
0649名前は開発中のものです。
02/09/17 21:48ID:???コストは普通の仮想関数呼び出しと変わらない。
DCOMはプロセス超えるからオーバーヘッドあるけど。
0650名前は開発中のものです。
02/09/17 21:49ID:???0651名前は開発中のものです。
02/09/17 21:50ID:???スタックだとOOPと相性が良くない罠。
ステートマシンだからD3D8の様な形に出来たと思う。
0652640
02/09/18 01:34ID:???うちではmp3の読み込みと再生を全部mciでやってたけど、
codecが腐ってたからどえりゃあ不安定で再生できたりできなかったりしたんですよ。
とりあえずwavに交換してその場はしのぎましたが、
ファイルサイズを小さくするのが至上命令なんで
mp3の再生をDIRECTSOUNDで行おうかと考えたんですよ。
0653名前は開発中のものです。
02/09/18 02:56ID:???ストリップになりません・・・
って俺だけかな。工夫が足らない?
0654名前は開発中のものです。
02/09/18 03:58ID:???世の中にはOggVorbisという便利なものがありますよん。
圧縮率・音質ともに良好なので念のため考えてみるべし。
0655名前は開発中のものです。
02/09/18 06:12ID:???意表をついてMODという手もある
ttp://www.mars.dti.ne.jp/~odaki/mod/index.html
CからMOD再生DLL↓
ttp://www.un4seen.com/music/
ちなみに
Unreal TournamentがMODで
UT2003がOggVorbis
0656名前は開発中のものです。
02/09/18 21:48ID:???インデックス使えばストリップ使う必要性が全くないと思うんだけど・・・
0657名前は開発中のものです。
02/09/18 23:41ID:???SD-RAMからRIMM1066なって転送スピード10倍とかになったので
リファレンスラスタライザーもちっとは動くかと思ったら、やぱし全然駄目ですた
ソフトレンダのVirtualONはどうかと思ったら MMXに対応していません とかエラー出やがります
ショボーン
地面にテクスチャをタイルのように並べてマップを表現しています。
一気に書けるように、256*256pixelのテクスチャを64*64単位のパーツを分けて
地面にペタペタ張っているのですが、
継ぎ目に隣のテクスチャが微妙に見えてしまいます。
頂点がpixelの中央になるようにuvを、例えば
(0.0 , 0.0)-(0.25 , 0.25)から
(0.0+0.5/256 , 0.0+0.5/256)-(0.25-0.5/256 , 0.25-0.5/256)
のように変更してもダメでした。(遠ざかるにつれ継ぎ目が見える)
ミップマップが効いているため、遠くのポリゴンでは
+0.5/256 でなく +0.5/128 等に変更しないとダメのようです。
どのようにすればこの問題を解消できるのか
教えていただきたいです。よろしくお願いします。
0659名前は開発中のものです。
02/09/19 02:25ID:???0660名前は開発中のものです。
02/09/19 17:36ID:???どんな数値入れればいいのでしょうか?
ms単位だと変な位置でリピートするのですが、教えてくださいお願いします。
0661名前は開発中のものです。
02/09/19 19:45ID:???0662名前は開発中のものです。
02/09/19 20:03ID:???DirectMusicってms単位じゃなくてMIDIみたいなTick単位じゃなかった?
使ったことないから自信ないけどそうだった気がする
0663名前は開発中のものです。
02/09/19 23:29ID:???IDirectXFileEnumObject::GetNextDataObject()が
DXFILEERR_PARSEERRORを返してwhileループから抜けてしまいます
↑はヘルプを見る限り返さないはずですが・・・
あとIDirectXFileData::GetType()でGUID拾ってくるのですが
これはCOMオブジェクトを作れと言ってるのですか?
ヘルプの
DirectXGraphics->高度なトピック->Xファイル->使い方->ロード
だけだと情報が少なすぎます
どうかご教授お願いします
プログラム版の方にも書いたんですが進行遅そうなので
こっちに書かせていただきましたごめんなさい
0664名前は開発中のものです。
02/09/20 00:04ID:???何かキーが押されたらIDirectMusicPerformance8::GetTime()で
その時点のMUSIC_TIME拾ってそれをメモっといて
IDirectMusicSegment8::SetLoopPoints()
に渡せばいいんじゃないかな
8始めたばっかでAudioはやってないけど7の時はそれでできますた
漏れはXFileの解析で苦しんでるんですよ誰か教えて
0665664
02/09/20 00:08ID:???曲の位置=nowtime-starttimeだったっけ7は
0666名前は開発中のものです。
02/09/20 00:08ID:???直接読んだ方がイイよ。
0668名前は開発中のものです。
02/09/20 00:17ID:???ヘルプ読めよ・・・
0669663
02/09/20 00:22ID:???ヘルプに書いてあるのは知ってましたが
たくさんあるテンプレートやトークン全て考慮して自力でやる方が
MSのルーチン使うよりも簡単なんですか?
0670ヴァニラあいす ◆Af963Yl.
02/09/20 00:27ID:???.Xファイルは実は自前のルーチンも持っているんだけど、
今回はあえてD3DXライブラリを使って試してるとこ。
漏れも今いろいろ試してるので、何か分かったら書きます。
期待せずにまってて頂戴。
途中で投げ出しちゃったらごめんなさい。w
0671名前は開発中のものです。
02/09/20 00:28ID:???不要な情報は読み捨てる。
0672名前は開発中のものです。
02/09/20 00:28ID:???ここはゲ製だから、666はゲームが内部に持つローダーと仮定しているのだとおもう。
それならば対応すべきテンプレートなどたかが知れてる。それともツールでも作るのかね?
0674671
02/09/20 00:36ID:???テンプレートなんてほとんど無視できると思うんだけど。
どーですかね?
0675名前は開発中のものです。
02/09/20 00:38ID:???0676663
02/09/20 00:39ID:???>>674
テンプレートとかよく分かってないんで勉強が必要です
0678名前は開発中のものです。
02/09/20 00:41ID:???スキンメッシュの分割自前でやっとるん?
0681名前は開発中のものです。
02/09/20 00:46ID:???んで、何を質問してたんだっけ?
0682663
02/09/20 00:50ID:???Xファイルから独自フォーマットのコンバート
欲しいサブセットデータは頂点、法線、テクスチャuv、
ストリップインデックス、マテリアル、テクスチャファイル名
と多分こんなもんです
0683名前は開発中のものです。
02/09/20 00:53ID:???それならばSDKの例のサンプルで読めるな。
読み込んだら好きなように吐き出せばOK。
0685663
02/09/20 00:56ID:???0686名前は開発中のものです。
02/09/20 01:01ID:???0687名前は開発中のものです。
02/09/20 02:52ID:???の資料なんてまだないよねえ・・・
0688名前は開発中のものです。
02/09/20 17:41ID:4/XpyZrjXファイルからコンバート中なのですが
ID3DXMeshの個々のサブセットのストリップインデックススタート値と
個々のサブセットの面の数はどうやって調べればよいのでしょうか?
コンバートした後にIDirect3DDevice8::DrawIndexedPrimitiveを
呼び出すときに使うので・・・
あとD3DPRIMITIVETYPEを調べるのは不可能ですか?
よろしくお願いします
0689688
02/09/20 17:45ID:???サンプルのPick Polyを参考にしながらやってます
0690688
02/09/20 18:33ID:???使えそうな気がしてきますた
これでやってみます
これで合っていたらお騒がせして申し訳ありませんでした
0691名前は開発中のものです。
02/09/20 19:31ID:???別の場所でkernel32.dllのエラーが起きるとかいう不可解な状況なのですが…
(それもプログラム始まって数行目の凄い簡単なコードの場所で)
まさかこんな状況になった人ってほかにはいませんよねぇ(汗
ちなみに環境はWin2k/VS.NET/DX8.1/MultiThread/Unicodeでコンパイル、
実行環境は他人のマシンでWin98上書きMe/DX8.1らしいです(かなり古いらしい)
当然ながら自分のマシン上では問題なく動きます。それだけにデバッグしにくい…
0692名前は開発中のものです。
02/09/20 19:39ID:???リンカとかコンパイラとかのバグかと疑いたいです(w
0693688
02/09/20 20:01ID:???漏れにはお手上げです
動作環境のテストは個人では難しいのでは?
ID3DXBaseMesh::GetAttributeTable()はID3DXMesh::Optimize()しないと
駄目らしい・・・んでOptimize()の呼び方が間違ってるのか失敗しる
それで最初の質問
ID3DXMeshの個々のサブセットのストリップインデックススタート値と
個々のサブセットの面の数はどうやって調べればよいのでしょうか?
あとD3DPRIMITIVETYPEを調べるのは不可能ですか?
どうかこのウツケな漏れにお教えください
スレ汚しごめんなさい
0695名前は開発中のものです。
02/09/20 20:37ID:???> /Unicode
Unicodeにする必要性はサテオキ
win98でunicodeプログラムって正常に動くんだっけ?
あと、unicodeなのに D3DXCreateTextureFromFileEx"A"
とはいかに。Wな気がするが。
0696691
02/09/20 20:59ID:???MSLUを使えばWin98上でUnicodeも動くし、
マルチバイトでW版が使えるのと一緒でUnicodeでもA版は動くよ
LPDIRECT3DDEVICE8 CreateDevice();
LPDIRECT3DTEXTURE8 CreateTexture();
int WINAPI WinMain(...)
{
HINSTANCE hDll = LoadLibraryA( "unicows.dll" );
someclass* instance = new someclass;
LPDIRECT3DDEVICE8 device = CreateDevice();
LPDIRECT3DTEXTURE8 texture = CreateTexture();
texture->Release();
device->Release();
delete instance;
FreeLibrary(hDll);
return 0;
}
の、new someclsssのところで死ぬんですよ。
んでCreateTextureをコメントアウトすると動く… 不可解すぎ(汗
0697名前は開発中のものです。
02/09/20 21:04ID:???0698691
02/09/20 21:14ID:???とりあえずUnicodeチェックはやめてみようと思います。
しかしテストしてくれる人に会えるのが3日に一度でテストすらできず…
0699名前は開発中のものです。
02/09/20 21:20ID:???0700691
02/09/21 00:30ID:???今までunicows.libをリンクしてただけだったんですが、
MS公式サイトの説明通りに/nodでkernel32とかを無視させるようにしたらいけました。
D3DXCreateTextureFromFileで死んでたのは多分、
関数内でUnicows.dll内のファイル系関数を呼ぶのに失敗してたんじゃないかな?
という感じです。どうもお騒がせしました…。
0701名前は開発中のものです。
02/09/21 08:56ID:???0702名前は開発中のものです。
02/09/21 10:03ID:viCl1ubd'UINT_PTR' : 定義されていない識別子です。
とか出てエラーになるのですが適当にtypedef int* UINT_PTR;と入れても
'&' : 不正な左オペランドです。
とか出るのですがVC5.0+DX8.1bSDKの組み合わせは駄目ですか?
FAQかもしれませんが検索してもヒットしなかったのでよろしくお願いします
0703名前は開発中のものです。
02/09/21 10:21ID:???0704702
02/09/21 10:38ID:???UINT_PTRとはどういった型なのかを教えて下さい
d3dx8math.hのstruct _D3DXMATRIXA16の中のnewオーバーロードで
エラーが出てしまいます
0705名前は開発中のものです。
02/09/21 10:51ID:???#ifdef _WIN64
typedef unsigned __int64 UINT_PTR, *PUINT_PTR;
#else
typedef unsigned long UINT_PTR, *PUINT_PTR;
#endif
0707702
02/09/21 11:05ID:???d3dx8math.hに#include <basetsd.h>
としたら大丈夫みたいです
0708名前は開発中のものです。
02/09/21 20:33ID:???スプライトを描画する場合VertexBufferは4頂点分の大きさが必要だけど、
何種類ものスプライトを表示する場合、やはりVertexBufferは1スプライト
に1つ作成するものなのでしょうか?
考えてるのは、グローバルに1つスプライト用のVertexBufferを作っておいて
描画するときに、VertexBuffer更新する方法なのですが
みなさんどうしてますか?
もしかしてスプライトの場合でもVertexBufferを固定で、一つ一つ
WorldTransformかけてるのかな?
0709名前は開発中のものです。
02/09/21 21:14ID:???深く考えずにTLVertexとDrawPrimitiveUPでいいと思う
0710708
02/09/21 21:49ID:???確かにそうなのですが。(以前はTLVertexとDrawPrimitiveUPを使ってました)
しかし、今回はShaderを使うこともあり、どうしてもVertexBufferを
使うしかないんです。
例をスプライトからパーティクルに変えますが、
class ParticleList
{
Particle par[1000];
VertexBuffer* vb
}
と
class ParticleList
{
Particle par[1000];
VertexBuffer* vb
}
0711708
02/09/21 21:53ID:???----
class ParticleList
{
Particle par[1000];
static VertexBuffer* vb
}
では、どっちがいいかな?
毎フレームパーティクルの座標は書き換えるので、大きいVertexBufferを
作って全てのパーティクルで共有した方がいいと思うんだけど。
0712名前は開発中のものです。
02/09/21 22:03ID:???あとは毎フレームそれにつっこんで1回のDrawで描くよ
0713709
02/09/21 22:55ID:???MAX_SPRITE分の四角形を描画できる三角形リストのIndexBufferを用意
IndexBufferは何度描画しても変わらないから最初に初期化だけしとく
後はスプライトの四点をVertexBufferに書き込んでいってDrawIndexedPrimitive
ただこれは一歩間違うとUP系より遅くなる可能性があるんで注意
メインループのスケジューリングが結構大切です
(Presentの"直後に"DrawIndexedPrimitiveを呼べないなら、
DrawPrimitiveUPで早い段階からスプライトを1つずつ描画したほうが早い場合も)
0714709
02/09/21 23:01ID:???ttp://isweb42.infoseek.co.jp/computer/t_tail/program/vsdx8/d3d/020/index.htm
上の表のDrawPrimitiveUPのレンダリング時間とDrawIndexedPrimitiveの差に注目
それとRender.cppも参照しる
0715名前は開発中のものです。
02/09/22 00:12ID:???nvidiaのサイトで拾ったDynamicVertexBuffer/DynamicIndexBufferの
テンプレート使ってUPと対等。
事前にIndexBufferを用意してやっとDrawIndexedPrimitiveUPに勝てた。
0716名前は開発中のものです。
02/09/22 04:32ID:fagAZlUuLPDIRECT3DTEXTURE Image;
void load(LPDIRECT3DDEVICE8* pDevice,char* filename){
D3DXCreateTextureFromFile( *pDevice, filename, &Image)
}
がD3DXERR_INVALIDDATAを返して失敗します。
これを呼び出す前にメッシュのロードに成功しているのでpDeviceにはしっかりとした値が入っていますし、filenameも"a.bmp"でフォルダにa.bmpも存在しています。
いったいなにが悪いのかわかりません。
0717名前は開発中のものです。
02/09/22 05:08ID:???カレントディレクトリがどこか確認しる。
0718名前は開発中のものです。
02/09/22 05:15ID:fagAZlUuDebugから直接アプリを起動しているので間違いないとおもいマス。
エラーのチェックはこうやってます。
switch(D3DXCreateTextureFromFile( *pDevice, filename, &Image))
{
case D3DERR_NOTAVAILABLE : MessageBox (NULL,"NOTAVA","e",MB_OK);break;
case D3DERR_OUTOFVIDEOMEMORY : MessageBox (NULL,"OUTOF","e",MB_OK);break;
case D3DERR_INVALIDCALL : MessageBox (NULL,"INVAOLODCA","e",MB_OK);break;
case D3DXERR_INVALIDDATA : MessageBox (NULL,"INVAILDDATA","e",MB_OK);break;
case E_OUTOFMEMORY: MessageBox (NULL,"E_OUTOOFMEMA","e",MB_OK);break;
}
0719名前は開発中のものです。
02/09/22 05:50ID:???知り合いのMatroxのVGAで動かしたら駄目らしいんです。
ここまではよくある話なんですが、ちょっと不可解なので…
ALPHAOP と COLOROP にそれぞれ
STAGE0 に D3DTOP_MODULATE, D3DTA_TEXTURE, D3DTA_DIFFUSE
STAGE1 に D3DTOP_MODULATE, D3DTA_TFACTOR, D3DTA_CURRENT
と指定するのと、
STAGE0 に D3DTOP_MODULATE, D3DTA_TEXTURE, D3DTA_TFACTOR
と指定するので表示結果が変わってしまいました。
具体的には、最初のほうのTFACTORが影響されてない感じでした。
(頂点ディフューズ色は0xFFFFFFFFでデフォルトと一緒にしてます)
テクスチャステージも3まで対応してるとD3DDEVCAPS8には出てるし、
他に考えられる原因が分かりません…。
0720名前は開発中のものです。
02/09/22 06:07ID:???話題はずれるが、今後のためにD3DXGetErrorStringを見といた方がいいぞ
0721名前は開発中のものです。
02/09/22 06:26ID:???myproj\data\mesh.x
myproj\data\a.bmp
myproj\debug\prog.exe
D3DXLoadMeshFromX("data\mesh.x"...);で読んだら
"a.bmp"のパスは"data\a.bmp"
0722名前は開発中のものです。
02/09/22 07:53ID:fagAZlUu0723名前は開発中のものです。
02/09/22 10:19ID:???リファレンスラスタライザではどうなる?
リファレンスと異なるならMatroxに報告してあげるとか・・・
0724名前は開発中のものです。
02/09/22 12:47ID:???よくある間違いだ。過去ログ見るひとのために一応書いておくと
./debugのアプリは ./ に移動させてから実行しないといけないんだよな。
0725719
02/09/22 13:55ID:???うちの環境のREFで実験したら、期待通りの動作でした。
Matroxの最新ドライバで試すのをすっかり忘れてたので、
それで駄目だったらMatroxに通報してみます
0726名前は開発中のものです。
02/09/22 17:05ID:???IDirectMusicLoader::GetObject()が全角ファイル指定すると
失敗するようになったんですが前のプロジェクトは全部捨てろと
MSは言ってーるのですか?・・・半角カタカナは前からだったけど
0727名前は開発中のものです。
02/09/22 18:53ID:???D3DTA_DIFFUSEとD3DTA_TFACTORは同時に使えない環境がある。
SDKの説明にもそんなことが書いてある。
NVIDIAでも同時に使えるようになったのはGeForce3から。
0729名前は開発中のものです。
02/09/22 21:21ID:???その地形の上をカメラが移動する、という風にしたいのですが
地形が盛り上がっているところや凹んでいるところで
カメラの高さをどのように上げ下げするのかわかりません。
検索したところBSPというものが引っ掛かったのですが
これを用いる方法しかないのでしょうか?
0730名前は開発中のものです。
02/09/22 21:23ID:???キーワードだけでも教えていただけると助かります。
0731名前は開発中のものです。
02/09/22 21:27ID:???0732名前は開発中のものです。
02/09/22 21:36ID:???これならx座標とz座標に応じてフィールドのy座標が決まるから、
それにカメラの高さを加えてやればいいだけだな
0733名前は開発中のものです。
02/09/22 21:41ID:???float field[FIELD_SIZE][FIELD_SIZE];
initialize(field);
int camera_x = hoge();
int camera_z = hage();
float camera_y = field[camera_x][camera_z] + camera_height;
このままだとカメラの移動に応じて高さが一気に変わるから適当に補完とかしる
0734名前は開発中のものです。
02/09/22 22:05ID:???0735名前は開発中のものです。
02/09/22 22:19ID:jVKC+C+Lそこは頭の使いようだろ?
HightFieldというアルゴリズム自体にはなんの問題も無い。
0736名前は開発中のものです。
02/09/22 22:29ID:???BSP(Binary Space Partition)と
>地形が盛り上がっているところや凹んでいるところで
>カメラの高さをどのように上げ下げするのか
はあまり関係ないよ。
BSPは空間分割のデータ構造とか探索のアルゴリズムの手法で、
君が求めてるのは多分ポリゴンメッシュとカメラオブジェクトの
当たり判定の話だしょ。
0737名前は開発中のものです。
02/09/22 22:45ID:jVKC+C+L0738名前は開発中のものです。
02/09/22 23:03ID:UA7t4cRe0739名前は開発中のものです。
02/09/22 23:35ID:???正解などない。
どのようにと聞かれても、地面の起伏に応じてカメラ動かせ
としか答えようがない。君にビジョンがないと話が進まないな。
BPSは今のところ本質的には関係ない。
0740名前は開発中のものです。
02/09/23 02:48ID:???0741名前は開発中のものです。
02/09/23 03:46ID:???聞いてやるよ、質問は何だ?
0742名前は開発中のものです。
02/09/23 07:06ID:???皆、小出しだね。そりゃ調べる力も必要だろうが…
漏れのやり方で良いなら、
先ず、ポリゴンは三角形として話を進める。地形は3ポリの集合。
ココで使うのは、平面の方程式、ax+by+cz+d=0って奴。
之を変形して、d=-(ax+by+cz)と考える。
んでカメラが居るポリゴンの位置(XZ平面での)を調べる。カメラで解らないのはY情報なんだから解るでしょ?
ココで其のポリゴンの三頂点のどれでも良いから、一つチョイスする。
その頂点と、他の二つの頂点でベクトルを定義して、外積か何かで法線ベクトルを出す。
そいつを単位化して、各要素をa,b,cとする。次は選んだポリゴンのX,Y,Zをx,y,zとして
d=-(ax+by+cz)の計算をしてdを求める。
こいつの値は変数にでもぶっこんで、値は知らなくても良い。
そして最後に、また変形、y=-(ax+cz+d)/bで考える。
ココでx,y,zはカメラの位置ベクトルの各要素、つまりyが求まる。x,zは解っているので
a,b,cは先程の法線ベクトルを単位化した各要素、dも先程求めた物。
つまりy以外は全て値が出てるよね。
お終い。
0743742
02/09/23 07:09ID:???間違い。スマソ
次は選んだ頂点のX,Y,Zをx,y,zとして
0744名前は開発中のものです。
02/09/23 08:20ID:???3頂点の重み付き平均でいいんじゃないの?
0745名前は開発中のものです。
02/09/23 08:25ID:???要約してみた。
D3DXIntersect
以上(ワラ
0746名前は開発中のものです。
02/09/23 09:01ID:???入れるにはどうすればいいんですか?
またはそれが載っているサンプルを教えて下さい
0747名前は開発中のものです。
02/09/23 09:56ID:???んなんロックして流し込めばいいだけだ。
つか、教えて君モロ出し系で質問するなら
「物凄い勢いスレ」とか「初心者歓迎スレ」のほうがいい。
ここだといきなり噛み付かれても文句いえねーよ。
■ このスレッドは過去ログ倉庫に格納されています