鬱だ氏のう 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)
コピペスマソ
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:???んなんロックして流し込めばいいだけだ。
つか、教えて君モロ出し系で質問するなら
「物凄い勢いスレ」とか「初心者歓迎スレ」のほうがいい。
ここだといきなり噛み付かれても文句いえねーよ。
0748名前は開発中のものです。
02/09/23 09:58ID:???http://game.2ch.net/test/read.cgi/gamedev/1013645518/
0749742
02/09/24 03:03ID:???そうきましたか…
ココはDirectX板だから関数があれば、それを教えれば良いのかも知れませんが…
処理的に何をやってるのか解らないで、使うってどうなんでしょう?
始めたばかりの時、行列で回転かけるのをRotation関数使わないで
ロックして全頂点をループで自前の行列計算したりってやりませんでした?
用意された関数オンリーな人って、バーテクス、ピクセルシェーダーとか
出来るようには、為ら無いんじゃ…
イチイチ平面の方程式にしないほうがイイんでないか?
xファイルを読み込む。カメラ位置はp0とする(x,zは特定されている)
頂点/インデックスバッファをロックして頂点データp1,p2,p3がまずわかる。
p1+a*(p2-p1)+b*(p3-p1) = p0 をp0のy座標,a,bについて解く
a >= 0 , b >= 0, a+b <= 1 ならそのポリゴン上にあるので求まったp0を採用
ポリゴン上になかったらほかのポリゴンを探す
でいいんでないか?知らんけど
んで、この方法だと毎フレームごとにポリゴンごとに判定しなくちゃイケナイから重い
初歩的な最適化の方法としては、画面をxzのグリッドで分けて、
グリッドごとに衝突する可能性のあるポリゴンのテーブルを作っておく
そーすっと、カメラの属するグリッドのポリゴンでのみ判定すればよくなる。
グリッド間隔は小さいほど効率が上がるがそれだけメモリを消費するんでテキトーに。
あとはアレだ。イチイチ頂点バッファのロックアンロックを繰り返すと重くなりそーなんで
頂点データは必要な部分をコピーしといたほうがいいな。
オレのラベルではこんくらいしか方法は思いつかん。もっとイイ方法があったら教えれ。
0751742
02/09/24 06:50ID:???744の3頂点の重み付き平均って奴ですね。
内分の関係を逆に捉えて、条件が満たされていれば点と点を内分する状態であると。
やはり、人のやり方って勉強になりますね。
こう言う、数学的なルーチンワークって面白いですよね。
>ポリゴン上になかったらほかのポリゴンを探す
これが、プログラマの腕の見せ所ですね。当方はへっぽこ専門生なんで
数学はともかく、プログラムはイマイチです。ここの最適化が重要ですね。
0752名前は開発中のものです。
02/09/24 09:56ID:???違うぞ。
0754名前は開発中のものです。
02/09/25 19:54ID:MSCNJlmHage
0755名前は開発中のものです。
02/09/26 01:23ID:Th5mYXTg0756名前は開発中のものです。
02/09/26 02:15ID:???適当なことをやったとき
0757名前は開発中のものです。
02/09/26 04:28ID:Th5mYXTgIDがもう少しでMSDN
0758名前は開発中のものです。
02/09/26 04:31ID:???0759名前は開発中のものです。
02/09/26 06:26ID:???757 名前:名前は開発中のものです。 :02/09/26 04:28 ID:Th5mYXTg
0760名前は開発中のものです。
02/09/26 07:41ID:???(゚∀゚)アヒャ!
0761名前は開発中のものです。
02/09/26 10:20ID:ANzLdQ8Eうちのマシンだと、たまにFPSが1も出ないような状況が起こってしまいます。
そんなに性能のいいマシンではないのですが、普通のDirectXを使った
ゲームはFPS60で普通に動いてます。
なんでそうなるのでしょうか。
再現性のないバグなのでよくわかりません。
0762名前は開発中のものです。
02/09/26 10:21ID:???0763名前は開発中のものです。
02/09/26 10:23ID:???> ゲームはFPS60で普通に動いてます。
UnrealTournament2003やBattleField1942でFPS60出てるなら、プログラム側のバグかと。
0764名前は開発中のものです。
02/09/26 11:05ID:???あと1枚画像を表示させるってのも具体的にどうやって表示してるのか。
0765名前は開発中のものです。
02/09/26 11:08ID:???>たまにFPSが1も出ない
DirectXの側でその手の不具合は聞かないな。
アプリのほうで凡ミスをやってる予感がするな。
戻り値はチェックしてるか。SDK付属サンプルは無事に動いてるか。
サンプルが無事に動いてるならそっちを参考にしたほうが早いぞ。
あとはアンチウイルスツールとかの常駐ソフトの所為かもな。
0766名前は開発中のものです。
02/09/26 11:41ID:???ドライバは最新のものにしてる?
古いものだと新しいDirectXに対応してなくて
変な現象が起こることがあるよ。
0767名前は開発中のものです。
02/09/26 11:54ID:???BattleField1942の通信対戦中にフレームレートが
極端に落ちる現象がたまーに起きる。それ以外は知らない。
0768名前は開発中のものです。
02/09/26 11:56ID:???0769名前は開発中のものです。
02/09/26 11:57ID:???0770名前は開発中のものです。
02/09/26 12:02ID:Th5mYXTgFPSを格納するバッファを更新してないかったというオチでしょうか。
あと、1枚表示させるだけの静止画だとFPSがどんくらいか判断しづらいです。
>>769
3dsに変換してconv3dsという糞ツールでxに変換してください。
0771767
02/09/26 12:03ID:???Win98SE+DirectX8.1b
BattleField1942(製品版)
ビデオチップはGeForce4Ti4200。
ドライバはBeta Detonator 40.52だ。
761の環境はどうだ。
0772名前は開発中のものです。
02/09/26 12:03ID:???HDDにアクセスしにいってるとかそういうのは無いか?
0773名前は開発中のものです。
02/09/26 12:03ID:???スレに合ってる内容とはとても思えないが…
とりあえずデータコンバータとしてもMetasequoiaをお勧めしとこう。
詳しくはMetasequoia公式のデータ交換の項を読め。
0774名前は開発中のものです。
02/09/26 12:10ID:Th5mYXTg0775名前は開発中のものです。
02/09/26 14:19ID:???0776名前は開発中のものです。
02/09/26 14:27ID:???どこかの会社が買い取って入門用3Dモデラ\39,800-とかで売り出すことになるんでない
0777名前は開発中のものです。
02/09/26 16:05ID:???フリーで何か良いソフトはありませんか?
0778名前は開発中のものです。
02/09/26 16:33ID:???0779名前は開発中のものです。
02/09/26 18:20ID:Th5mYXTgDirectX付属のDirectMusicComposerとかいうのがあったと思います。
0780名前は開発中のものです。
02/09/27 00:32ID:???SetTexture( 0, &rtex );
SetTexture( 1, &rtex );
SetTexture( 2, &rtex );
SetTexture( 3, &rtex );
のように4つのステージにセットしてピクセルシェーダーで
加工しようと思ったらt0以外ではうまくピクセルが取れなかった。
CopyRectして使ってみてもやはりステージ0以外ではうまくいかない。
ロードしてあらかじめ用意したテクスチャを使用した場合はどの
ステージのテクスチャもうまく取れたけど何か分かる人いない?
0781名前は開発中のものです。
02/09/27 04:58ID:???テクスチャ座標を適切にセットしてないだけかと。
0782名前は開発中のものです。
02/09/27 05:37ID:BHwi6z60■ このスレッドは過去ログ倉庫に格納されています