【C++】 DirectX初心者質問スレ Part32 【C】
※回答する人も、質問する人も必ず読んでください
これらに当てはまる人のための質問スレです。
1.C/C++は多少理解している。
2.最近DirectXを始めたばかり
3.SDKを見ても、Googleで検索しても、いまいち理解できない人
4.余計な雑談は不要ですよ
【 回答してくださる方 】
・ できるだけ優しく質問に答えてあげてください。
・ 優しく教えるのが嫌でしたら、解決するためのヒントだけでも結構です。
「ググれ」「SDK見れ」以外の回答でおながいします。
・ 神ですら理解不能な質問は無視して下さい。
【 質問する方 】
・ どんな事で躓いているのか明確にしよう。
・ 長くならないなら躓いている部分のコードを晒してみれ。
・ 解決した場合、お礼を言うのは当然だが、何をどうしたら解決したかを明確に書こう。
・ 回答して貰ったら、出来るだけお礼もしよう。
前スレ
【C++】 DirectX初心者質問スレ Part31 【C】
http://hibari.2ch.net/test/read.cgi/tech/1285850721/
そういや、DirectX10からXファイルが無くなってるんだが、皆はモデルデータを どのようにして扱ってるのですか?
今後10年くらいはDirectX9が主流だ。 だからXファイルで十分。 マイクロソフトがWindowsXpを越えるOSを出せるのだろうか、 その可能性は少ない。
9のヘルパー関数で読み込んで 頂点バッファやインデックスバッファ、アニメーションデータをそのままバイナリで保存しなおせば 直に扱えるデータの出来上がりじゃない
7 :
4 :2010/10/29(金) 11:22:39
なるほど、ありがとうございました
8 :
デフォルトの名無しさん :2010/10/29(金) 22:50:36
あれ?いつの間にDirectX SDKからX-File Viewerがなくなっちゃったのかな? OS再インストールして最新のSDK入れたらビューアがない… 今でも入手できる?
>>8 9だよね?
あるよバグってるけどw
DirectXViewerになってね?
でもバグってるんだ
正常なはずのXFileが読めない(ときがある!)
10 :
デフォルトの名無しさん :2010/10/29(金) 23:05:49
DirectXのDirectGraphicsで3Dゲームを開発しております。
下記URLの某ゲーム画面は牌や卓の輪郭がとても滑らかに表示されています。
ttp://blog-imgs-18-origin.fc2.com/s/a/n/sanmayonma/20090303_01s.jpg 私は「DirectXゲームグラフィックスプログラミングVer2.0」という本を参考に作ってみたのですが、
本の通りにXファイルから読み込んで表示させていますが、
輪郭が滑らかにならず、ぼかしがないギザギザな感じで表示されてしまいます。
一応オプションで
SetRenderState( D3DRS_DITHERENABLE, TRUE);//高品質描画
SetRenderState(D3DRS_ANTIALIASEDLINEENABLE,TRUE);//アンチエイリアス
ということはやっております。
どうやったら滑らかになるでしょうか。
>>10 それらのステートはアンタの環境で
サポートされてるの?
まずそっからでしょ
>>10 それ以前にそれらのレンダリングステートはポリゴンのジャギを消すのに役立たないでしょ
とりあえず手っ取り速くアンチエイリアスを掛けたいなら
CreateDeice時にフルシーン マルチサンプリングを有効にする
ttp://msdn.microsoft.com/ja-jp/library/bb172574 (VS.85).aspx
でも、かなり負荷がかかるしそれほど望むほど綺麗にはならないかもしれない
そのゲーム知らないからなんとも言えないけど
まずその牌はほんとに3Dなのだろうか?
ライティングもしてないようだし3Dっぽく描かれた2D絵のようにもみえる
3Dだとしたら
・牌のポリゴン数を見た目以上にたくさん使ってるとか
・シェーダーで輪郭線に対してぼかしをかけてるとか
・ざっくりやるなら一度バックバッファよりも2倍程度大きいレンダリングターゲットに描画してから
そのテクスチャをフィルター付き縮小してバックバッファに転送するとか
レンダリングステートのオンオフだけではなんとも出来ないなんらかの工夫をしてると思われ
>>12 事前にCheckDeviceMultiSampleTypeでチェック
OKならば
d3dPP.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dPP.MultiSampleType = D3DMULTISAMPLE_2_SAMPLES;
でCreateDeviceして
滑らかになったよ。ありがとう!
D3Dを扱う上で速度低下を招かないようにするためのTIPS集みたいのは無いでしょうか? 頂点バッファをLockしてアクセスする場合はSYSTEMメモリに確保しろというような。 Helpにも有る程度書いてあるのですが、書いてある箇所が分散しているので 速度に関係ある部分のみのまとめが無いかなと。
前スレのID3DXSpriteつかった奴って 使わないで自前でやるとどれくらいの速度がでるものなの?
自分ではかれや
>>17 同意
初心者スレだからって調子に乗りすぎだよな
>>16 まぁ、興味が無くもないから今日の夜時間あったらコード書くよ
20 :
デフォルトの名無しさん :2010/10/31(日) 02:47:55
Direct2Dでシェーダーは利用できますか?
Direct2Dはそういう使い方をするものじゃないです
>>21 thx. そうみたいですね…
Windows7SDKのサンプル見てたんですが、D3Dと併用すれば可能って感じですかね…
>>19 んで、書き込んだからには報告でもするのかと思いきや音信不通になるんだろ?
そのくせ回答者にいつも文句ばっかり言ってる類でしょ?
根っからの糞だよねw君w
これで本当に書き込まれたらなんて言い訳するつもりなんだろう
安心しろ。それはありえない。
directxってバージョン色々あるみたいだけどどれ勉強したら良いんだろう… 入門サイト見てたらdirectx9で2dからやると良いって書いてあるけど、 他のバージョンで仕様が変わっても勉強が無駄になりませんでしょうか?
Direct3D11からDirect3D9デバイスを使うように作ればいい。 その後の移行も楽になる。
>>26 9から始めるにしても固定機能は忘れてシェーダーのみでやれば
11と比べて資料も豊富だし、HLSLやプログラマブルシェーダーの知識は無駄にはならないと思う
でも全体でみると大幅に変わってるから
11が出来る環境があって今から勉強始めるなら11でもいいかもね
だろ。の人は相変わらず人に文句つける割に役に立つレスつけないなぁ
>>15 ありがとうございます。
MSDNではなくmhtの方しか見てませんでした。
11は確かXPでは動かなかったよね? d3dx11.dllがないとかで。(これどっかからダウンロードしてきて入れたらいいのかね。それでも無理そうだが) まぁXPを切り捨てるはめになるが、今から覚えるなら11の方がいい。9を覚えても無駄になる。 シェーダの書き方も変わってるから。
知らないならレスしなければいいのに
9でこれ覚えるだけ無駄っていうのあります?
人間が生きている事が無駄です。あなたは無駄を削除しますか
>>33 9でやる以上無駄なことなんて無い
有益無益で判断するくらいならおとなしく11でやりなさい
36 :
デフォルトの名無しさん :2010/10/31(日) 16:52:57
Windows7では11が標準でついてるみたいだけど、11に対応した グラフィックボードが少ない、というのは11特有の機能を使う ことができないという意味? 9相当の機能だけでいいのなら、11に対応してないグラフィック ボードでも11は一応動かすことができるの?
11の制約はVistaであってGPUではない 多少はGPUもあるけど
ちょっと日本語になってないな
40 :
デフォルトの名無しさん :2010/10/31(日) 17:08:25
ちょっと質問です。XP、DirectX 9.0 SDK (October 2004)、GeForce 9600GT を使っています。 今、ビューポートを画面と同じサイズにして3Dモデルを描画しています。 これを、例えばそのまま 100px 左にずらして描画したいのですが、方法がわかりません…。 単純にモデルの位置をずらしても、カメラとの角度が変わってしまうため、見た目が変わります。 奥行き自体は表現したいので、平行投影にすることはできません。 単純にビューポートを左にずらした場合、つまり D3DVIEWPORT9::x = -100 とした場合、何も描画されなくなりました。 (SetViewport で D3DERR_INVALIDCALL が返ってくると思ったのですが、エラーは返って来ませんでした。) 一度、テクスチャに描画してからあらためて D3DFVF_XYZRHW でそのテクスチャを描画すればうまく行くのですが、 これだけのために2段階描画にするのも…と思いますし、他のモデルとの奥行きを考えるのが難しくなります。 今考えてるのは、射影行列を頑張って作る方法(左右対称ではなく、右に偏ったカメラを作る)ですが、 なかなか上手くいきません…。 もっと単純にずらす方法はないでしょうか? よろしくお願いします。
>>41 ビューポートはスクリーンサイズを越えて指定はできないはず
モデルを横にずらして
ビルボードと同じ要領でカメラの方に回転させればいいじゃない
カメラ座標に変換するマトリックスを細工したらできそうな気がする 計算は・・・・だれかお願いっ!
44 :
41 :2010/10/31(日) 22:23:34
>>42 説明が下手で申し訳ないのですが…。
例えば長方形の板ポリを2枚置きます。
(A)
1枚目はカメラ正面、カメラ向き。2枚目は1枚目と同じ向きで、カメラより右よりに置きます。
この場合は、2枚ともZ座標が4頂点で全て同じになり、そのまま長方形として描画されます。
(B)
ところが、Y軸を中心に90度回転させた場合、正面に置いた板ポリはちょうど見えなくなりますが、
右に置いた板ポリは角度がついて見えてしまいます。
ビルボードのようにカメラの方を向けてしまうと、(A)の段階で既に角度がついてしまい、台形になります。
>>43 射影行列で、例えば x 座標を x' = m(x + n) のような式にできる場合、同時座標を使った行列変形できるのですが
そう単純な結果にならず…苦労しています
一枚目と二枚目の それぞれをビルボードとして設定しなさい。 それをそれぞれ90°回転するのですね グローバルから見て、Y角度は異なりますね カメラの画角によりますが周囲の歪みが出るかもしれません、それは仕方ない。
>>44 // カメラから求められたビュー行列
D3DXMATRIX matView ;
// ビルボード行列
D3DXMATRIX matInvView;
D3DXMatrixInverse ( &mInvView, NULL, &matView ) ;
mInvView._41 = mInvView._42 = mInvView._43 = 0;// 移動オフセットを殺して純粋な回転行列にする
// ワールド行列
D3DXMATRIX matWolrd;
// 縮小行列
D3DXMATRIX matScale;
// 回転行列
D3DXMATRIX matRot;
// 移動行列
D3DXMATRIX matTrans;
matWolrd = matScale*matRot*matInvView*matTrans;
↑
ココに掛ける
これでダメなら知らない
>射影行列を頑張って作る方法(左右対称ではなく、右に偏ったカメラを作る) D3DXMatrixPerspectiveOffCenterLHじゃだめ?
>>46 ビルボードでしょうか?
うーん、やはり上手くいかないです…
上手くいかなそうですね…
>>47 おお、行けそうです…
まだ理解できてなくてサイズがおかしいことになっていますが、位置が違う物体が同じ向きで回ってる…
希望が見えてきました!!!
>>47 時間かかりましたができました!!!!
行列でうまくできたんですね…まだまだ行列の理解も足りないようです。
ありがとうございます!!
理解って、高校で習った筈だろ。 数Cだっけ?
習った!=使える それに文系とか、理系でも選択してないとかでCやってない人も多い
うーん、行列は習いましたが、掛け算とか逆行列とかまでです。 複素数平面世代なので、一次変換すら習っていません。何に使うかとかには一切触れませんでした。 3Dへの応用とかは全く別分野だと思います…。
ウィンドウのクライアント領域と同じサイズのDDBを用意して、 BitBltでそのままウィンドウのデバイスコンテキストに転送して計測したfpsと、 Direct3D9で単純にBeginScene→EndScene→Presentしただけのfpsとでは、 前者の方が早いのですね。 こんなものですかね?
転送しただけで更新命令が出てないから画面書き換えは起きてないってオチじゃなくて?
そのBitBltするピクセル領域に、 DXで描画するのと同じレンダリング結果になる処理を自前でしてみなよ (頂点情報からライスライズしてポリゴンを描画、そのポリゴンにテクスチャマッピングやライティング等のシェーディング処理) ちょっとしたレンダラをWinAPIだけで作った事あるが、 スキニング無しで単純なモデルを自前レンダリングするだけの描画でDXに完敗だったよ GPUとそのドライバ(HAL)が使えないのは、ゆくゆくの実際の使用に耐えられないよ 今のメニーコアで、並列処理とSIMD命令使いまくりのコードかけば、少しは行けるかも知れないけどw
DirectXの方が垂直同期取ってるだけとか
>>55 まずは、実際のFPSの数値を出さないと。
60 :
>>55 :2010/11/01(月) 04:30:28
PresentationIntervalはD3DPRESENT_INTERVAL_IMMEDIATEなので垂直同期はなしの筈。 画面サイズによってはD3D9のほうが早かったりする…
で、いくつなんだよ
>>56 DDBを直接ウィンドウのDCにBitbltしてるので即座に画面に結果が表示されてるので、それはないかと。
>>57 それはごもっともです。
>>59 DDB D3D9
256 x 256 = 4,500 3,600
600 x 480 = 850 1,000
あれ〜…サイズによって違うし…
なんにせよ何の意味もない比較だな
妥当なFPSだと思うね。 しかしだ、色々表示した場合のDXのスピードに驚く必要がある。 多くのオブジェクトをDCに描画する遅さを気がつくべきだ。 毎回一枚絵だったら別だが、それはビデオ映像しかないしな。
DDB D3D9
300 x 300 = 3,300 3,000
1280 x 700 = 220 90
>>63 意味はないねw
>>64 ごもっともです
その90って、何か間違ってると思うが、いかに。
open glとだったらどっかが速いの?
なんか計測方法に問題がありそう
ほとんど使ってなかったけどBBX無くなったのね
70 :
>>55 :2010/11/01(月) 12:03:49
あぁ記述漏れしてた。 D3D9の方はバックバッファ一つで、ウィンドウのクライアントサイズにしての結果です。
71 :
>>55 :2010/11/01(月) 13:24:39
ゲーム画面の解像度ってどんな比率と大きさでやるのがトレンド? いまって4:3のディスプレイのが少ないよね?16:9? 800x600で組んでたけどもう時代遅れかなぁ・・・とかちょっと思ってる
PCは16:10も多い
>>72 1280x720がトレンドだと思い込んでみる
問題は1024x768のモニタだと横が足りないところだな
>>70 &
>>71 &
>>55 応答おそくなったよ。なかなか人のソフトの動作確認は、ちょい面倒だから。
D3D9
1280 x 700 = 1994 これはグラフィックボードがN6600GTで6年前ので性能悪いやつ
1280 x 700 = 200 これはヘボイノートPCの性能
実験しているPCはノートでしょ。それも俺のより性能悪い物かな
ソフト的には問題ないよ、90はグラフィックボードの問題。
性能いいグラフィックボードなら、10000いくと思う。
追記、そのノートPCで3D表示を多く出すのは厳しいだろうね。 俺もノートPCで作ってるけど、重いときはデスクトップでやってるから。
>>74 >問題は1024x768のモニタだと横が足りないところだな
まだ、そんなのあるの?
>>73 多いな
16:9はなんか申し訳程度にサポートされてる感が強い
79 :
>>50 :2010/11/02(火) 08:34:52
>>75-76 うおぉぉぉーーー!!!!
お忙しいでしょうに丁寧に検証して下さいましてありがとうございます!!!
まさかまさか検証してもらえるとは思ってなかったのでw
ご明察の通り、しょぼいノートPCです。
hpのG62(三ヶ月前で8万円くらい)ですww
3D表示を多く出すのはちゃんとしたマシンでやればよさそうですね。
とりあえずノートでは256x256でレンダリングして512x512に引き伸ばしてやれば、
実用に耐えれそうなのでそれでやってみます。
ほんとにありがとうございました。
>>71 DirectXの方は毎フレームIDirect3DDevice9::Clearしてるのに
DDBの方は転送するだけってフェナな計測方法じゃないな
単純にVRAMがオンボとかでClearが遅いだけとかじゃね
家電はそうなんじゃね? PCは4:3が伝統的だし変える動機も無いと思う。640*480とか。
>>83 俺のPCだとなんかもうしわけ程度に1280x720(60Hzのみ他の解像度は75Hzはある)だけが
サポートされてて他の16:9はないんよ
なのでPCだと16:10が主流なのかな?と
こっち(16:10)は結構ある1440x900まである
横に縮むより伸びるほうがまだ許せるから4:3かなぁ 3Dならアス比が変わっても大丈夫なように作る よこに伸びたり視野が広がることでゲーム性が変わっちゃうようなゲームなら 中央部分だけ使うようにするかな
>>86 4:3だとなんかしょっぱく見えるんだよ(目が肥えた)
引き伸ばすとキャラがデブっちくなるからはじめから横にしておいたほうがいい感じ
デブくなるのはダメだがやせっぽっちになるのは許せるのか?
4:3にして両側に黒枠を付けるだけジャン
>>88 うん
そんなディスプレイ使ってる奴はきっとアス比が変わっても気にならない
てか、フルスクリーンモードで起動しないんじゃね?的な予想
ノートはハイエンドクラスだとワイドサイズが増えてきたけど ミドルレンジだとまだ4:3が多いからなぁ
>>91 ぜってーゲームなんかやんねーよそいつ
みたいな奴のこと気にするな
16:10とかワイドになったらエロゲの女の子のヨガスキルがさらにアップするな
>>92 おま、サポートに寄せられる苦情とか見たことないの?
うちのは16:10だけど最近どこ見ても16:9だしなぁ
>>79 安めのノートPCでDXを使う場合の注意事項と利点。
まず基本的に、グラフックの表示チップにDX3D機能ををハードで実装していない
場合が多い、この時はドライバー内でDX機能をエミュレートしている。
だから、単なるべた塗りはプログラム側でやってもDXでやっても似たようなスピードに
なりやすい。
問題はドライバーによるソフトエミュレーションにいくつかの機能制限が多いことだ。
なおかつ、DXの機能問い合わせで機能有り返るが、正しく動かなかったりする。
だから、動くはずだが動かないと悩む可能性でつまずくはずだ。
今回の単なる最小ループの更新も、スピードが変わらないとつまずいたはずだが、
ソフトエミュレーションのノートPCグラフィックなら当然そうなる。
検証用のPCが必要だ。しかし、そのノートPCで動くようなら、多くのPC上でも
問題なく動作する可能性が高いため、ユーザー上で動作しない問題を回避できる。
性能の良すぎるPC上で開発すると、他のPCで動作しない危険をつかみやすい。
指定したクライアント領域ぴったりのウィンドウを作るにはどうしたらいいでしょうか?
遅くなりました。
>>81 ! まったくもっておっしゃるとおりです…
という訳で検証してみた結果、
DDB D3D9
0256 x 0256 = 4,500 6,500(+2,900)
0300 x 0300 = 3,300 5,000(+2,000)
0600 x 0480 = 850 1,600(+ 600)
1280 x 0700 = 220 600(+ 510)
となりました。
>>100 >>71 のソースでちょうど使ってますw
あああ、AdjustWindowRect だった/(^o^)\
>>71 >g_D3D9Params.AutoDepthStencilFormat = D3DFMT_D16;
これ
D3DFMT_D24X8
にしろよ
>>100 ウィンドウレクトとってクライアントレクトとって引き算してウインドウの縁を取って、
縁に好みの大きさのクライアントの幅と高さを足してウインドウ変更という手もあるよ。
横からだけどその二つの手法ぐらいしか知らないんだがどちらが優れているか等はないよね?
107 :
105 :2010/11/03(水) 12:56:37
自分の手は、メニューがどうだろうとウインドウスタイルがどうだろうと気にしないで変更できる。 が、物理的にモニタからはみ出す場合はさらに計算しないといけない。
>>104 それに指定するとfpsが低下しますたorz
実は2Dゲームを想定しておりまして、
Zバッファのビット深度は特に気にする必要もないかと思われますので、
EnableAutoDepthStencil = FALSE;
AutoDepthStencilFormat = D3DFMT_UNKNOWN;
でやろうと思います。
これだけでfpsが256サイズだと400位の差が出ました。
EnableAutoDepthStencil = FALSE にしてるのに、
AutoDepthStencilFormat は D3DFMT_D16 や D3DFMT_D24X8 よりも D3DFMT_UNKNOWN の方が早いのですね…
109 :
デフォルトの名無しさん :2010/11/05(金) 11:24:54
ハード側のメモリに頂点情報やインデックス情報を持たせても、 Lockのコスト > 転送コストの場合、 実行速度は DrawIndexedPrimitiveUP > DrawIndexedPrimitive になる。 この認識でおk?
1フレームに相当回数Lockしないと逆転しないと思うが… 普通はやっちゃいけない実装だが 1フレームに数百回Lockするような仕様ならUPの方が速くなるかもね
>>110 dクス。
IndexBufferのインデックス作成は事前に行い、1フレームにVertexBufferをLockするのは一回だけ。
これでテストしてみたんですがね、マイPCだとどうにもUPの方が早いんですよね…
相当キワモノなグラフィックカードなのかなorz=3
静的頂点バッファをLockしてるとか
VRAMとシステムメモリ共用のビデオカードとか
>>113 Mobile Intel(R) 4 Series Express Chipset Family というビデオカードなのでそれかな!
と思ってたら…
>>112 VertexBuffer.Lock()で 0 指定してますた…
D3DLOCK_DISCARD で DrawIndexedPrimitiveUP より早くなりましたw
どうもお騒がわせして申し訳ありませんでした。
おかしいな〜…
>>71 なんですけど、
デスクトップ領域の左上や左下にウィンドウを持っていった時にfpsが激減するんですよね。
他の領域に持っていくと早くなる(元に戻る)。
何も処理してないってのに…
Win7使ってまして、Areoはオフ(Windowsクラシック)にしてるし、
AeroSnapもオフ(コンピューターの簡単操作センターにて)にしてるから
DWMが悪さしてるとは思えないんですけどね。
で、DwmIsCompositionEnabled で調べたらちゃんと 0(FALSE) 帰ってくるし、謎だ…
7ではおとなしくDirectX10 or 11にするべきなのかな…
C#でSlimDXのD3D11を使って、Stopwatchでfps計測してみたコードがあるんで、 それを実行してみたら… 同じ現象が発生した/(^o^)\
>>116 意味ないからやめろ
実際にゲーム作ったうえで計測しないと本当に無意味だぞ
同じもんを複数回描画したときと
違うもんをたくさん描画したときって描画の仕方によっても違うし
ぶっちゃけ環境のせいだと思われ
>>117 自分のコードが拙いのか環境なのか判断したくて色々調べたけど、
おっしゃるとおりですね。とりあえず後回しにします。
一応
>>71 のコードはテスト用にシンプルにしたものでして、
自分のゲームにのっとった形式でのテストはしております( ´∀`)ノ
>>118 色々弄ってみましたがね、多分そうなんでしょうね。
C#のStopwatchもQueryPerformanceCounter使ってるって話みたいですし、
ソコかDirectX(DWM含む)の中の方なのかなと。
ビューポート分割と、それに伴なうビュー設定に関して質問です。 「640x480」の画面を2分割し、「320x480」の画面を左右に2個置くようにビューポートを分割した後、(『ぷよぷよ』のイメージ) それぞれのビューポートに対して全く同じビュー変換・射影変換処理をして描画したところ、 後に設定した方のビューは、先に設定した方の2倍に引き伸ばされて描画されてしまっています。 これを、左右の画面で全く同じ描画が行われるようにしたいのですが、どうすればよいでしょうか。 普段作業しているPCでは、現状のコードでも左右で同じ画面が描画されるのですが、 別のPCでは上記のようになってしまい、困っております。
>>120 D3DVIEWPORT9 vp1;
vp1.X= 0;
vp1.Y= 0;
vp1.Width = 320;
vp1.Height = 480;
D3DVIEWPORT9 vp2;
vp2.X= 320;
vp2.Y= 0;
vp2.Width = 640
vp2.Height = 480;
みたいに矩形で指定しちゃってるとか
WidthとHeightはあくまで幅高さなので
vp2.Width = 320
vp2.Height = 480;
でないといけない
スクリーンから+方向にはみ出た指定をした場合
スクリーンに収まるように勝手に補正してくれるハードも有れば
してくれないハードもあったはず
>>121 言われた通りにして、治りました!すごい!
完全にSetViewportメソッドの仕様を勘違いしてました。
半日悩んでましたが、スッキリ解決して良かったです。
ありがとうございました。
エスパーすごいな
これはすばらしい 経験の賜物だな
>スクリーンから+方向にはみ出た指定をした場合 >スクリーンに収まるように勝手に補正してくれるハードも有れば >してくれないハードもあったはず これを知ってないとわからないよね
ビューポートはちゃんと指定しないと駄目なんだね。
127 :
121 :2010/11/06(土) 23:00:16
ごめ、ハードによって違うみたいな書き方しちゃったけどちゃんと調べたら嘘でした D3DCREATE_HARDWARE_VERTEXPROCESSING でデバイスを作った場合は ちゃんとスクリーンに収まるように変換されるくさい (座標変換済み頂点の場合はちゃんと指定してないとおかしくなる) D3DCREATE_SOFTWARE_VERTEXPROCESSING だとはみ出た分も計算されちゃうみたいで横にのびるようだ おそらく、デバイス作成のところに 頂点シェーダーのバージョンが1.1以下ならソフトウェア計算に切り替えるみたいなのが仕込んであって 不具合が出たほうはそれにひっかかったのだと思われ
まぁしょぼいVGAだと駄目という意味でならハード依存に間違いあるまい どちらにしてもちゃんと範囲内で指定しろってこったな
ビューポートっていったい何なんですか?
>>129 頂点の座標変換は
IDirect3DDevice9::SetTransformやシェーダーで指定する
ワールド、ビュー、射影変換の3つで終了ではなく
実はこの後、射影空間上の頂点をスクリーン空間座標に変換するビューポート変換が存在する
これはDirectX9以前ではデバイスにセットされてるビューポートに従って自動で行われる
通常はデフォルトでバックスクリーンと同サイズのビューポートが設定されてるので
変わったことをしようとしないかぎり気にしなくて良い
>>130 ありがとうございます。理解できました。
シェーダを使ってSSAOを実装しようとしています。 少し大きなサイズの「法線とデプスを持つテクスチャ(1024*1024)」を用いて 「SSAO影マップ(256*256)」を作りたいのですが、「SSAO影マップ」のサイズが 1024*1024でない場合、ぐちゃぐちゃなテクスチャを読み込んだようになってしまいます。 (たまに他のゲームなどで使われたテクスチャが出ることがあるので、変な所を参照しているようです) レンダリングターゲットを超えるサイズのテクスチャを使うことは出来ないのかとも思いましたが、 探してもそのような記述は見つかりませんでした。 どなたか分かる方がいらっしゃいましたら、よろしくお願い致します。
縮小したことにより遮蔽テストにノイズが混じることはあるけど 全然違うテクスチャを参照してるというならどこか根本的な所でミスがあると思われ そもそも「他のゲームなどで使われたテクスチャが出ることがある」と何故判断したわけ? 深度マップが正常に書き出されてるのは確認してるんだよね?
135 :
132 :2010/11/07(日) 15:43:28
ご返信ありがとうございます!
>>133 深度マップは正常に書き出されていました。
他のゲームで使われた〜〜〜というのは、その少し前に起動していた
他の市販のゲームのテクスチャが見えたからです。
>>134 よく分かりませんが、特にそのような指定はしていないと思います。
nVidiaコントロールパネルのmipmaを強制するは「なし」ですし、
サンプラの設定のMinfilterなどの部分は色々いじってみましたが、変わりませんでした。
>>135 深度マップ用のテクスチャをCreateTextureするときに
引数でMipレベルを0を指定してるから自動でMipMapが作られてるんじゃない?
縮小してるので作っただけで何も書き込まれてないミップレベルの領域が参照されてるのだと思われ
137 :
132 :2010/11/07(日) 16:42:20
>>136 言われた通り、CreateTextureでMipレベルを1にしてみたら正常になりました!
ずっと悩んでいたので、本当に助かりました。ありがとうございました。
お礼は
>>134 に言ってくれ
俺はそれをみて「あぁ、これだな」と思っただけだ
この処理をこう纏めたら、呼び出すのは楽なんだけど、 パフォーマンス的にはちょっと無駄がある、 という状況はありふれていますよね? こういう場合たとえば10000回読んで時間計測して、 これくらいなら許容範囲か・・・もしくはこれはまずいな・・・ という感じで決めていくしかありませんか?
なんて答えたらいいのか全っ然わかんねえ
>>139 ターゲットPC(もしくはハード)を決めてそのPCで動くかどうかのみ
10000回の計測とか同じ処理を何度も繰り返すのは
キャッシュのヒット率100%なのでなんの参考にもならない
>>141 あ、そうか・・・それもそうですよね
ありがとうございます
プロポーショナルフォントを高速に描画するにはどうしたら良いですか?
DirectWrite
あの、あまり環境に依存しないほうほうがよいです、、、
GDI
>>143 プロポーショナルフォントって指定してるってことは
等幅フォントではもう既にできてるんだよね?
あとは文字ピッチを1文字ごとに変えるだけじゃん
August 2007のSDKでXAudio2を使おうとするとエラー落ちするバイナリができあがる。 IXAudio2::Initializeの引数の数がヘッダとDLLで食い違うため。 ----- ここまでチラシの裏 何故IXAudio2VoiceってIUnknown派生じゃないんでしょ? CComPtrが使えなくて悲しい・・・
unique_ptrとかにカスタムデリータでいいんでない
>>143 Direct3D11にフォント描画機能がなくて実装中
必要な文字だけテクスチャに焼いて使うしかないんじゃね?
テクスチャに焼く作業文字変更する時焼きなおさないとだからマジめんどい
152 :
150 :2010/11/10(水) 17:39:32
一度使った文字を自動的に部品として追加していくと楽 2014x2048のR8G8B8A8テクスチャに16x16の文字を焼くとしたら1枚にwide charの全文字が収まるからアクセスも超早くなる予定 フォントスタイルを変えたらもう一枚必要だけど
DirectSoundなんだけど、プライマリバッファのSetVolume()を使うと ボリュームコントロールのWAVが動くんですよ これってつまり、全部の音の音量を増減をしようと思ったら全セカンドバッファ を一度に変更しないといけないってことですかね
>>153 プライマリバッファのボリューム弄ればいいじゃん
セカンダリのって個々の音のフェードインとかアウトで弄るから
あんまちょっかい出さねーほうがいいだろそうでもない?
質問させてください。 DXSDK9サンプルのEmptyProject([EP])に、サンプルSimpleSample([SS])のRenderText()の部分(機能)を 付け足そうとして躓いています。 エラーはhrが定義されていない識別子だという内容で、DXUTmisc.hのここ: #define V_RETURN(x) { hr = (x); if( FAILED(hr) ) { return DXUTTrace( __FILE__, (DWORD)__LINE__, hr, L#x, true ); } } のhrが定義されていないということなのですが、どこかでhrがグローバル変数のHRESULTとして 定義されているのでしょうか。 SimpleSampleで右クリックしてhrの定義を追っていっても、DirectXに直接関係のない ObjIdl.h, CommCtrl.hの構造体(MULTI_QI, NMTVASYNCDRAW)のメンバhrがヒットするだけです。 なお、 ・includeにOptionalを追加 ・プロジェクトにSDKmisc.hとSDKmisc.cppを追加 ・ライブラリにd3dx10d.libを追加(SimpleSampleにはデフォで入っているけどEmptyProjectにはない) などをして、V_RETURN()以外の部分ではビルドは通っています (V_RETURNを使っている行をコメントアウトするとビルド正常終了。もちろん正しく動作はしません)。
156 :
155 :2010/11/11(木) 01:30:58
むっちゃすみません。
>>155 ですが自己解決しました。
SimpleSampleにおいて、V_RETURN()のマクロが使われている箇所は、必ずその前に
HRESULT hr;
と宣言がなされていました。
つまりV_RETURNを使う箇所は必ず前もってHRESULT hr;を書いておくべしということですね。
てっきりマクロは単体で動き得るものと思い込んでいて、SimpleSample側で
原因を追っていく際にもV_RETURNの宣言(DXUT.h)から上位にしか注目していませんでした。
お騒がせしてすみませんでした。
157 :
質問です :2010/11/11(木) 15:06:32
DirectX9 にて、D3DXCreateFont() して作成した LPD3DXFONT の DrawText() でフォントを表示できているのですが、 DrawText() の戻り値でエラーコードが返されます。 Retail Version/Debug Version 共に ERROR_BAD_ENVIRONMENT(0x0000000a) が返されます。 WinError.h でそのエラーコードが定義されているのは判っているのですが、DrawText() が何故エラーになるのか判らないのです。 もし宜しければアドバイスいただけないでしょうか。 以下コード ↓↓↓↓↓ LPDIRECT3DDEVICE9 pD3D9Device; // 作成済みとする LPD3DXFONT pD3DXFont; HRESULT hr; hr = D3DXCreateFont(pD3D9Device, 10, 0, FW_NORMAL, 1, FALSE, SHIFTJIS_CHARSET, OUT_TT_ONLY_PRECIS, ANTIALIASED_QUALITY, FF_DONTCARE, TEXT("MS ゴシック"), &pD3DXFont); // hrはS_OK const LPTSTR& lpText = TEXT("hello world"); hr = pD3DXFont->DrawText(NULL, lpText, ::lstrlen(lpText), &rect, DT_LEFT | DT_NOCLIP, D3DCOLOR_ARGB(255, 255, 0, 0)); // hrはERROR_BAD_ENVIRONMENT(0x0000000a)
一部、コードが抜けてました…失礼。 RECT rect = { 0, 0, 0, 0 }; // { 0, 0, 200, 50 }等にしても同じ結果でした。
>>159 うわはぁ… ありがとうございましたorz
>>154 音楽はDirectSoundじゃないんで影響受けますからね
効果音再生に使うからフェード処理はやらないんじゃないかな?
まぁとにかくセカンダリ全部変更するようにしますわ。というか質問前する前に作っちゃったしw
レスありがとうございました
質問です 世の中にはデスクトップマスコットなるものがあるようでして そいつがアクティブなウィンドウのタイトルバーのどっかに腰かけるor走りまわるわけです 画面にマスコットが重なると ゲームがものすごく遅くなるのですがなにか回避策はあるでしょうか? できれば○○ちゃんといっしょにゲームをやりたいのでマスコットを終了したくないとか寝言を申しております
ハイエンドなグラボでSLIとかやってみれば
タスクの優先度を下げるとか てかDirectX関係無い
もうしわけありませんでした他所で聞いてみます
166 :
デフォルトの名無しさん :2010/11/12(金) 13:58:48
バックバッファのサイズよりウィンドウのクライアント領域が大きい(小さい)場合、 拡大(縮小)されますが、この処理はどこのどいつが行っているのでしょうか? 1) ウィンドウがやっている 2) DirectXがやっている 3) その他
具体的に何のインタフェイスのどのAPIかぐらい書けよ。
>バックバッファのサイズよりウィンドウのクライアント領域が大きい(小さい)場合、 >拡大(縮小)されますが、この処理はどこのどいつが行っているのでしょうか? そもそもサイズ変更はパラメータ次第なので、「される」わけではないし、 自分でそのように指定して「させている」だけ。
IDirect3DDevice9::Presentはサイズを変更したくなければ、 出力サイズを明確に指定すればいいだけの話。
>この値は NULL でなければなりません って多くね? 本当に設定できるのか?
すみません D3DXFONTの設定でフォントの文字間隔(縦、横)はどこで決めるのでしょうか?
すみません やっぱりいいです
>>175 他人になりきるの止めてもらえますか?
こういうところで育ちの悪さが出てしまうんですよ
>>176 ここでそういう観念が役に立たないのには気づかないのか。
郷に入らばなんだっけ?
成りすましが嫌ならトリップ使えばいいじゃない
>>181 そうですか
ありがとうございました
自力でなんとかするしかないのですね
一文字ずつ描けばピッチは変えられるぞな
9の話。動的なリソースってロストに対応するために常にシステムメモリにバックアップ作っておかなきゃいけないですか?
必要なら
>>184 毎フレーム作ってるもんに関してはいらないんじゃない?一瞬だし
ロード時に作ったもんは復旧時に読み直せばいらないし
特定の場面でしかできない特殊なもんぐらいしか考えられないのかな?
188 :
デフォルトの名無しさん :2010/11/14(日) 18:08:57
注視点を中心にカメラを回転させるには D3DXMatrixLookAtLHのカメラの位置のxとzを どのようにかえればいいんでしょうか?
>>188 こんなん
static float pos_x = 0.0f;
static float pos_z = 0.0f;
static float ang = 0.0f;//0-360
static float len = 100.0f;
float x = pos_x + len * cosf(D3DXToRadian(ang));
float z = pos_z + len * sinf(D3DXToRadian(ang));
ang += 1.0f;
if(ang > 360.0f)ang -= 360.0f;
190 :
デフォルトの名無しさん :2010/11/14(日) 18:40:13
Visual Studio 2008を使っていて、ソリューションのビルドをしようとすると 'LPDIRECT3DDEVICE9' : 不明なオーバーライド指定子です というエラーが出てしまいます。 DirectX SDKもPlatform SDKも落として、ネットで検索したりしながら 実行ファイルもインクルードファイルもライブラリファイルも設定し、 追加の依存ファイルもちゃんと設定しました。 今書いているのは本のサンプルを手打ちで移したもので、 打ち間違いを考慮して該当部分をコピーしたりしたのですが状況が変わりません。 このエラーはどうして出るのでしょうか?
>>191 エスパーすると
LPDIRECT3DDEVICE9の行より前に何か問題がある
拡張子が.cになってたり
1行前に;を忘れてたり
どっかが全角になってたり
たぶんDirectX以前の問題だ
>>191 そんなの原因考えるの面倒臭ぇからまず動くSDKのプロジェクトを拝借して
それをベースに構築して改めて動くもんと動かないもんを比べてみたらどうよ?
>>191 ところで本のサンプル(CDついてる?)はコンパイルして実行できるの?
昔はc言語の練習本を一つ一つタイプしてはミスタイプで長い事悩んでたな…
196 :
191 :2010/11/14(日) 22:16:51
>>192 ありがとうございます。直前の宣言で ; が抜けてましたorz
で、オーバーライド指定子は無くなりましたが、
LPDIRECT3DDEVICE9 で宣言した変数が「定義されていない識別子です」というエラーで引っかかりました。
>>194 納得いかないくらいすんなりと実行できました。(リンカの設定とか適当なのに)
・・・もっかい打ち直してみる事にします。
>>196 ソース何べん打ち直しても設定腐ってたらダメじゃん
とりあえずベースはサンプルソースの奴使えよ
サンプルのソースこそ独自ライブラリ使いまくりで腐ってるわwww
違うだろ ベースってのはライブラリじゃなくて プロジェクトの設定とかそういうのだよ 話わからないくせに横から口出して自爆してんじゃねーよキチガイ
「ベース」という単語だけでそんなの察せるとかどんだけエスパーだよ
おっと触ってはいけない生物だった
>>200 だから流れわからなきゃ口出さなきゃいーのに
誰も頼んでないのに間違えて恥かしい奴だなお前はw
すぐに煽って雰囲気悪くするやつ何なの? よっぽどリアルがさみしいの?の?
今からDirectXを本格的に勉強しようと思うのですが、DirectX9とDitrectX11どっちで勉強すればいいのでしょうか? あるいは、DirectX9をやっておけば11にスムースに移行できますか?
なるほど・・・今からやるならDirectX11なんですね ありがとうございます
>>207 シェーダがきつそうだったら9で固定機能で遊んでみるのも
道のひとつかもしれない
それもきつそうだったらDXライブラリとかででも多少慣れるのも
道のひとつかもしれない
でも遠回りな道かもしれないぞ 遠回りのなだらかな道と、急勾配の近道だったら、俺なら・・・・・・遠回りでいいや (´∀`)
な〜に、急勾配の道でだって一休みできるものさ
後から来たのに追い越され泣くのが嫌ならさあ歩け
買った本がDirectX9にしか対応してなかったでござる・・・ ようやくポリゴンが表示できて喜んでいたのだが、これが無駄になるのか・・・ 「DirectX11 3Dプログラミング」ってのでも買うか・・・
>>208 DXライブラリではもうローポリ3Dゲームを完成させているので、DirectXを直で触ろうと思って聞きました
……DirextX11の資料がなさすぎて心が折れそうです
WindowsXpが半分以上を占めている。 だから あなたがプログラムを作って、友達が使ってくれますか? DirectX9を使えばほとんどの人が可能です。 DirectX11の場合はほとんどの人が使えない。 将来がどのようになるかわからないけど、 あまり変化がないとおもうよ
>>214 XPが半分以上って、それ企業で使うPCとか含めてるだろ。
そうじゃなくてもPC保有者の大半はゲーマーじゃねぇ。
ゲーマーじゃない奴をゲーム市場に引き込むってんなら大したもんだが、
もともと相手にしてるのはごく一部に過ぎない。
しっ構っちゃいけません
>>212 まぁ無駄ではないよ
3Dやポリゴンの表示とか基本的な考え方は一緒だ
そこさえわかってればプログラムを書き直すなんて楽だろ
COMインターフェースポインタってダウンキャストできるんですか?
何のためにクエリーをかけると思っているんだ?
>>215 同人ゲーム作ってるけど、購買層の大半がXP。いまだに2000なんて使ってるやつもいる
Vistaや7を買ってPCゲームやっちゃってるぜ!っていう層を狙うなら11でもいいが、それってプロだろう
プロならDirectX11でいい
素人で、ちょっとゲームつくってフリーで公開したり、同人で売ったりと考えてるなら9以外の選択肢は今のところ無い
完成予定日が明確ならバージョンも調整しやすいね。 個人で初めてゲーム作るってのなら出来るだけ未来を見据えたほうがいいと思う。 バージョンの違いをサクッと吸収できる実装を作れるなら自由にすればいいと思うけど。
222 :
デフォルトの名無しさん :2010/11/17(水) 20:14:55
DirectX10, 11は空振り。 で、評判が悪いのでMSもDirectX12では9の仕様に戻すんじゃないの?
ゲームユーザーから見ても、DirectX11で導入されたテッセレーションもいまいち効果分からんしな。
DirectX9の3Dプログラミングについてですが、
かなり初歩的な事からの考え方の解説をしているサイトや参考書はありませんか?
>>2 の解説ですら4x4の行列の所で詰まりました、どこでこれを使っているのかすら・・、2Dは画像の表示、貼り付け、移動処理など出来ますが・・
DirectXが用意してくれている関数に頼りすぎていて、3Dモデルを表示はできたのですが、全く仕組みが分かりません
(必要な関数をつなぎ合わせた感じです)
DirectX12は未だ影も形も見えて来ないので、
DirectX9時代の次は恐らくDirectX11時代が長く続く
DirectXは奇数世代の寿命が長い
>>224 MSDN
>>224 msdnもいいが、
大型書店でもいって立ち読みをして、
自分と相性のよさそうな本を探したほうがいいかも
もしC++があやしいくらいに初心者ならそっちを片付けるべきだ
同次座標系という概念を含めることでテクスチャが歪まず張られる、 というのをちらほら聞くのですが、これはどういう仕組みですか?
まずはどこでそんな情報をちらほら聞いたのかを明確にしろ
テクスチャが歪まず貼られるといったらパースペクティブコレクトだな DirectXでフラグをONにするときに名前は見るけど原理は俺もまったく知らんがな
それ昔やってみたことある テクスチャ座標を4要素で扱うんだ DirectX的なu,v,wの次って何使うのか知らんからGLにならってs,t,r,qでいうと テクスチャ座標を補間するときにs,t,r,qをそれぞれ線形に補間してs,t,rをqで割る s'=s/q. t'=t/q. r'=r/q. 各頂点のqを上手く設定しておくとs',t',r'がいい感じになって正しいパースで貼れる
>>230 >テクスチャ座標を4要素で扱うんだ
ここからすでにわかんね
テクスチャ座標はuは横でvが縦ってところが俺の限界だ
ヒント: 3次元テクスチャの座標は3次元 x, y, z, w の w
久しぶりにプログラミングをしようと思ったら d3dx9d_43.dllが見つからなかったため、このアプリケーションを開始できませんでした。 アプリケーションをインストールし直すとこの問題は解決される場合があります。 というエラーが出ます ビルドはできてるのですが、デバッグで開始をしようとするとエラーが出ます。どうしたら良いでしょうか?
クリーンしたらできました ほんとうにありがとうごいました
SDKをインストールしたりして最新版のをアンインストールしたからだと思うのですが xファイルの関連付けか無くなってたので、関連付けようしようとしてDxViewerを使おうとすると MSVCR90.dllが見つからなかったため,このアプリケーションを開始できませんでした と出ます DxViewerのソリューションをクリーンしてビルドしてもさっきみたいに治りません。 どうすれば良いでしょうか?
VisualC++2008ランタイムをインストールする
/MTでビルドする
>>238 ありがとうございます
それをするとLIBCMT.libと競合して未解決のエラー等がたくさん出ます
というかそもそもビルドせずとも使えてたEXEなのですがどうなってしまったのでしょうか
新しくビルドした方のexeにちゃんと関連付けされてないんじゃないの?
>>240 いえ、リリースでビルドしてリリースフォルダからDxViewer.exeを起動しても
「MSVCR90.dllが見つからなかったため,このアプリケーションを開始できませんでした」
とエラーが出ます
とりあえず開発環境を再インストールしなよ どっか別のPCのインストールフォルダをそのままコピって使ってるとかじゃないの?
243 :
227 :2010/11/18(木) 13:23:49
とりあえず新しく教えていただいた用語でぐぐったところ、 少し理解が深まりました ありがとうございます
XAudio2で同時に複数の音源を再生する、というのが上手くいかないです。 なんどか試しましたが、ノイズだらけの爆音になってしまいます。 XAudioエンジン:マスタリングボイス:ソースボイスを1:1:1で複数個用意して同時に再生した場合は 普通にできるのですが、これだと正規の方法ではない気がします。 XAudio2のサンプルコードは一通り理解はしましたが、このような複数音源の例が無いため どうすればいいのか分かりません。 ご教示ください。
頂点数6000で 三角+四角面が1800なら 1800ポリゴンのローポリですよね?
DirectXに四角面は無いです
まーたはじまった
ゲームについてなんですが、セガサターンエミュのSSFが起動前に落ちてしまいます。 インストールしたストリートファイター4も同様です。 どちらも数日前までは動きました。 DirectXが原因かと思いこちらに書き込みさせて頂きましたが、どなたかアドバイス頂けないでしょうか? Windows 7 Home Premium 64-bit Intel Core i7 860 @ 2.80GHz 4.0 GB デュアル-Channel DDR3 @ 668 MHz MSI P55-SD50 (MS-7586) (CPU1) 1024 MBGeForce GTS 250 (Undefined)
>>248 何かこう板の名前を見ずに質問する輩が多いな
スレチどころか板違いだ
ここはDirectX"プログラミング"質問スレ
250 :
227 :2010/11/19(金) 14:41:21
>>244 普通にマスタリングボイス1、ソースボイス2で出来るはず
めちゃくちゃな音が出るってことは
フォーマットデータとか不正なメモリ書き込みでデータが壊れてるんじゃないか?
251 :
250 :2010/11/19(金) 14:48:50
名前ミスでござる
252 :
248 :2010/11/19(金) 14:58:23
>>249 プログラミングスレだったんですか!
失礼しました。
インデックスちゃんっていらない子なの?
LOD使いたい場合は自分でシェーダー書くしかないですか?
>>250 1個だと普通に鳴るのですが、
全く同じソースボイスの作り方で2個同時だと鳴らないのです。
>>256 言語は何だろ?
.NETでGC働いてリリースされてるとかないよね。
>>256 2つの入力のサンプルレートが違うんじゃない?
259 :
デフォルトの名無しさん :2010/11/19(金) 23:03:03
DirectXSDKってkinnectに対応していますか?
>>259 してないんじゃない。
KinectはKinect SDKが別で出るでしょ。多分。
>>259 kinnectはXBOXが主だから、XNAが先でしょ
現在DirectX11を勉強しようと思っています。 DirectX11関連本を探したところ、「ちょっとだけDirectX11」「DirectX11 3Dプログラミング」の2つくらいしか出てないみたいなのですが、 これらの本の評価はどんな感じなんでしょうか?
>>963 洋書が読めないのなら、DirectX9にしとけ
>>263 後者持ってるけど、全くのゼロからだと厳しいかもしれない。
もしDX9を勉強してないならそちらからやった方がいいかもしれない。
とりあえずネット上で解説しているサイトを見ていけそうだったらそのまま11で行って 無理そうだったら9へいけば 9より解説しているサイトは少ないがそれでもなんこか11の解説サイトあったから(携帯なのでアドレスまでは面倒なので載せないが)
>>267 D3DXMatrixPerspectiveFovLHの第4引数で、カメラの写る範囲を指定できるんだよ
>>268 ありがとうございました
自己解決です
こんにちは。 業務アプリでちょっとした3Dデータを描画することになりました。 (ちょっとしたと言いましたがDirect3Dは初めてなので大変ですが) Direct3D10のサンプルを見ながらなんとか3Dデータは描画することは できました。さらにラインストリップで全体を四角で囲みたいのですが、 そのときに奥の角も3Dデータに隠れないようにとのことで、処理としては Zを無視して描画ができるようなことは分かったのですが、実際にZを 無視して描画するためにどのような設定をすればよろしいのでしょうか。
3Dモデルを中心にカメラを移動させたいのですが、 右周りさせた場合カメラの位置をx、y、zにどのような値を加算すれば 360度(一周)した時に元の位置に戻ってくることが出来るのでしょうか
>>273 最初X方向にカメラがあるとして、(10.f,0,0)yは適当で
上から見て半時計回りに回転する角度をθだとすると、
x = 10.f * sinθ
z = 10.f * cosθ
で、時計回り(右回り)だと逆なので-θだとすると、
x = 10.f * sin(-θ) = 10.f * -sinθ
z = 10.f * cos(-θ) = 10.f * cosθ
θを適当に増やすと回転する
三角関数が分からなければ
ttp://www.nicovideo.jp/watch/sm12492903 が面白かった
>>275 271ではないですけど、
シェーダー内からの設定はどうすればいいんですか?
カメラを回したいときは どうせ横だけじゃなくて縦にも回そうとしたときに詰むんだから カメラの初期姿勢を行列で拡縮・回転・移動すれば楽だと思うの 視点を変えたい場合でも初期姿勢を入れ替えるだけでイイしね
>>276 パス内に記載する。
例えばこんな感じ。
pass Pass1
{
VertexShader = compile vs_1_1 vertexshader();
PixelShader = compile ps_2_0 pixelshader();
ZEnable= True;
AlphaBlendEnable = True;
CullMode = CCW;
}
>>278 ありがとうございます
こういう書き方できたんですね!
>>273 ローカル座標とワールド座標を理解して
ローカル座標Aにあるものをローカル座標Bに、
ワールド座標Bにあるものをローカル座標Aに自由に移動できるようになれ
そうすれば
ワールド座標−3Dモデル座標−ゲタ(横用)座標A−ゲタ(縦用)座標B−カメラ座標
としてゲタをまわしても楽だぞ
>>275 >>278 271です。
シェーダー側でもできるんですね。
ありがとうございます。大変参考になりました。
あるモデルを、指定した座標(pointdata.pos)に向ける処理でつまづいています。 なにが問題なのか、原因がわかる方はお教えください m(_ _)m // 現在の方向ベクトル(Z軸の向き)を算出 now_vec.x = m_pModel->GetMatrixWorld()._31; now_vec.y = m_pModel->GetMatrixWorld()._32; now_vec.z = m_pModel->GetMatrixWorld()._33; D3DXVec3Normalize(&now_vec,&now_vec); // 注視点への方向ベクトルを算出 eye_vec.x = pointdata.posx - m_pModel->GetMatrixWorld()._41; eye_vec.y = pointdata.posy - m_pModel->GetMatrixWorld()._42; eye_vec.z = pointdata.posz - m_pModel->GetMatrixWorld()._43; D3DXVec3Normalize(&eye_vec,&eye_vec); // それぞれのクォータニオンを作成 now_q = D3DXQUATERNION(now_vec.x,now_vec.y,now_vec.z,0.0f); eye_q = D3DXQUATERNION(eye_vec.x,eye_vec.y,eye_vec.z,0.0f); // 2つのベクトルから角度を求める angle = acos(D3DXVec3Dot(&now_vec,&eye_vec)); // クォータニオンの変化量を求める q_vel = angle_vel / D3DXToDegree(angle); if(q_vel > 1.0f) q_vel = 1.0f; // 次フレームの角度を決めるクォータニオンを求める(スラープ補間 D3DXQuaternionSlerp(&ans_q, &now_q, &eye_q, q_vel); // !↑この時点のクォータニオン(ans_q)を描画に使用してもうまくいかない。
285 :
284 :2010/11/22(月) 11:14:52
// !↓以下は、Draw()関数を書き換えずに、角度だけを求めてモデルに渡すための追記述
// クォータニオンから回転行列を求める
D3DXMatrixRotationQuaternion(&rot_mat,&ans_q);
// 回転行列からオイラー角を求める(
http://marupeke296.com/DXG_No20_TurnUsingQuaternion.html参照 )
sx = rot_mat._32 * -1;
ans_angle.x = asin(sx);
cx = cos(ans_angle.x);
sy = rot_mat._31 / cx;
cy = rot_mat._33 / cx;
ans_angle.y = atan2(sy, cy);
sz = rot_mat._12 / cx;
cz = rot_mat._22 / cx;
ans_angle.z = atan2(sz, cz);
// 求めた角度を設定
m_AngleVel = D3DXToDegree(ans_angle);
m_pModel->ShiftAngle(D3DXToRadian(m_AngleVel));
286 :
デフォルトの名無しさん :2010/11/22(月) 11:23:59
ゲームパッド入力はどのAPIを使うべきでしょうか? DirectInputはサポートしなくなったしXInputは専用ゲームパッドしか動かないみたいだし
XInputってキーボード・マウスは動かないのか これからどうやっていけばいいんだろ?
特殊な入力方法を使わないならWin32APIで十分
あるモデルAの行列 a_mat が、あるモデルBの行列 b_mat にたいして、 左にあるか(a_mat._41 < 0)、右にあるか(a_mat._41 >= 0)、の判定は、 どのようにしておこなえますか?
DirectInputってもう使えないの?それとも使えるけど、バグがあっても修正しないよってだけ?
291 :
289 :2010/11/22(月) 12:18:53
質問内容が微妙でしたので、書き換えます。 あるモデルAの行列を原点としたときの、ある行列Bの位置づけは、どのようにしたら取得できますか? 行列Aと行列Bは等しいワールドに置かれているものとします。
行列の位置という言葉の意味がよくわからんが vをゼロベクトルとして v*B - v*A とか?
293 :
292 :2010/11/22(月) 12:29:43
分かると思うけどvは全部ゼロじゃなくて(0,0,0,1)ね
>>290 DirectInputとかDirectSoundってDirectx8でしょ?
今売ってるGPUとかはDirectx8〜11ってのが多いから、これがDirectx9〜ってなったらGPUとかOSでも認識しなくなるんじゃない?
>>284 angle_velとか意味不明な変数が出て来てるからよくわからんが
D3DXQuaternionSlerpの使い方が良くない気がする
これはnow_q→eye_qを0→1.0で変化させるものなので
毎フレーム動かすのはq_velだけでnow_qとeye_qは移動し始めのものを使わないと固定量移動にはならない
この方法毎フレーム計算するなら
now_vecとeye_vecの法線を外積で求めてそいつを回転軸にして
D3DXQuaternionRotationAxisでnow_vecを固定角度回転させたほうがいい気がする
directX9で作ってるんですがdirect MusicよりXAudio2を使った方がいいんですか?
マップのポリゴン数で10万ポリゴンくらいは普通です。 影響するのがメモリサイズであって、ティクスチャに大きく影響されるでしょう。 .jpgを使うと極端に遅くなるかもしれない。 そのまま使う事はほとんど無く、 ゲームエンジンに合わせて最適化するだろうし、構造を変えるかもしれない。 また、ターゲットPCを基準にして大きすぎるか小さいかの判断がされる。 ティクスチャ無しで読み込んで どの程度なのか確認するのもひとつの方法。
>>298 DirectSound使ってますぅ
動かないPCは死ねですぅ
302 :
298 :2010/11/23(火) 11:08:41
XAudio2ってMIDI再生できないのか 使う意味なかった
ポリゴンのファイル形式が何であって ゲームエンジンの要求するファイル形式があるはず 相性があるから、調べてみ ティクスチャにjpgを使わない。DDSかTGA 2分くらいなら遅くないと思いますが、メモリ消費の方が心配。
既存のコードはともかく、今更新規でDirectMusicはないな
>>304 ありがとうございます
ポリゴンのファイル形式はxファイルでゲームエンジンはbulletで、要求する形式はわかりませんが普通に他のはxファイルでやってます
2分で遅くないのですか…つまりどのみちファイルを読み込む処理は絶対に必要だからファイルのサイズに比例する。早くしたいならポリゴンを減らすしかないみたいな感じですか?
>>303 の処理は読み込んだ後動かしてる時のメモリを減らす処理ということですね
それと、メモリはタスクマネージャーで見ると、お城があるときは152308Kで、コメントアウトすると67000kでした
>>306 2分が遅くないってことはないでしょう・・・少なくともゲームだと遅いと思いますよ。
あなたのPCスペックがわからないので、一概には早い遅いと言えないですが。
また、巨大なマップでもドカっと読み込むのではなく、エリアごとに分割しておいて最初に必要な
場所だけロードし、他の処理中に読み込むとかいう方法もあります。
物体が小さいのに、ポリゴン数が多いモデルデータはそもそもゲーム向けではない気もしますし。
もしX-Fileがテキスト形式だったらぶっ殺しものだが、まさかそんなことはないよな。
>>306 うーん、それじゃあね
そのXファイル3DデータをアップローダーででもUPしてくれれば、調べる。
これ以上は具体的に最適化を考えないと 答えにならない。
読み込みが遅くとも、最初の1回だけだから大きい問題ではない。
エンジンが別スレッドで裏読みしてるのを完了復帰で待っているオチとか
バ イナリにする方法がわかりません教えてください
ホントにロードだけで時間食ってるのかが怪しいところでもあるよね。
とりあえず
>>310
Xファイルがあまり速くない、バイナリにしても変化無いよ 大きいマップなんかは5分くらい待たせるから、2分だと速い方
DirectXビュワで20秒で開けるよ Core2Duo3GHz GeForce9600
コード書くの面倒だから俺もDirectXViewerで開いた。 15秒で開けた@C2D Q9550/RAM4GB/9800GT
そういえば自分もDxビューワだと15秒ぐらいで開けます でもプログラム中で開いたら、普段は5秒ぐらいで窓が開くのに お城があると2分はかかります。もしかしてそっちのミスでしょうか
バイナリと言っていたのにテキストじゃないか。 遅いのは当たり前、死ねよ。
むしろ何でxファイルに変換したのか知りたい
ビューワもDirectXプログラムだから内部でオブジェクトを置いてカメラをセットして・・・ってやってる 同じような時間で開けないなら何かしら理由があるはず
もうとりあえずソース晒しちゃえよ
>>319 すいません。バイナリとは言ってません。はい(その通り、テキスト形式でした)。バイナリでやってみます。というニュアンスでした。
>>320 他に何か良いのがあったら教えてください。
それから虎のに入れたら3分ぐらい掛かりました
今、一生懸命バイナリツールを組みた立てますが、クリエイトデバイスとかで未解決のエラーが一杯出て全然できません。誰か下さい。
プログラムに問題がありそうなのにバイナリにしようとするのは筋違い。 仕事増やすだけで根本的な解決をしようとしてない。
虎のってなんだ。エスパーしてtiger.xか。 それで3分とか異常だろ、バイナリ/テキストどうのこうの言うレベルじゃない。 あとやる気が感じられない。面倒くさいだの誰か下さいだの。死ねよ
使用しているエクスポータでバイナリを吐けばいいだけの話。 何で変換が必要なのか意味不明。
>>321 >>324 ありがとうございます。エスパーしてください。どうしてでしょうか。
>>325 そうです。チュートリアル6のタイガーにそのまま入れたところ2分ぐらい掛かりました。
それから今必死にバイナリのプロジェクトを作ってるのです。しかしプログラム経験自体浅いのでなかなかできないのです。
サンプルのエンプティープロジェクトに組み込もうと思ったのですが
ImeUi.obj : error LNK2019: 未解決の外部シンボル _ImmSetConversionStatus@12 が関数 "long __cdecl ImeUi_ProcessMessage(s
こんなエラーが20個ぐらい出てます。プロパティで追加の依存ファイルの設定と、ユニコード文字の設定としたのですが他に何かしないといけませんでしたっけ?
>>326 バイナリで出力する設定がありません。
D3DXのヘルパーでロードしてくるのがクソ遅いのは判ったけど・・・ さすがにコレは繋がった1つのマップとしてはポリゴン数多すぎ(118019ポリ)。 そもそもゲーム考慮してつくってないんだろうしこのモデル。 XSIで開いてみたけど開くのもクソ時間かかった。 早くしたければ 1:どうしてもこのMAP使いたければ自分でポリゴン削るか適当に分割する。 2:独自形式つくって変換して自分でローダー作って速度比べる 3:諦めろ ところでなんでこのオブジェクト、デフォ姿勢が垂直に突き刺さってんの?
この3Dデータ、壊れてる感じがする。 変換するときに狂ったのかな 何を使ってデータ変換したの? 変なXファイルだ、動くから間違いではない。 独自形式ならば一瞬で読み込める。
デバッグビルドで動かしてるとかw リンクするLIBがリリース版なのと、自分のプロジェクトの設定がデバッグ情報無しになってるよね?
>>329 わかりました。ありがとうございます。デフォ姿勢は適当に出力したからです
>>330 壊れてるかはわかりませんが、ちょっと変なところに飛んでるのはただの消し忘れです。
モデリングツールはBlenderです
>>331 すいません。理解できません。具体的にどうすれば良いのでしょうか?
二度と来なくていいぞクズ
>>333 それが協力しようとしてくれた人に対する態度か。
お前もド素人だろ(笑)
BlenderのXファイルは腐ってるさ
挨拶すらできない奴は登校拒否の中学生と相場が決まっている。相手にするな
PC質問版ってやたら
>>337 みたいな奴いるよな
全角がダメだの、挨拶がどうだの
ITドカタは先輩に土下座して情報教えてもらうのかもしれんが、今時PCなんて趣味レベルなのに俺らの常識がPC界の常識(キッ
みたいにイキりたっててうざい。肩のPawer抜けよ
(キッ ってなに?w Pawer?wwwww 釣り針でけぇから食いついちゃうけど、 お前みたいなやつの、教えてもらって当然みたいな考えがウザイんだよ。
340 :
331 :2010/11/23(火) 18:37:09
まあ、自分のDXViewerで早く開けてるのに、 同じような自前プログラムで、開けるけど遅いって言えば、 デバッグ実行してるから?って思っただけなんだけど… これは玄人だから素人だからは関係ない どっちかって言うとエスパー力かな、と思うw 因みにエスパー伊藤と江頭2:50が好きな芸人 お前ら肩の力を抜け、333が本人とも限らないだろう、 30分ほど前の一つ前のレスでデバッグビルドを理解出来ないと言ってるし まあ、それだと解決してないことにもなるけどw
真ん中に明らかに必要ない情報があるな
いや 333 が本人のわけないだろ…
そんなもんです ニアクリップの2倍近辺で0.5
>>344 あまりの衝撃に開いた口がふさがりません
>>344 ありがとうございました
口が開いたままでお礼を忘れてました
http://msdn.microsoft.com/ja-jp/library/cc324546.aspx >近くの平面の距離に対する遠くの平面の距離の比率を 100% とした場合、
>深度バッファ範囲の 90% がシーンの深度範囲の最初の 10% に費やされる。
>娯楽や風景のシミュレーション用の典型的なアプリケーションでは、比率 (遠くの平面 / 近くの平面) がどこでも 1000 から 10000 の間である必要がある。
>比率が 1000 の場合、深度バッファ範囲の 98% が深度範囲の最初の 2% に費やされ、比率が高くなるにつれて分布状態が悪くなる。
なんだ、またあいつが出没したのか。
モーションデータっていうのは、 全部自分の手で座標などを打って実現するものなのでしょうか? 関数一つで便利に扱えたりするものではないのでしょうか?
普通はモデリングツールでやる。
>>349 モデリングツールでモーション作って、出力したファイルから必要なデータを読み込んで計算する。
言ってるモーションっていうのは恐らくスキンメッシュアニメーションのことだと思うけど、
その場合はボーンデータ(頂点を動かすための行列)を使って、その行列の動きが適応される
部分の頂点を変換(拡大・回転・移動)する。
って書いたとこでそれDirectX関係ないよねってことに気づいた
別にいいんでね
353 :
デフォルトの名無しさん :2010/11/24(水) 12:47:01
ツールで作ったボーン・スキンのウェイトってそのままXで反映される?
それDirectX関係ないよね
反映されるかどうかはエクスポータがどうなっているか次第 そもそも何を使っているかも書かずに情報が得られると思っているんだろうか?
blender
どのツールかというより Xファイルにウェイトの情報はあるのかとか
いつもの荒しか?
blenderなんてスクリプトかんたんに組めるんだし自前のエクスポーター作っちゃえYO!
Xファイルはもう推奨されてないしなぁ。。。
じゃあ何が推奨されてるんですか?
最終的にはビデオメモリに直接転送して使えるバイナリデータが最強だと思う
ファイルって全部.exeの中に入れてしまいたいんだけど どうやればいいの?
ウン百MもあるようなEXEファイルを実行したくはないけどな… リソースとして取り込むか ファイルなんて基本ただのバイナリ列なんだから ファイルをヘッダーにコンバートするツールでも作ってincludeしとけばいいんじゃね?
どうやって?
とりあえずXファイル使いたいなら メタセコに5000円払うとプラグインにkeynoteってのがあってそれが使える 複数アニメーションも対応してるしとりあえず不満はない感じ メタセコ+rokdeboneって組み合わせもいい こっちはタダ
DirectXってXファイル以外の形式になにか対応してたっけ?
>>367 用意された関数でロードって意味ではXファイルだけ
自分でロードしたらなんでもいけるんちゃう?
3Dツールを自前で作る猛者はおらんのか、最近のジャップは。
市販のモデリングソフトに自前のエクスポータという組み合わせが一番効率がいい。
しかしそこまでしてExeに含める意味はあるのかと まぁ、ある種の隠蔽にはなるかもしれんが
exe が極端にでかいと、セキュリティソフトのチェックが長引いて起動に時間がかかることがある UAC が絡むとやばいことになる しかも XP で開発してると気づかないからめんどい
カメラが向いている方向にキャラクターを移動させたいのですが、 どういった計算式になるのでしょうか? 例えば、カメラがキャラクタのどの方向を移していてもカメラから見て上下左右自由に動けるような感じです
>>375 カメラの視線ベクトルをいい感じに加工してキャラに足してみればよくね?
>>376 カメラを考えない移動させたい方向(キーの入力方向)
例えば方向キーの入力値が
analog.x(-1.0〜1.0)
analog.y(-1.0〜1.0)で
XZ平面状を動くとしたら
進行方向を
D3DXVECTOR3 dir(analog.x,0,analog.y) ;
みたいにして
コイツにビュー行列の逆行列を掛ける
D3DXMATRIXA16 matInvView;
D3DXMatrixInverse ( &matInvView, NULL, &matView ) ;
D3DXVec3TransformNormal ( &dir, &dir, &matInvView ) ;// ベクトルなのでTransformNormalなことに注意
このときのdirがカメラから見た奥方向になる
ただしカメラが見下ろしてたりするとy方向にも移動しちゃうので
xz平面上で移動させたい場合は
dir.y = 0 ;
D3DXVec3Normalize ( &dir, &dir ) ;
みたいにしいてy方向の移動量を殺す必要がある
後はdirに適当なスピードを掛けて、現在座標に足せばOK
すみません、3Dを始めたばかりで関数で何をしているのかがいまいち分かりません 面倒でなければ少し確認させてください analog.x(-1.0〜1.0) xへの移動量 analog.z(-1.0〜1.0) zへの移動量 D3DXVECTOR3 dir(analog.x,0,analog.z); xとzへの力の強さ この3つの関数と引数を調べてみましたが、どういった事をしているのでしょうか・・ D3DXMatrixInverse ( &matInvView, NULL, &matView ) ; D3DXVec3TransformNormal ( &dir, &dir, &matInvView ) ; D3DXVec3Normalize ( &dir, &dir ) ;
単位ベクトルも知らんレベルとなると まず、なんか入門書がほしいところだけどなんかいいのないの?>他の人
とりあえず行列とベクトルについてググってみるといいと思う
やっぱdirectXって高校の数VCやってない人には難しいっぽいね
高校のとき数I・Aしかやんなかったけど、普通にDirectX使ってゲーム作ってますん。 ぶっちゃけ言うほど詳しくしらなくても、行列の役割とかベクトルの役割知ってればDirectX は使えるけど、ただ知ってたほうがいいのよって感じ。 趣味グラマーなら役割しってて使えるだけでいいと思うけど
申し訳ないです、つまりこの3行で
analog.x(-1.0〜1.0)
analog.y(-1.0〜1.0)で
D3DXVECTOR3 dir(analog.x,0,analog.y) ;
http://loda.jp/vip2ch/?id=797 これが出来たということなのでしょうか・・
今回、 スティックの向きというのはビュー空間上に存在する向き、 と考えられる。 ワールド空間からビュー空間へはビュー行列を掛け算だから ビュー空間からワールド空間へはビュー行列の逆行列を掛け算だ ビュー空間上でのスティックの向き * ビュー行列の逆 →ワールド空間上でのスティックの向き
よく考えたらXZ平面で移動させるには >dir.y = 0 ; >D3DXVec3Normalize ( &dir, &dir ) ; じゃダメだなぁ XYZ移動ならそのままでいいんだが 純粋に計算済みビュー行列からXZ移動距離を算出するには一工夫いりそうだ 視線のY方向を0にしたベクトルから計算すればいけるけどなんか2度手間だし良い方法ないかな
よく分からんけどクオータニアン関係の関数使えばいいんじゃないの? DirectXは基本的に始点と終点の位置・姿勢さえ分かれば中間の計算をしてくれる関数が用意されてるよね
>>385 カメラの位置と視線の先情報はLookAt関数作るのにいるんだからあるだろ
そのベクトルをY情報消して単位ベクトル求めて使うだけやんけ
何1人でぶつぶつ言って混乱しとるんじゃ
んなことはわかっとるわボケ 固定位置カメラなら何も問題ないけど 実用で考えたらカメラは常に移動回転してるものとして考えないといけない だとすると回転移動後のカメラ位置から またわざわざ視線を抜いてきてY抜いて再計算するなんて無駄以外のなにものでもないだろ? まぁ、ビュー逆行列のY軸が天井方向になるように回転させて解決したけどな
そもそも行列で管理しようとするのが間違いなんだよ。 ベクトルと位置を分離したパラメータでもって、 必要なときにカメラ用の行列を作るなり進行方向に利用するなりすればいい。 なんでわざわざ混ぜたモノを使おうとするのか意味不明。
全て透明のテクスチャを貼ったのですが真っ白になってしまいます D3DXCreatePolygonで作った板ポリゴンに貼ったら透明になったのでテクスチャは合ってると思うのですが マテリアルの問題でしょうか?どうすれば良いのでしょうか?
>>390 デバイス->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
すいません できました ごめんなさい
当方DirectX初心者です 全画面でDirectXを使っているアプリケーション(WindowsMediaPlayerや3Dゲーム)に文字や図形を重ね描きしたいのですが、 参考になるサイトを教えてもらえませんでしょうか? イメージとしてはニコ動のコメントの様な感じです (アレがDirectX使っているわけではなさそうですが)
初心者にどうこう出来るレベルの話じゃない 君がやりたいことを簡単に実現する方法はDirectX自体にはないよ どうしてもやりたいなら DirectX フック でぐぐれ
ggってきましたが 敷居が高すぎてちょっと先行き不透明すぎでした とりあえず読んでます ありがとうございました。
どうしたらって言われても 現在のモデルのポリゴンの具合も輪郭の描画方法も分からないのに何を言えと ぱっと見た感じ言えるのは輪郭の検出アルゴリズムがあまり良く無さそうなのと 輪郭の描画にフィルターが掛かってないからジャギジャギしてるくらいか
この情報小出しな感じは、いつものトゥーン君じゃないのか?
>>398 ありがとうございます
モデルは全く同じです。具合とか輪郭の描画方法とかはよくわかりません
とにかく、どうしたら良いのか全くわからなかったので質問させて頂きました
「シェーダーを自分で考えて書く」ような話になると全く無理です
とにかくトゥーンシェーダにしたらそれっぽくなると思っていたので、そういうトゥーンシェーダとか、エッジフィルターとか
どういう技術によって左のようになるのか教えてもらおうと思いました。どうすれば良いのですか?何のフィルターをかけるのですか?
>>399 はい
エッジフィルターは俺の知ってる範囲では3種類くらいあって ・深度 ・法線 ・ID 深度や法線で精度を上げすぎると不必要な線が大量にできるからIDをうまく使うんだ IDってのは頂点カラーと同じようにメッシュに持たせればいい あとはマルチレンダーターゲットで深度・法線・ID・通常のレンダリングと出力し 2パス目でピクセルごとに隣接するピクセルの上記情報との差分が一定以上だったらエッジとかやるんだよ まんまコピーじゃなくて少しはサンプルをいじって何がどうなってるか確認すべし
>>388 はぁ?
カメラ座標上の0,0,1ベクトルをワールドに直してやるだけ(その後の加工は省く)の話ちゃうんか?
まったく話が見えない
無駄って何?その計算削ると処理軽くなったりするわけ?
自分でシェーダー書けないんじゃ話にならない
いちいち変換したら処理が増えるだろjk いちいち変換したら誤差も出るだろjk
>>405 カメラ一個でか?
すごいな
どうぞ軽いカメラでも作っててください
(ああ、ほんとうに馬鹿なんだな・・・)
誰と戦ってるの?
ID3DXEffectって使い辛くないですか?
別に
不満だったら SetVertexShaderとか SetPixelShaderとか D3DXCompileShaderFromFileとか使えばいんでね?
シェーダーでのtex2Dとtex2Dprojなんですが、 使い分けがイマイチわかりません。 msdnにはw除算が入るとありますが、 普通にモデルに張る時でもw除算によって遠近補正があるはずなのに、 なぜ二つのサンプル方法があるのでしょう? また違いを探るために、 tex2D→そのままサンプル tex2Dproj→w除算してサンプル と考えたとき、sdkサンプルをいじってtex2Dをtex2Dprojに書き換えて みたんですが、違いが見あたらず困っています。
>>412 wに相当するテクスチャ座標は設定してる?
2次元のテクスチャ座標じゃダメだよ。
それと、そのwは遠近補正のwじゃない。
FBX SDKってメモリから読み込むための関数って用意されてる?
415 :
412 :2010/11/26(金) 11:34:05
>>413 これは遠近補正とはちがうんですか!
テクスチャ座標はBasicHLSLのサンプルの座標を
VS入力、出力、PS入力を4次元にしただけです。
なんのためのwなんでしょうか?
>>415 ある意味遠近補正。
ただ、遠近の方向がカメラとは独立した向き。
417 :
412 :2010/11/26(金) 11:55:49
>>416 なるほど!
ということは
tex2D→自動で遠近補正
tex2Dproj→自分で設定したwで遠近補正
だからシャドウマップとかではライトからレンダリングした時のw
が必要で、そのwで割ることでうまくテクスチャが張られるということですね!
ありがとうございました!
他のPCでは実行できるのですが大学のPCだとCreateDeviceが実行出来ません。 大学のPCはXPでdirectX9が入っていてdxdiagでテストしても問題は見つかりませんと表示されました。 以下のプログラムでエラーを調べると ErrorDescription:Not available ErrorString:D3DERR_NOTAVAILABLE になります。 HRESULT hr = g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hWindow, D3DCREATE_HARDWARE_VERTEXPROCESSING, &g_D3DPP, &g_pD3DDevice); if (FAILED(hr)) { hr = g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, g_hWindow, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &g_D3DPP, &g_pD3DDevice); if (FAILED(hr)) return error("InitDXGraphics CreateDevice",hr); }
頂点シェーダーが使えないPCだから D3DCREATE_HARDWARE_VERTEXPROCESSINGじゃ作れないとかじゃ? REFでトライする前に D3DCREATE_SOFTWARE_VERTEXPROCESSING でもトライしてみるとか
>>419 ありがとうございます。
試してみます。
D3DDEVTYPE_REFのリファレンスラスタライザはSDKのデバッグランタイムが インストールされてないと使えないだろ。 D3DDEVTYPE_HAL+D3DCREATE_HARDWARE_VERTEXPROCESSINGが失敗したら D3DDEVTYPE_HAL+D3DCREATE_SOFTWARE_VERTEXPROCESSINGを試行するのが正解。
だろ。
だろだろ。
だろだっでーにーなーなら うーめらぬーめら
で?
でっていう
今まで触ってきたXファイルは、FrameRootにMeshContainerがついてて、 そのなかにすべてのボーンの情報がはいっていたのですが、 (つまり、1つのXファイルに1つのMeshContainerしかなかった) 今、手元にあるXファイルは、FrameRootにMeshContainerがなく、 その子の子の子Frameあたりが、MeshContainerを持っています。 いくつかの別のフレームも同じように持っているっぽいです。 今まではメッシュデータからLockで取り出した頂点情報に、 そのままワールド変換行列をかけるだけで、あたり判定情報が取り出せたのですが、 この場合、メッシュデータから取り出した頂点情報は、 Frameの行列をかけたりしなければ、うまく取り出せないのでしょうか?
元のデータが気に入らないのなら、自分で好きな形式に直せ。 ただそれだけの話だ。
ごめんなさい、それができないから聞いています・・・ メッシュコンテナが持つ頂点情報は、つねに絶対的な座標(他の行列と計算済みでないか)ということも 知識として知っておきたいです
>>428 >Frameの行列をかけたりしなければ、うまく取り出せないのでしょうか?
しらねーよ
やってみろよ
ダメだったらまたこい
っていうのはいつもの質問者馬鹿にして遊んでるわけじゃなくて
こっちが聞く項目多くなるからなんだよね
ボーンの話が出てるけど、
>>428 がもし、ボーンが入ってるモデルの当たり判定を言ってるなら
その方法でそもそもメッシュまでの階層があろうがなかろうがうまくいくわけないんだよね
それがうまくいってたっていうからまたややこしい
ボーンは関係なくて、単にモデルの中心からの判定やっててこのたび階層構造にして
当たりの位置が階層ついたフレームにのってて位置がアレなんですって話なら
今回のも相談もわかるんだけど・・・
ぶっちゃけ、
ボーンはまったく関係なくて
「普通の階層構造のあるXファイル」と
「フレームがルートだけのXファイル」の話なんじゃねーの?
って思わなくもないんだけどボーンボーンっていうからとりあえず問題の切り分けをやってみてほしいと思ったりして・・・
そんでそれってのはいくつか試せばはっきりわかるわけで・・・って話
MAXの某プラグインで吐き出したXファイルが Meshが複数あるXファイルになった記憶がある でも単に1つのモデルのなかに複数のモデルが入ってるのと同じ状態だから メッシュコンテナの数だけ当たり判定をすれば今までと全く同じ方法でいけるんじゃない?
フレームがボーンになっているのなら、 そもそもスキンウエイトをかけないと当たり判定なんて出来ない。
>>428 まずプログラム云々以前に理解していないと話にならない部分、
フレームとメッシュとボーンとスキンウエイトの関係を説明してみろ。
説明できないほどの素人ならば、 サンプルのXファイルと、プログラムソースコードを UPするのが解決への近道。 データとコードは嘘つかない。
つまんねーことには 相変わらず偉そうだよね
XAudio2ってIUnknownじゃないんだな スマートポインタもうまく使えなくてわけわからん
IXAudio2だけがIUnknownだったかな
ご指摘お願いします。 Zバッファを使用した描画が正常に行えません。 Zバッファありでは表示が隠されるべき場所が、穴だらけになって激しく明滅します。 表示のNearZとFarZを変更しても特に変化がありません。 是非ご指摘をお願いします。 ちなみに、使用しているPCでは他のソフトウェアで3D表示に問題が発生したことはありません。 ※短くするためインターフェース名(g_pD3DDevice)を省略しています。 //デバイス作成(成功) .EnableAutoDepthStencil = true; .AutoDepthStencilFormat = D3DFMT_D16及びD3DFMT_D24S8で同症状 //毎ループ実行 //Zバッファ Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB( 127, 64, 0), 1.0f, 0); BeginScene(); SetRenderState( D3DRS_ZENABLE, D3DZB_TRUE); SetRenderState( D3DRS_ZFUNC, D3DCMP_LESSEQUAL); SetRenderState( D3DRS_ZWRITEENABLE, true); ※ビューポートと視点設定 sample_teapot->DrawSubset(0); //頂点フォーマットの設定 SetFVF(D3DFVF_VERTEX); //ストリームを使わないで直接データを渡して描画する DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,12,vtx,sizeof(D3DVERTEX)); DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,12,vtx2,sizeof(D3DVERTEX)); EndScene();
そこに書いてあるソース部分以外の問題だと思われ
すいません自己完結しました。
>>441 ご指摘のとおり、省略した視点設定に問題があったようです。
サンプルと視点設定を差し替えたら正常化しました。
GetClientRect(g_hWindow,&rect);
//透視変換の設定
D3DXMatrixPerspectiveFovLH(&matProj,D3DXToRadian(45.0f),(float)rect.right/(float)rect.bottom, 0.0f, 100.0f);
D3DXMATRIX CameraRotation;
D3DXVECTOR3 vEnvEyePt = D3DXVECTOR3( 0.0f, -5.0f, 25.0f);
D3DXVec3TransformNormal( &vEnvEyePt, &vEnvEyePt, D3DXMatrixRotationYawPitchRoll( &CameraRotation, timeGetTime()/10000.0f, 0.0f, 0.0f));
D3DXVECTOR3 vLookatPt, vUpVec;
vLookatPt = D3DXVECTOR3( 0.0f, 0.0f, 0.0f);//+vEnvEyePt
vUpVec = D3DXVECTOR3( 0.0f, 1.0f, 0.0f);
D3DXMatrixLookAtLH( &matView, &vEnvEyePt, &vLookatPt, &vUpVec );
g_pD3DDevice->SetTransform( D3DTS_PROJECTION, &matProj );
g_pD3DDevice->SetTransform( D3DTS_VIEW, &matView );
ちなみにどこに問題があったんだろう…。
>>442 >D3DXMatrixPerspectiveFovLH(&matProj,D3DXToRadian(45.0f),(float)rect.right/(float)rect.bottom, 0.0f, 100.0f);
後ろから2番目は0ではダメ。
>>443 あ、ありがとうございます。
確かに、近くが0だと後ろ前がわからずに後方の抜きがおかしくなる?的な事を読んだ気が。
うーん、おかしいなあ…試行錯誤してたときに1とかいれたとおもったのに。
>>444 zの計算の性質上znを0にすると、
ビュー空間でのzがzn〜zfどの値をとっても
出力される値が必ず1になって、
0〜1のzバッファで絶対に最遠方と判断されてしまう
3Dモデルの移動と回転に合わせて、カメラにも同じ動作をさせているのですが 全くカメラが動きません、この3Dモデルの動きとカメラを合わせるには何が足りないのでしょうか 少々省いていますが、このソースだけ見て何が問題あるのか教えてください。 D3DXMatrixRotationX(&mat_Rotation,-0.01f); //3Dモデルのローカル回転 D3DXMatrixRotationX(&mat_View,-0.01f); //カメラの回転 mat_world=mat_Rotation*mat_world; //ローカル座標からワールド座標へ変換 D3DXMatrixTranslation(&mat_work,0,0,0.2f); //3dモデルローカル座標移動 D3DXMatrixTranslation(&mat_View,0,0,0.2f); //カメラの座標移動 mat_world=mat_work*mat_world; //ローカルからワールドに変換 vAt.x=mat_world._41; //カメラの注視点X vAtはベクトルです vAt.y=mat_world._42; //カメラの注視点Y vAt.z=mat_world._43; //カメラの注視点X 後はデバイスにワールド行列とカメラ行列のセット 3Dモデルは完璧に動いています
すみません、書き忘れていましたが3Dモデルとカメラの初期位置は ワールド座標の0,0,0にしています
カメラにもワールド変換するんじゃないか
>>446 省きすぎだと思われる。
ちゃんとビュー行列作って設定してる?
ちなみに、mat_Viewが何してるのかさっぱり分からない。
すみません、mat_View がビュー行列です D3DXMatrixRotationX(&mat_View,-0.01f); //カメラの回転 D3DXMatrixTranslation(&mat_View,0,0,0.2f); //カメラの座標移動 この2行以外はカメラの移動は出来ています。
ビュー行列を回したり移動しちゃだめでしょ vAt.x=mat_world._41; //カメラの注視点X vAtはベクトルです vAt.y=mat_world._42; //カメラの注視点Y vAt.z=mat_world._43; //カメラの注視点X ってことは注視点はモデルで 視点はキャラの後ろとかのTPS視点がやりたいってことでいいんだよね?
とりあえず移動回転してない状態の 視点と注視点を書いてくれ
>>451 はい、常に3Dモデルの後ろにカメラを置きたいのですが、
3Dモデルを回転させるとついていかないのです・・
ビュー行列を作り直さないといけないんじゃ
D3DXMATRIX mat_View; D3DXMatrixIdentity(&mat_View); D3DXVECTOR3 vEye(0,0,0); //カメラの位置 D3DXVECTOR3 vAt(0,0,0); //注視点 D3DXVECTOR3 vUp(0.0f, 1.0f,0.0f); //上向き D3DXMatrixLookAtLH(&mat_View,&vEye,&vAt,&vUp); //↑の5行は、1回のみです device->SetTransform(D3DTS_VIEW,&mat_View ); //この文を毎ループ処理しています
>>455 まず視点と注視点が一緒なのがおかしい
ビュー行列は毎フレーム作り直す
// キャラの後ろならZ軸方向に視点をずらす
D3DXVECTOR3 vEye(0, 0, -5) ;
D3DXVECTOR3 vAt(0, 0, 0) ;
D3DXVECTOR3 vUp(0, 1, 0) ;
//↑ここまでが1回
//以下を毎ループ
D3DXMatrixRotationX(&mat_Rotation,-0.01f); //3Dモデルのローカル回転
D3DXMatrixTranslation(&mat_World,0,0,0.2f); //3dモデルローカル座標移動
mat_World=mat_Rotation*mat_World; //ローカルからワールドに変換
//で、モデルのワールド行列が出来たら
// 注視点をモデルの位置へ
vAt.x=mat_world._41; //カメラの注視点X vAtはベクトルです
vAt.y=mat_world._42; //カメラの注視点Y
vAt.z=mat_world._43; //カメラの注視点X
// ※視点もモデルのワールド行列で回転移動させる※
D3DXVECTOR3 vWorldEye;
D3DXVec3TransformCoord(&vWorldEye, &vEye, &mat_World );
// ビュー行列を作る
D3DXMatrixLookAtLH ( &mat_View, &vWorldEye, &vAt, &vUp ) ;
458 :
デフォルトの名無しさん :2010/12/01(水) 05:12:00
459 :
446 :2010/12/01(水) 06:26:51
質問に答えてくださった方々、ありがとうございました
>>456 >>457 の方のものを参考に作り直すことにします
>>457 さんの、この1行で行列にどのような計算がされているのかが、詳しく知りたいです。
D3DXVec3TransformCoord(&vWorldEye, &vEye, &mat_World );
つまり、 vWorldEye=mat_World*vEye;
3Dモデルに変化があった分が追加されたカメラの位置のベクトル=
更新された3Dモデルのワールド行列*更新前のカメラの位置のベクトル
という認識なのですがこの考え方は合っているのでしょうか。
>>460 ベクトルじゃないよ(ベクトルだと回転だけで位置が変わらない)
ローカル空間での視点座標をワールド行列を使って座標変換している
つまり視点をモデルと同じだけ回転+移動させている
あと掛ける順番が逆
3Dモデルに変化があった分が追加されたカメラの位置「座標」=
ローカル空間のカメラの位置「座標」*更新された3Dモデルのワールド行列
行列は魔法ではありません
エフェクトファイルをいじってるとデバッグでエラーのとき クリエイトエフェクトの行でエラーが出るのですが エフェクトファイルのどの行のどの変数がおかしいか教えてくれません。どんな数字が入ってるかもわかりません どうやって知ればいいですか?
エラーメッセージを受け取って表示しろ
コピペできないのですがこんな感じです File:c\users\パス Line:394 Error Code:E_FAIL(0x0004005) Calling:D3DXCreateEffectFromFile(〜 Do you want to debug the applicatin? はい いいえ こんな感じです
そっちじゃない。 エフェクトを読み出す関数からエラーがとれるだろ。
D3DXCreateEffectFromFileで エラーを吐き出すようにフラグとバッファを設定するか fxc.exeでコンパイルすればエラー表示されるよ
>>466 ありがとうございます
エフェクトを読み出す関数とは何のことでしょうか?
デバッグを始めるとこのエラーが出て、逆アセンブルのタブの行に飛ばされるので読めません
>>467 ありがとうございます
フラグとバッファの設定はどのようにすれば良いのでしょうか?
fxc.exe…ありがとうございます。コマンドプロンプト…できればコンパイラのエラー一覧のところで見れるようにしたいです
何でヘルプを確認しないんだよ?
本当に C++ を触ってるのか エフェクトを編集&確認するただのツール類を触ってるだけにすら見える とりあえず D3DXCreateEffectFromFile をぐぐるだけでも 最後の引数に ppCompilationErrors ってあるだろう
>>468 ID3DXBuffer* pErr = 0;
hr = D3DXCreateEffectFromFile(g_pDevice(),
"fxFiles/略.fx",
NULL,
NULL,
D3DXSHADER_DEBUG,
NULL,
略,
&pErr);
if(pErr){
const char* ErrMsg = (const char*)pErr->GetBufferPointer();
OutputDebugString(ErrMsg);
pErr->Release();
pErr = 0;
}
こんなんでできないか?
>>469 なんで
>>1 を確認しないんだよ?
そういう地味な方法じゃなくて ソースと一緒にコンパイルして結果までアウトプットに出してくれる方法ありませんか? と、こやつは聞いてるんでしょ 「そんなもの無い」と言ってやれ
そんなもの無い
>>472 そういう方法あるけどね。
カスタムビルドを使えばいい。
それが便利なのかは微妙だけど。
D3DXCreateEffectFromFileこれと同じ機能実装するとしたらコンパイラの知識必要だよね
カスタムビルドにしたってエラーの内容までは表示できないでしょ
でるよ 1>エフェクトファイルをコンパイルしています。 1>*:\***********.fx(137,2): error X3000: unrecognized identifier 'afloat1' 1>compilation failed; no code produced
478 :
デフォルトの名無しさん :2010/12/03(金) 06:34:12
DirectSoundのストリーミング再生ってビデオメモリに全部読み込んでから小出しにしてる? それともドライブやメインメモリからちょっとづつバッファに読み込み&捨てつつ再生?
>>478 なんでサウンドをビデオメモリにおくんですか?
?そこにバッファつくってるんじゃないの?
ビデオメモリにデータを置いてもサウンドカードからは読めないが、 馬鹿の考えることは常人には理解できないと言うことだろう。
まずストリーミングを分かってない。 ファイル自体は1度に1ファイル全てを読み込まないと使えないよ。部分的に使うとしても
480がマジでいってるならこえぇええ
nVidia厨には一生理解できないんだろうな
atiのカードはHDMI用のサウンドユニットを持ってる気がするけど、どういう構造なのかはみたことないな。
ビデオチップとサウンドチップは独立していて、HDMIに出力するときに合流させているだけ。
ビデオメモリに置くとメリットあるんですか?
何かGPGPUで高度なサウンドエフェクトでもかけてるんじゃね
そういえばGPGPUでソフトシンセしましたってのが昔あったような
c:\program files\microsoft directx 9.0 sdk (december 2004)\include\d3d9types.h(1385) : warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。 って警告が出まくります。どうすればいいでしょうか。
メモ帳で開いてユニコードで保存しなおす
警告を無効にするかsdkを更新する
http://up3.viploader.net/pic2d/src/viploader2d675290.jpg みなさんこんにちは
頑張ってアンビエントとディフューズが影響するようにと、1テクセルのサイズが間違ってたのを直したら若干綺麗になって影もできました
深度エッジと法線エッジを使っているのですが、画像ではたまたま光が横から来てるので輪郭がわかりますが
いつもは左上の画像(メタセコのレンダラー)のように鼻に線ができないので輪郭がわかりません
線をできやすくすると線が太くなってしまいます
メタセコみたいに上手く尖ってる辺に細い線を引くにはどうすればいいですか?
法線エッジの部分
float4 NormalTableA = { dot( DepthNormal[0].xyz, DepthNormal[4].xyz ), dot( DepthNormal[1].xyz, DepthNormal[4].xyz ), dot( DepthNormal[2].xyz, DepthNormal[4].xyz ), dot( DepthNormal[5].xyz, DepthNormal[4].xyz ) };
float4 NormalTableB = { dot( DepthNormal[8].xyz, DepthNormal[4].xyz ), dot( DepthNormal[7].xyz, DepthNormal[4].xyz ), dot( DepthNormal[6].xyz, DepthNormal[4].xyz ), dot( DepthNormal[3].xyz, DepthNormal[4].xyz ) };
float4 NormalEdgeR = abs( NormalTableA - NormalTableB );
float NormalEdge = max( max( NormalEdgeR.x, NormalEdgeR.y ), max( NormalEdgeR.z, NormalEdgeR.w ) );
if ( NormalEdge > 0.4 ) EdgePower = 0.05;
return Col = TexColor * EdgePower;
>>494 前もそうだけどなんでbmpをjpgに偽装してるの?
深い意味が無いのだとしてもあまり開きたくないんだけど
bmp を jpg って名前にするだけで jpg ファイルになると思ってるんじゃね
>>496 >>498 すいません。拡張子について深い知識がありません。
スクショを取ってペイントで保存してロダに上げただけです
どうしたら綺麗なエッジができるんですか?
そのメタセコのレンダラーってのは、どういう方法でエッジ表示してるの?
>>491 Windowsの地域と言語設定を英語圏の国に変更する
>>500 わかりません。ダウンロードしたら入ってるやつです。トゥーンにするかしないかと線の幅が選べます
ここいいるみなさんなら、画像を見ただけでどういう手法かわかるかなと思ったのですが
パースペクティブ行列は頂点を、 ・ハードウェアによってw除算を行ってもらうためにzをwに移動 ・視野角によるズーム調整(90度で拡大縮小なし) ・zバッファに格納するために、zを最後にwで割られた後に0〜1になるように変換(偏りはすさまじい) ・アスペクト比の調整のためにちょっとxを小さくする という理解で問題ないでしょうか?
うん
>>502 そこ明確にしないとダメじゃね。
メタセコイアのトゥーン処理はどういう手法でやってるのかを調べて
その処理方法を調べるのが良い。
いまのままだと、全部憶測になって時間の無駄かと。
>>506 ありがとうございます
ちょっとメタセコのスレに行って聞いてきます
508 :
503 :2010/12/03(金) 22:05:46
>>504 ありがとうございます。
中身ブラックボックスで使ってたときは、
中ですごぉいことやってるかと思ったんですが、
開いてみればめっちゃシンプルで驚きです。
3Dモデルのアニメーションについて教えてください 簡単な動き、Xファイル毎(手だけ足だけ等)に描画してその箇所だけ角度を変えたり、移動させるという事で合っているのでしょうか 上級者になると1つのXファイルでその中に入っている情報を読み取って、メッシュ毎に回転、移動させているのでしょうか?
「スキンメッシュ」でググりなされ
>>510 ありがとうございます、ヤフーでぐぐったらいきなり詳しい解説している所を見つけました
勉強してきます
>>509 SDKのサンプルにSkinnedMeshがあるからまずはそれを見てみるんだ
だがスキンメッシュは初心者には敷居がめちゃ高いから本当に挑戦するかは、
自分のスキルと相談してからがいいかも
プログラム以前にまともなモデリングツールを使うところからだろう。
お前の意見は聞いてないよ
スレ違い
どうでもいいが「ヤフーでぐぐる」っていうのはおかしい
D3DXVECTOR3 *WINAPI D3DXVec3TransformCoord( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV, CONST D3DXMATRIX *pM ); ↑これってpOutとpVに同じD3DXVECTOR3渡したら計算狂う?
それぐらい試せばすくが分かるだろうと言いたいが 計算前を残さないのでいいのであれば問題ない
float3 RegionB = {0.0,0.0,0.0}; float4 DifMedium = {0.6,0.6,0.6,0}; Col = TexColor; Col = lerp(Col.xyz ,DifMedium.xyz,RegionB); Col.w = 1.0f; return Col; こんにちは。なぜか真っ黒になります。どうしてでしょうか? Col = lerp(Col.xyz ,DifMedium.xyz,RegionB);を消すと普通に表示されます lerpってのはRegionBが0なので第一引数のCol をそのまま返して、何もしない時と同じだと思ってたのですがどこが間違ってるのでしょうか?
Col.xyz = lerp(Col.xyz ,DifMedium.xyz,RegionB);にしたらできました ありがとうございました
3次元における、ある点が、ある壁の内側にいるか外側にいるか(法線の方向にいるか、法線の逆方向にいるか)は、どうやって判定したらいいですか? 点の座標、壁のポリゴンの頂点座標、壁のポリゴンの法線がわかっています。
外積だろうね
法線が既に分かってるなら内積でしょ 外積は法線を求めるのに使うんじゃ
ごめん 内積の正負だった
527 :
デフォルトの名無しさん :2010/12/05(日) 02:30:43
余弦定理
直線を引いてね、 ポリゴンとの交差の数が奇数ならば 物体の内部にいる。 偶数ならば物体の外側にいる。
529 :
523 :2010/12/05(日) 10:10:26
>>526 あ、なるほど…
壁の頂点座標 - 点の座標 = 点から壁の頂点への方向ベクトル で、
そのベクトルが法線ベクトルと向き合う(内積が負)なら、壁の前方、
同じ向き(内積が正)なら、壁の後方であることがわかる…ということですね
他の皆様も回答ありがとうございました m_ _)m
法線情報が位置ベクトルも兼ねてるなんて保障はあったっけ? 法線を単位化してたら、頂点情報で平面と点から判定するのか正解かと
531 :
523 :2010/12/05(日) 10:38:58
>>530 すみません、少し説明が抜けてましたが、
今回の場合、法線はワールド変換した頂点から算出しており(ワールド空間における法線になっている)、
点も同じワールド空間にあるのですが、その作業って必要でしょうか?
>>531 逆に壁が必ず原点を通るなら(ワールド座標系ではなく、壁のローカル座標系なら)
壁を示す平面のwは必ず0になるから、法線だけで内外判定しても良い。
壁の頂点を引くことで壁ローカルになってるので
>>529 で大丈夫
523を擁護しようとしたら、先を越されてた。 523の言ってることは正しいし、基礎中の基礎。
529の計算は合っているけど、それだけで
>>523 の目的は果たせないと思うけどね。
無限平面との表・裏判定でしかないので。
>基礎中の基礎 これを基礎と言うことに違和感 基礎がないから、こんな変な方法を選ぶんじゃねーの
平面の法線との内積で裏表の判定は変な方法じゃないだろ。なにが気に食わないの?
>>538 >>529 をやるためには、1面につき
頂点1つと法線1つ、合わせて6要素保持しなきゃならない。
6要素使うわりに出来ることが増える訳じゃない。
また、面と点の位置関係によっては精度が悪くなる。
法線情報が予め分かっているなんて言ってるから混乱してるんじゃね? モデルデータとして既にある情報を使うって場合とかを真っ先に思いつくじゃん 判定したい頂点情報から、動的に外積で求めて使います って感じで言えば、じゃ内積で って終わりだったのに 後はついでに言えば 当たり判定のモデルと、描画用のモデルは分けるのがセオリー (壁とかで板ポリと言える内容なら同じでも良いけど)
529の計算と、532の関数の計算が等価だということが分からない人がいるようだな。 掛ける前に引くか、掛けた後に引くかの違いだけで、やってることは一緒。 それを変な方法とか言ってる時点で、根本的に分かってない。
>>541 V = 点座標
P = 面を構成する座標のひとつ
N = 面法線
>>529 ( V - P ) ・ N >= 0
9個の変数
8個の命令
>>532 V ・ N - ( P ・ N ) >= 0
9個の変数
11個の命令
ただし、-( P ・ N )を事前計算するなら、
7個の変数
6個の命令
2.00000000000個の変数と
2.00000000000個の命令数も
違うじゃねーかゴラァ!
ゆるさん! ぬっころす!
>>542 その形で書くと、・Nを分配しただけで同じ式って分かりやすいな。
DirectX9で質問です 不透明度のみを加算合成して、他のRGBはそのまま上書きされるような合成をしたいのですが 固定機能パイプラインで描画したいのでレンダーステートをどのように設定すればいいのか教えてください
D3DRS_BLENDOP D3DRS_BLENDOPALPHA D3DRS_SRCBLEND D3DRS_DSTBLEND 全部試す
>>545 それをアルファブレンドの式に当てはめると
SrcColor*(1,1,1,1)+DestColor*(0,0,0,1)
こういうこと。
(1,1,1,1)はD3DBLEND_ONEでいいが、(0,0,0,1)は定数では存在しないので
D3DBLEND_BLENDFACTORの力を借りる。
SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
SetRenderState(D3DRS_DESTBLEND, D3DBLEND_BLENDFACTOR);
SetRenderState(D3DRS_BLENDFACTOR, D3DCOLOR_COLORVALUE(0.0f,0.0f,0.0f,1.0f));
あるいは、D3DRS_SEPARATEALPHABLENDENABLEを使う方法もある。
SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO);
SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, TRUE);
SetRenderState(D3DRS_SRCBLENDALPHA, D3DBLEND_ONE);
SetRenderState(D3DRS_DESTBLENDALPHA, D3DBLEND_ONE);
こちらの方が概念としては素直だけど、対応してる環境がBLENDFACTORよりも少ない。
>>547 どういうふうに書けばいいの?
R = Rs
G = Gs
B = Bs
A = Ad + As
こういうこと?
バックバッファにレンダリングするのか 出力用の仮バッファにレンダリングして完成テクスチャを作るのかで違いそうな
仮バッファなんて使える奴ならこんな質問しないだろ おそらくやりたい計算式と自分の求める結果がまったくイメージできてない状態と思われるので とりあえず計算式書いてみろって言ってみた 求める結果の主要な色の合成だけでもちょっと式に当てはめてみればなんか違うとわかるんじゃないかと・・・
>>551 ,552
バックバッファにもA付きのフォーマット使えるよ。
ディスプレイフォーマットとしてはA付きはないが、バックバッファとしては有り。
DestAlphaを使ってステンシルマスク的なこともできる。
A付きフォーマットが使えたとしても 直接描画しちゃったらαを書き重ねるごとに加算してくなんてできないでしょ それがやりたいのかどうかは分からんけど
DirectX9使ってます マルチスレッドのプログラムで複数のスレッドから描画とかしたいんだけど それぞれのスレッドごとにデバイスを作って描画したりするのはまずいですか?
>>554 わかってるよ
この場の議論に関係ないことわざわざ書き込むな邪魔
>>556 D3DCREATE_MULTITHREADED では駄目なのかな?
さすがにスレッドごとにデバイスを作ったことはないなぁ・・・。
>>556 スレッド切り替える時間超かかるから
ワンフレ内に間に合わなくて動作不良な場合多いよ
1つの描画対象に複数スレッドから書き込むのはやめたほうがよさゲ
分かれてるなら別にいいかと
描画専用のスレッドをつくって、そのスレッドに他のスレッドから描画命令を 送る感じがいいね。
てか、OSのスレッドの切替やら待ちってワンフレ内に余裕で終わるほどの早さなのか? ウィンドウズのメッセージってそんなに早くないだろ 1msに1回とかそんなもんじゃねぇけ? ゲームだと60Hzだとしたらワンフレ16msぐらいしかないんだぞ 往復2〜3回やりとりしたら処理落ちすんじゃねぇか?
>OSのスレッドの切替 これは速い >待ちって 設計のしかたにより >ウィンドウズのメッセージ この待ちは遅い。 >ゲームだと60Hzだとしたらワンフレ16msぐらいしかないんだぞ >往復2〜3回やりとりしたら処理落ちすんじゃねぇか? 超クソ設計乙
>>562 >これは速い
リアルタイムのアプリで実用化できるほどの速度なの?
少なくとも俺が前やった感じだと超遅かったんだけど?
何か気をつけることある?
もしかしてタイマー依存じゃね?とも考えたほどだけど・・・
>>562 起動と切り替えを間違えてないか? 起動は遅い
スレッドの切り替えはタイマーの精度依存だよ timeBeginPeriod(1)とかすると システムクロックの割り込み間隔も短くなるのでスレッド切り替えの密度が上がる timeBeginPeriodを読んでるアプリがあると 起動してる全てのアプリケーションの動作に影響が出るのはそのせい
>>565 やっぱ、そうだよね>タイマー依存
これ、ゲームで使うのはうまくないよね
ビジネスアプリでもスレッドをボコボコ立てる奴の作るものは出来が異常に悪い
スレッドのコンテキスト切り替え処理の速度の話なのか タイマーの割り込み間隔の話なのか スレッドのタイムスライスの話なのか
頭だけ削除(見えなくするだけ?)をしたいのですが DestroyFrameやDestroyMeshContainer、または両方を使えば良いのでしょうか? やってみたのですがFrameのポインタを使うところなどでメモリ0を読み込むエラーが出ます どうするのが良いのでしょうか?
>>570 DirectX9のXファイルを使ったスキンメッシュの話だよね?
自分がやってる方法は、マテリアルをあらかじめ分けておいて
マテリアルごとにDrawSubsetする/しないを判断する方法。
他にもシェーダ使ってID制御するとか色々方法はあると思う。
Frameを削除しても、その部分が動かなくなるだけで
描画はされてしまうよ。
頭のテクスチャを透明に
>>571 >>572 ありがとうございます。そうなんですか
自分がやりたいことはゲームでよくある服や装備を選ぶ時に、それが装着された状態の画面を見ながら選ぶってのを作りたいのですがどうすればいいのでしょうか?
道具リストに入ってるメッシュのデータはどのタイミングで読めば良いでしょうか?この場合だとマテリアル毎じゃなくてメッシュコンテナーを消した方がいいですよね?
質問がわかりにくかったと思うので書き直すと、デストロイフレームを実装してフレームルート→フレームチャイルド→フレームチャイルド
の適当なフレームのポインタを削除した後、オブジェクトのインスタンスを作り直したのですが、その後アップデートの時に if( pFrame->pFrameSibling )と呼び出していくと
さっき消したのでイフをすり抜けて欲しいのですが、ここでポインタの読めない所を読んでますみたいなエラーが出るのです。
教えてください
関数だったら戻り値設定しないとif文で評価出来ないんじゃないのかな
>>573 ごめん、質問が何個もあるし、何をやりたくてFrameをいじってるのかさっぱり分からない。
とりあえず、そのポインタ云々のエラーは、デバッガ出力の内容をよく見て解決して。
DirectXではなくてプログラミングの問題だから。
たぶんpFrameがNULLになってるんだと思うけど。
ちゃんと木構造が成立するようにポインタを消していないんだと思われる。
D3DXじゃ融通が利かないんだから、変則的なことをするなら、 自分で実装した方がよっぽど楽なのに、しがみつく理由がさっぱり理解できない。
>>574 >>575 ありがとうございます
そういえばif( pFrame->pFrameSibling )はif( 構造体->メンバ )なのにif節に使えるっておかしいですね。呼び出しが成功したら1が返るみたいな仕組みがあるのでしょうか?
普段は何が返ってif節を通り抜けてるのでしょうか?elseを追加してブレークポイントを設定したのですがデバッグを開始するとブレークポイントが勝手に下にいってしまうので確認できません
消し方はこれです↓
if(pFrameToFree->Name)delete[] pFrameToFree->Name;
if(pFrameToFree->pMeshContainer)DestroyMeshContainer(pFrameToFree->pMeshContainer);
if(pFrameToFree->pFrameSibling)DestroyFrame(pFrameToFree->pFrameSibling);
if(pFrameToFree->pFrameFirstChild)DestroyFrame(pFrameToFree->pFrameFirstChild);
delete pFrameToFree;
これでデストロイフレーム(フレームルート→フレームチャイルド→フレームチャイルド)をしたのですが、何かおかしい消し方なのでしょうか?
したいことは>ゲームでよくある服や装備を選ぶ時に、それが装着された状態の画面を見ながら選ぶってのを作りたいです。定番の方法があるのでしたら教えてください
その時に、道具リストに入ってるメッシュのデータはどのタイミングで読めばいいのかも教えてください
メッシュクラス使ったことねーけどvisibleってねーの?
>>577 Frameを消したらメッシュの一部分が自動で消えると思っている?
そうだとしたら間違い。Frameは基本的にメッシュの各頂点の位置を決める構造を持っているだけだよ。
ポインタに対するif文評価についても再確認して。言語の問題。
あとD3DXのスキンメッシュ使いたいなら、コンテナの構造をきちんと理解すること。
装備やタイミング云々は、どちらもあなたが作っているゲームの構造に依存するものだから
一概にこれというものはないよ。
DirectXあんまり関係ないしね・・・。
まぁ普通にファイルをパーツ毎に分割した方が手っ取り早そうだよな。
D3DXで使えるのはテクスチャ作成するやつだけじゃね?
>>579 そう思ってました。アップデート毎にメッシュコンテナーから座標を取ってきて行列に掛けてると思ってたのですが違うのですか?
どうやって消すのが良いのでしょうか?
特に、道具を選んだらその道具を持ってる画面が逐一出るようにしたい場合は。
>>583 じゃあ道具の選択肢が10個あったら10個のメッシュコンテナーをDrawSubseでONOFF設定したり透明テクスチャ貼って描画処理するんですか?
なんか無限増殖しそうなんですが大丈夫なんですか?
>>584 基本、そう。
条件分岐させるだけだから、簡単でしょ。
無限増殖とあるけど、何の無限増殖を心配してる?
こういった方法なら何の削除も作り直しも発生しないから、何かが増える心配は少ないと思うけど。
正しい管理が必要なのはどれも一緒。
でもなんか、話が微妙にすれ違ってる気がするなぁ・・・。
>>585 ありがとうございます
デストロイフレーム(フレームルート→フレームチャイルド→フレームチャイルド)した後に
フレームルート→フレームチャイルド→フレームチャイルド=NULLをしたら一応エラーは無くなって表示されるようにはなりました。変な形になりましたが
フレームルート→フレームチャイルド→フレームチャイルド→フレームシブリング=NULLを消して フレームルート→フレームチャイルド→フレームチャイルド=NULLだけにしたら完璧に消したい部分だけ消せました 本当に、ありがとうございました普通にフレーム消すだけで消えるだろ知ったかゴミカス 無駄な知識自慢のレスばっかしやがってゴミ 何が言語の問題。 あとD3DXのスキンメッシュ使いたいなら、コンテナの構造をきちんと理解すること。(キッ やねんととっとと死ねゴミ ポインタに対するif文評価についても再確認して。言語の問題。(キッ打つ暇あったらdeleteじゃなくてNULL代入しろぐらい打てやゴミ 死ね
質問です。 下記のようにするとスペキュラの値がおかしくなりました。 struct VS_OUTPUT{ float4 position :POSITION; //頂点座標 float4 color0 :COLOR0; //色 float4 color1 :COLOR1; //スペキュラ float2 texCoord0 :TEXCOORD0; //テクスチャ座標0 float2 texCoord1 :TEXCOORD1; //テクスチャ座標1 float2 texCoord2 :TEXCOORD2; //テクスチャ座標2 float3 r :TEXCOORD3; //キューブテクスチャ座標3 float fog :FOG; //フォグ }; そこで 下記のようにしたら正常に動くのですが、何か間違っているでしょうか? struct VS_OUTPUT{ float4 position :POSITION; //頂点座標 float4 color0 :COLOR0; //色 float2 texCoord0 :TEXCOORD0; //テクスチャ座標0 float2 texCoord1 :TEXCOORD1; //テクスチャ座標1 float2 texCoord2 :TEXCOORD2; //テクスチャ座標2 float3 r :TEXCOORD3; //キューブテクスチャ座標3 float3 color1 :TEXCOORD4; //スペキュラ float fog :FOG; //フォグ };
すいません 正常に動いてませんでした 出直してきます
シェーダより頂点宣言になにか問題ありそうな予感
>>590 それが頂点シェーダの出力とピクセルシェーダの入力部分なんですけど
この部分って頂点宣言により結果変わったりするのでしょうか?
エスパーじゃないと今出てる情報だけで判断することはできない
593 :
デフォルトの名無しさん :2010/12/06(月) 09:38:36
スマートポインタでDirectSoundを設計しようとしています。 SmartPtr<IDirectSound8> pDS8; DirectSoundCreate8(NULL, pDS8.GetPtrPtr(), NULL); pDS8->SetCooperativeLevel(hWnd, DSSCL_PRIORITY); //ここでエラーで止まってしまいます。 0x00412229 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000000 を読み込み中にアクセス違反が発生しました。 なぜでしょうか
>>593 pDS8.GetPtrPtr()にちゃんとしたアドレスが入ってないからじゃね?
俺の経験上、 0xC0000005: 場所 0x00000000 とか出てきたら、ポインタにアドレスが入ってないことがある
そりゃそーなるわな スレ違いだからC言語スレに行くか、その野良スマポを作った奴に聞け
深度バッファに書きこまれている値を取得する方法ってありますでしょうか? 一旦画面を撮影した後、深度バッファを見ながら深度フォグかけたり、色々とポストエフェクトをかけたいのですが。 それとも深度は、テクスチャに素直に書きださないと取得できないでしょうか。 (画面のRGBAのAに入れる手もありますが、256段階ではさすがに精度が厳しいので)
深度バッファをロックですか
自作のゲームプログラム(DirectX9/9EX)が一部の環境で 解像度が半分になってしまい、困っています。(画面全体が2ピクセルのブロック状になる) おそらくビデオカードのユーティリティーの設定に誤りがあるのだと思うのですが、 ご存じの方いらっしゃいますでしょうか。 - Microsoft Windows 7 Ultimate 64 ビット - メモリ 12_882_894_848 bytes - CPU Intel(R) Core(TM) i7 CPU X 980 @ 3.33GHz - ATI Radeon HD 5800 Series ゲームのWindowは可変サイズで、リサイズすると クライアント領域のサイズでフレームバッファをつくり直す仕様です。
599 :
593 :2010/12/06(月) 12:29:04
>>599 そこに限らずDirectXのAPIはあらゆる場面において
どんなエラーを返してくるか分からないので、
常に戻り値をチェックして、まずい場合は例外を飛ばすなりしたほうがいいよ。
C/C++ならマクロでくるんでしまうといい。
>>600 あのさー
初心者相手なんだから
具体的なメソッドとか、調べ安いページとか、検索ワードとか教えてあげた方がいいよ
API,戻り値チェック、マクロでとか言われてもはいそうですか役に立ちましたとはならない
>>601 与えられたヒントで調べることもできないのは初心者じゃなくてただの教えて君。
そもそもAPIってなに?戻り値のチェックって何?とか言ってるレベルならDirectX
で何か作るとか以前の問題だしな。
>>600 の回答に不満があるならいちいち文句たれずにお前が教えてやれw
>>602 馬鹿だなお前
レス汚すだけならもう来なくていいよ
言いだしっぺの法則って知ってるか?
>>604 日本語理解できるか?
日本語も理解できないやつはただの無能。そんな馬鹿にはDirectXなんて無理ね。
って言われてもお前の役にはたたないだろ?
だからお前はダメなんだよ
言いたいことはそれだけか? さあ今すぐ手を動かして成果を出すんだ
正論をちょっと書いただけなのになんでそんなに荒れるんだ。 HRESULTのエラーチェック方法なんて DirectXのサンプルプロジェクトのソースコードを見ればわかるだろう。
600の回答は十分親切だと思うけどな。
とりあえず デバイス作成時とデバイスリセット時のコードが欲しい所だ
や、この件って俺様スマぽの実装がタコってただけなのに HRESULT云々とか話し始めてなにこのひとこわい、みたいなー
GetPtrPtr
フルHD用の画像をテクスチャに出力し、その後加工したあとディスプレイに描画したいと考えています。 フルHDはつまり1920x1080なのですが、これですとテクスチャサイズは2048x2048となってしまいます。 なんだか下部56ドットのためだけに、消費量が2倍になってしまう(2048x1024に比べて2倍)のですが、 こんなものなんでしょうか。 それとも大抵は2048x1024を1920x1080にリサイズして表示しているのでしょうか?
>>612 2048x1024、2048x512、2048x256、2048x128の四つのテクスチャを用意して貼り合わせるとか?
いまのハードなら別に2の累乗にこだわらなくても良いとは思うよ どういう加工を考えてるのかは分からないけど あとは求められる精度とピクセルシェーダーの負荷を天秤に掛けてサイズを決めればいい
>>612 動かすビデオカードの機能でPOW2のフラグが立ってたらどうしてもそうなる。
>>603 >>605 馬鹿はてめぇだ
>>610 >>593 が「アクセス違反になるのはなんで?」って言ってるから、ポインタがNULLなんじゃないの
戻り値チェックして確認しろよって言ってんでしょ。一体何を煽ってるんだ?w
DirectX9でIDirect3DSurface9のサーフェイスを作り そのサーフェイスをSetRenderTagertで描画ターゲットにすると デバイスロストから復帰させるときにResetが失敗して D3DERR_INVALIDCALLが返されてしまいます サーフェイスに描画したあとは元のバックバッファにターゲットを戻しているし Resetを呼ぶ前にリソースの解放もしています ちなみにサーフェイスを描画ターゲットに設定せず、GetSurfaceLevelで テクスチャに関連づけただけならResetは成功します
>サーフェイスに描画したあとは元のバックバッファにターゲットを戻しているし これが成功してるかチェック。
>>617 D3DUSAGE_RENDERTARGETで作ったんならD3DPOOL_DEFAULTだろうから
リセット時に解放してサーフェイス自体を作り直さないとだめなんじゃないの?
いろいろ弄っていて、サーフェイスは原因ではないことに気付きました バックバッファを得るためにGetRenderTargetを呼ぶだけでResetが失敗するようです なぜでしょうか? ちなみにGetRenderTargetは成功しています
>>621 描画が終わったらすぐに元のRenderTargetに戻すべきだけど、それはやってる?
>>622 戻す以前にSetRenderTargetで描画ターゲットの変更もしていません
GetRenderTargetでバックバッファのサーフェイスを得ただけで失敗してしまいます
なんか全然違うところに問題がありそうな予感 最小コードまで戻して原因突き止めたほうがいいんじゃない?
GetRenderTarget をコメントアウトすると Reset は成功するの?
関係あるか知らんけど シェーダのエフェクトもデバイスロスト処理が必要だったりするよ
コードを消していって、とりあえずDirectXに関係するオブジェクトは
IDirect3DとIDirect3DDevice9だけにして、他のリソースは全部消してみたんですが
やはりGetRenderTargetを呼ぶとResetが失敗します
>>625 はい
じゃあ、もうResetを呼び出す場所がわるいんじゃないの? 別スレッドから呼んだりはしてないよね?
GetRenderTargetしたものをReleaseしていないとか。
>>629 それでした・・・
ありがとうございます
>>623 GetRenderTargetを呼び出した時点で参照カウンタが増えるんだが、その後始末はしてる?
トリガーキーを使って2回何秒以内に、スペースキーを押されたら(ダブルクリックのような感じ) 何かしらの動作をさせる処理のですが、 Directxを使いこなしている人はどのような書き方をしているのでしょうか 参考程度に教えて頂けないでしょうか 自分の場合はifを繋げまくっているだけで見た目の悪い文章になってしまって・・
>>614 最近でも2の累乗にしなきゃいけないグラボはあるよ
ネットブックとかだと特に
>>634 今どきそんなの見たことないな。
ネットブックでも使える。
以前調べたときに、NONPOW2CONDITIONALすらダメだったのは
一番新しくてもi810あたりだったと思うが。
>>635 デスクトップのオンボードだけど
D3DPTEXTURECAPS_POW2
D3DPTEXTURECAPS_NONPOW2CONDITIONAL
の両方ダメ
NVIDIA GeForce 6150SE nForce 430
一応VistaPCなのでいきなり切るのはどうかと・・・
べつに全切りする必要はないじゃん? 使えない環境だけで多少負荷が上がっても2の累乗にすればいいだけで 全部ソレ使わなきゃいけないわけじゃないし
まず服を脱ぎます
いまどきDirectMusicか・・・ まぁがんばれ
>>640 今はDirectMusicよりMIDIを再生するもっといい物があるんですか?
MIDIが古い 環境で音が変わるんだから、oggとかにするべきじゃないか
環境で音が変わるからこそMIDIがいいんじゃないか 分かってないな まあ、Windows上で動かすなら環境依存はない
高性能のハードMIDIシーケンサもってりゃそうかもしれないけど、普通はMIDIだとしょぼいよね
まあやりたいならやりゃいいんじゃない 文句を言う筋合いはないだろ
サウンドプログラムって面白そう
下記ソースにて三角形二枚の板ポリゴンを描画しています。 しかし、このソースではアスペクト比が変わると、画面の端に描画しているものほど、 実際に画面に描画される位置がズレてしまいます。 どんなアスペクト比であっても、指定した座標(下記ソースではx・y・z)で、狙った位置に描画するにはどのようにすれば良いでしょうか。 //2D板ポリゴン用頂点フォーマット定義 struct TEX_VERTEX { float x,y,z; float u,v; } D3DXMATRIXA16 mWorld; D3DXMatrixTranslation( &mWorld, 0, 0, 1); g_pd3dDevice->SetTransform( D3DTS_WORLD, &mWorld ); //テクスチャードクアッドのレンダリング TEX_VERTEX vPoint[4]= { {x, y, z, 0, 0}, //頂点1 左上 {x + width, y, z, 1, 0}, //頂点2 右上 {x, y, z - depth, 0, 1}, //頂点3 左下 {x + width, y, z - depth, 1, 1} //頂点4 右下 }; g_pd3dDevice->SetFVF(D3DFVF_XYZ | D3DFVF_TEX1); g_pd3dDevice->SetTexture(0, g_2DCgTexture[idx].mTexture); g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, false ); g_pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, vPoint, sizeof(TEX_VERTEX));
3D空間に配置してるなら 別にアス比が変わっても座標自体は変わって無いぞ 視野角が変わるから見掛けの表示位置が違うだけで たぶんスクリーン座標で指定したいんだろうけど 座標変換済み頂点を使うか 正射影で描画すればいいんじゃね?
アスペクト比がどうこう以前に、ウインドウサイズが変わったのに、 ターゲットの解像度を変えずに引き延ばしているから表示が変になっているんだろ。
おふたりとも、ありがとうございます。 >>視野角が変わるから見掛けの表示位置が違うだけで この辺が分かっただけでも、だいぶ手がかりになります。 今、座標変換済み頂点や正射影と言われて「??」という感じです。 頂点座標変換周りの理解はかなり怪しいので、これを機に勉強しなおしてみます。
>>588 です
原因(?)というか現象がわかりました
HLSLのpow関数で0乗を指定したときになるようです
PCによって起こる現象が違うみたいです
は?0乗って1じゃねーの?とか思いこんでいたのですが
pow関数を0乗で実行するとプログラムおかしくなってるみたいです
ってヘルプみたらちゃんと書いてあってビックリですw
DXUTのUIで既にあるIDで新しいUIをAddしたらどうなりますか?
>>653 次の空いてる番号に作られるで合ってますか?
DXUTのUIってデバッガで見にくくないですか?CDXUTDialog型変数からIDやUIの形式をすぐ見るにはどこを開いていけば良いか教えてください
スキンメッシュアニメーションについて教えてください Directx9でアニメーションをするXファイルを描画し続けたいのですが、 いざネットに上がっているソースコードを見ても、スキンメッシュアニメーション以外の プログラムが沢山入っており、どれが必要でどれが必要ないのかといった事が全くわかりません・・ DXが用意している関数を使わずアニメーションをするといったプログラムで、紹介しているサイト様がありまして それを参考に勉強していましたが、Xファイルを使わず自分で作った三角形を動かしており、 いざこれをXファイルに置き換えて考えるとなると、全く訳が分からず完全にお手上げ状態です DXの関数を使って、Xファイルも使い最低限のプログラムで公開しているサイト様or そういった参考書など、初心者向けな物はないでしょうか。 現在は、Xファイルの読み込み、3D空間上での動作、カメラの動き等は分かっています。 次のステップとしてアニメーションをさせたいと思っており、どうしても勉強したいです
SDKにサンプル付いてなかったっけ SkinnedMeshとかなんとか
>>655 SDKのSkinnedMeshサンプルってスキンメッシュ以外何も入ってねーじゃん
おめ、ボーンの基本的な仕組みを理解してるのかよ?
理解してるかチェック
1.ワールド座標系→ローカル座標系変換ができる
2.ローカル座標系→ワールド座標系変換ができる
3.ローカル座標A系→ローカル座標B系変換(またその逆)ができる
4.Xファイルの構造がわかる(テキトーでもおk)
理解してないから聞いてるんだろ お前は一体何を言っているんだ
うるせーーー!
>>656 >>657 恥ずかしながら、SkinnedMeshを見てもウィンドウの作成、ビュー、ワールド、射影は置いといて
それ以外が何をしているのかが全く分からない状態です・・
理解してるかチェック
1.出来ます
2.出来ます
3.ローカルをローカルにはやった事はありませんが、アニメーションのプログラムで一度原点に戻してから、
計算しなおすといった事で使うものであってるのでしょうか。処理を軽くするためと書いていてそれじゃなければ出来ません
4.テキストで開いた文字列の事なのでしょうか・・直接数字をいじって色を変えたりも出来ません
まずは自分で厳密に計算して、ポリゴンを目的の場所に描画できるようになってから次に進め。
664 :
662 :2010/12/08(水) 21:20:24
>>661 申し訳ないです、つまり
>>662 の下の文章の通り、質問された内容がアニメーションでは必須で
これも分からなければそこからやり直せと言われたらそうします。
そうでなければ上の文章の「 その61 」URL を踏ませてまですみませんが
この回の内容が分かればDirectxの関数を使わずともアニメーション処理をする事が
可能になりますでしょうか
Xファイルから頂点の情報とボーンの情報を取り出して
>>662 のサイトの説明に当てはめればできると思うけど
666 :
662 :2010/12/08(水) 21:23:46
>>663 文章を書いていて通り過ぎました、申し訳ないです
サブセット毎に意図的に配置しろ、という事で合ってますでしょうか
>>662 結局何がやりたいのか分からん
Xファイルは使いたいけど
D3DXインターフェイスやヘルパー関数を使わずにやりたいってこと?
スキンメッシュの実装は貴方が思ってる以上に複雑なもので一朝一夕にやる方法は無いよ
SkinnedMeshのコードは素人目には必要なさそうなコードがいっぱいあるように見えるけどほ基本全部必要なものだから
1行1行追いながら何をやってるのか理解するしかない
668 :
662 :2010/12/08(水) 21:28:03
>>665 有難うございます、勉強していて違った方向へ進んでいたのかと思いました
そのサイトでは三角形の数が少なくかったので少しは分かりましたが
それがXファイル規模となると頂点の数すべて取り出せるのか? と思っていました。
自前でXファイルを扱うのなら、まずは読み込んだ数値をコンソール出力するところから。
Xファイルはフォーマットが曖昧だから 読み込みまではヘルパー関数使ったほうが良いな 自分で解析しようとすると読めないファイルがあるとか結構ある
>>667 はい、最終的にはDirectxの関数を使わずやりたいと思っていまして
いきなりホワイトボックスから入っていました。
skinnedmeshとそのサイト様でのプログラムの量の差からskinnedmeshのソースには
アニメーションに必要な部分以外もあるのかなと思い込んでいました。
1 Xファイルの構造を読み込む。 これは自前で作ってもいいし、用意されているパーサを使ってもいい。 2 読み込んだデータを自前の構造体なり配列なりに格納 3 データをテキスト出力して、元ファイルと照合 4 ポリゴンを組み立てて自分で描画 5 フレームアニメーション要素の実装 6 スキンウエイトの適用 段階を踏んでいけば時間はかかるがそのうち出来るよ。
それから最初は立方体のような簡単なデータを読み込むようにすること。 構造が確認できたら複数のフレームに増やすようにする。
時間がかかる割に得られるものは少ないので止めた方がいいと思うけど。
今時のPCで自力で3Dモデル表示させる必要なんて全く無いからな DirectXは常に最先端だから、今どうしても使わないといけない層は3D職人レベル 一般のゲーム開発ならDXライブラリやゲームエンジン使った方がいい。DirectX9っていつのだよww
ろくなサイト無いから自分でエクセルで計算したほうがいいよ
>>662 ああ、そこ勉強したら理解できるんじゃない?
俺の言ったことが理解できなきゃ
ボーンオフセット行列理解できないと思うけど
>>661 読んでわかったならそれで十分だよ
ただ、1,2から3を想像できない辺りちょっと不馴れかな・・・と
自分が作りたいものにスキンメッシュが必要だからって
いきなりスキンメッシュやろうとしてるならもうちょっと経験積んだほうがいいかと・・・
まず、DirectXの関数使って組んでみて改めて自作してもいいんじゃない?
俺は根性時代の人間なのでSDKのスキンメッシュのサンプル全文書き取り(わかるまで何度でも)がいいと思うけどw
そんなの時間の無駄。 今なら「ゲームエンジンアーキテクチャー」を読めばスキニングの解説がソース付きで乗っている。 あれ読んで理解できなかったら知識が足りないので補充すれば良い
680 :
デフォルトの名無しさん :2010/12/09(木) 06:11:24
DirectSoundでメモリに展開してあるファイルをストリーミング再生するのって意味無い?
このスレは楽しい
684 :
680 :2010/12/09(木) 08:51:00
教えてください サウンドバッファはどこに作られます? サウンドカードやチップセットにそういう場所がある?
>>684 OSによって変わるし、XP以前だとドライバ任せ。
Vista以降だと完全にソフト制御になって
ハードの支援が受けられないので、基本的にはもう使わないほうがいい。
>>684 そうじゃね。そういうカードなら
ただ実際はメインメモリに置いてあるPCMデータを必要に応じてカード側にDMA転送とかされて
それで発声されんじゃね。 てかその辺はドライバの仕事でアプリケーション製作者が必ずしも関知する所じゃないんじゃね
>>686 なるほど。大きいファイルだからPCによってはストリーミングにしないとバッファに入りきらないってことはなさそう?
>>687 XAudio2の場合は最大でもSourceVoiceには2MBのバッファまでしか渡せない。
DirectSoundの場合の制限は分からないけど、
ある程度の長さ以上の音声ストリームはストリーミング再生するのが常識。
oggからのライブラリを介したデコード、ストリーミング再生、複数ストリーム合成。
この辺含めて500行かかんないので、グダグダ言わず実装したほうが早い。
ストリーミングは以下の状況で有効 回線速度が遅く、全データの取得に時間がかかる場合、 ストリーミングなら、頭の部分を取得した時点で再生を開始できる データサイズが巨大で、ずべてメモリに上げると、メモリの利用効率が 落ちる場合、ストリーミングなら、小さいバッファで再生できる
>>689 DirectXで動かすプログラムでストリーミングデータが
ネット上から動的に落として来るってシチュエーションが存在するのか?
どこぞの3Dのオンラインゲームではゲーム内の映画館のスクリーンに動画をストリーミング再生で貼り付けていた ローカルかネットかは知らない (ローカルのような気がする) が、同じ手法でネットから再生するシチュエーションはありえそう 仮想空間内のTVに何かのリアルタイム中継を流すとか
Xファイルって今でも第一線で使われてるの?
今でもというからには以前は第一線で使われていたことになるが、 いったいいつのことだか具体例を出してもらおう。 話はそれからだ。
どうしてマイクロソフトは第一線でも使えるフォーマットを標準にしなかったの?
>>689 今はネットブックにもメモリ1G2Gが当たり前の時代なのに、CPUの負担を増やして圧縮ファイルからデコードする意味はある?
Primitiveにモデルを描画するしかないのか
>>685 まずは第一線で使えるフォーマットとな何なのかを明確にしろ。
第一線でも使えるフォーマットにしようとしたけど 仕様が糞すぎて各3Dモデリング開発ソフト会社からそっぽ向かれた
形状は曲面や球なんかはポリゴンにしてしまったら2度と元には戻せないから非可逆だし 法線がないときもある(笑)、あるかもしれない(笑)とかいい加減だし また、マテリアル分割されてないからリアルタイムにも実はあんまり向いてないよね そのままDrawPrimitiveにぶち込めるフォーマットにしてくれりゃよかったんだけど それだとメモリ的な無駄(はぁ?なにがしたいの?)が多いとか馬鹿な人が考えちゃったんだろうねw
Xファイルのように簡単に扱えるフォーマットですら扱えない
>>701 のような存在に当時MSが気がついていなかった。
仕方がないのでDirectX11では
>>701 が言っているとおり、
そのままぶち込めるもっと簡易的なフォーマットをSDKのサンプルで提供している。
しかし現実問題としてそんなフォーマットじゃサンプル以外に使い道がない状態。
つまり馬鹿に何を与えても無駄ということ。
Xファイルって使える気がしてきた。 便利な関数揃ってるし
X-Fileは自分で定義したテンプレートが追加できるので、 自分でエクスポータが作れるのならあらゆるデータを含むことが出来る。 ただしD3DXを使わないと扱えない人間が使う限り糞フォーマットでしかない。
>>702 >しかし現実問題としてそんなフォーマットじゃサンプル以外に使い道がない状態。
それってお前が馬鹿だからじゃないの?
>X-Fileは自分で定義したテンプレートが追加できるので これが諸悪の根源 汎用の方向性が間違ってる
DCCツールのプラグインから欲しいデータを追加していけばいいんでしょ
プログラマから見ればそうだけど デザイナから見たらめんどくさいことこの上ない 結局は作る人間に受けの良いフォーマットじゃないと受け入れられない
>>706 誰も使わないけどなそんなもん
読めるモデリングソフトがあるわけでもなし
なんかメリットあるんだろか?
COLLADAが笑顔でうなづいています
結局のところ便利にやるならシステムに沿ったフォーマットを自作するしかない。 だからエクスポータを自作できないレベルの人間に許されていることは、 不便でも既存の汎用フォーマットを使って不満を垂れ流すことだけ。
必死だなw
モデリングソフト+プラグインだよな 高額モデリングソフトならどれでも、安いのならメタセコ+プラグイン(¥5000)でおk でもこの小額すら惜しむ奴いるんだよな・・・ 本も一冊も買わない、それでいて勉強した気になってるから困る
実際のところ第一線とやらのデータは、 各ゲームごとに独自実装で専用のエクスポータを作っているし、 汎用フォーマットをそのまま使っているものなんて皆無なんだよね。
ずいぶん前にシェア版メタセコのライセンス買ったのに ここ数年Blenderしか使ってないな
XFile擁護してるの一人だけじゃん
blender結構使えるぞ
>>718 使える使えないとか聞いてない
あまりにも操作が変態的過ぎていつも記憶から消える
一番安いソフトがメタセコだと脳みそで修正される
たとえ、それがタダであったとしても
別に強要はしてないから大人しくメタセコ使っててくれ Blenderは何回か挫折したがあれはよいソフト でも残念ながらこの話題はスレチ
Blenderちょっとみたけどボーンの情報も簡単にとってこれそうだけどね>プラグイン 昔からタダなのに人気ないな
スレチだから他所でやれやゴミ
ま、ようするにPerlかなにかでコンバーターを用意しとけって話だろ。 同じテキスト同士なら。
プラグインだって言ってるだろハゲ
Blenderが不人気なのはまともなエクスポータがないせい メタセコはLW互換に見せかけて全然別物だから操作キモいよ
死ねやコラ? どこのスレでやっとんねんコラ?
>>725 それってデザイナ的に?
メタセコはポジ確定してるけどBlenderはアニメーションまであるからデータの移行とかなさげだけどな
ゲーム作るってだけならプラグインでいいデータ吐けそうなんだけどな
もちろんスキンメッシュ付きXファイルも含めて
まじでうざいからよそでやって
ブレンダーはカルト宗教だからどうしようもない "Blender"とか"ブレンダー"をNGワードに登録することを勧める
>>701 そもそも、Xファイルが作られたとき、まだDrawPrimitiveはなかった気がする。
何がうざいって自治厨が一番うざいわ
>>731 単に自分の気に入らない話してるから叩き出したいだけって感じだしなw
負け犬臭くてよしw
Blenderは脅威だからな。 メタセコが勝ってる所は何もない。
最近のBlenderはそんなに変態仕様じゃないぞ? プラグイン開発環境とマニュアルも充実してて、半日もあればエクスポータくらい出来るって
本当にカルトなのは屈折したメタセコ厨 メタセコをNGワードにすると幸せ
小遣い出して3DS MAX使おうぜ。
デバイスロストのときにエフェクトをOnLostDeviceとOnResetDeviceではなく ReleaseとLoadにしたら読み込みで失敗します 他のリソースは全部Releaseして生成にしてるので、これも同じようにしたいんですが なぜ失敗するんですか?
プログラマでも簡単に扱えるソフトは無いのか?
SetVertexShaderConstantFで行列を設定するとき転置しないといけないのは何故ですか?
>>738 あんまりこの話続くとスレチになっちゃうけど俺はXSI使ってるよ。
まったく知らないと難しそうに見えるけど、どれも大差ないと思う。
>>737 DirectXはライブラリではなくて規格なので、
公式マニュアルに書いてあるとおりにやらないとダメ。
文句を言っても無駄。
>>739 仕様としかいいようがない。
そもそも行列の並びの問題だから、最初から逆にしておけば転置する必要がなくなるし、
サンプル通りにやる必要性もないんだから、気になるなら逆でプログラムを組めばいいだけ。
>>738 いったい何を言っているんだ?
プログラマだからこそどんなソフトでも、拡張する余地さえあれば、
プラグインなりスクリプトなりで簡単に扱えるようにできるだろう。
>>744 たぶん、絵的センスが無くてもモデリングやアニメーションが上手く出来るソフトはないか?という意味じゃないの
使いこなせても使い道がない!
>>739 シェーダのベクトル×行列の命令が、転置行列を使うようになっているから。
行列を転置しておくと、ベクトルとの乗算に内積命令を使えて効率がいい。
内積ではなく積和演算(mad)を使えば転置しなくても同じ命令数で計算できるが、
アーキテクチャによっては内積を使うよりも遅くなってしまう。
このスレは面白い
>>733 日本語サポートってだけで大抵の人には有利
>>734 日本にはPythonを使える人がいない
>>736 色々使っても結局四大CGツールに落ち着くんだよな
>>738 四大CGツールならそんなに難易度は高くないよ
マニュアルも資料も豊富
中でもLW3Dなら数値入力でガンガン作れるから数字に強い人向け
らいとうぇーぶってまだ生きてるの?
4大CGツールってzbrush、blender、メタセコ、六角大王のことか
Maya、3ds Max、Softimage、AutoCADだろ
いま業界で強いのはMayaかな Maxしか使えない人だとちょっと苦しい感じになってる
プログラマでも絵的にいいって言ったら BryceやTerragenだな
>>749 >日本にはPythonを使える人がいない
問題発言
なんでmayaやmaxとか古いソフトにこだわってんだろうな〜 そろそろ新しいの開発すべきじゃね
>>756 新しいのは常に生まれて常に開発されて、それは延々と繰り返されてないか?
古いソフトにこだわってるんじゃなくて、デファクトの存在の話じゃないのか?
オートディスクに制覇されてしまいました
オートデスクは頑張ってるな 独禁法に触れない程度にもっと頑張れと思う 開発側からすれば1社に独占してて貰った方がいろいろ楽だ FBX関係をもうちょっとしっかりしろと言いたいが
気付いたらXSIもmayaもmaxもAutodeskか。
>>749 >日本にはPythonを使える人がいない
はぁ?
C言語できれば1週間でだいたいできるようになる(逆(Python→C)は無理だけどなw)
別にCじゃなくても何か別の言語でアプリケーション構築に慣れてれば リファレンスその他で1日で書けるぞ普通に。いやマジで。若干クセはあるけども
Pythonは他のスクリプト言語と比べると気色悪い部分が若干少ない でも括弧がない(インデントに意味なんてもたせやがって)のと ポインタがないのは俺はあんまり好きじゃねぇなぁ・・・
あと self に馴染めない、って言ってる人の多くは C/C++ じゃない気がする
>>763 ポインタが丸裸になってる言語なんか、C/C++とその親戚を除いたらほとんどないぞ。
あるのはオブジェクトへの参照。
>>765 そうなんだよなぁ
だからc/c++から離れられない
ポインタ隠れてるのってそんなにいいか?
むしろ面倒なだけだと思うんだけど・・・
SlimDX、XNA辺りはうまくやっている方じゃないかね。
768 :
デフォルトの名無しさん :2010/12/11(土) 02:14:51
DirectInputってwindows7,vistaでまだ使える?
769 :
k :2010/12/11(土) 02:55:14
初歩的な質問いいでしょうか? Direct3D 9 で2Dポリゴンを表示しようとしたんですが、ポリゴンの色が虹色では なく単色になってしまい困っています。デヒューズカラーの指定してるのに・・・ どうも頂点の配列の始めの要素の色が反映されているらしく、頂点を点として描 画すると正しくその頂点ごとの色が反映されるのですが、多角形として描画する と、その多角形がどうしても単色になってしまいます。さっきからデバッグした り他人のソースと見比べたりしているのですがさっぱり・・・どなたかご教授願 います!
770 :
k :2010/12/11(土) 02:56:07
続く
フラットシェーディング?
772 :
k :2010/12/11(土) 03:08:17
続き struct VERTEX2D_COL { //頂点の構造体 float x, y, z, rhw; D3DCOLOR color; void set( float X, float Y, float Z, D3DCOLOR col ) { x = X; y = Y; z = Z; color = col; rhw = 0; } } vt[6]; LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static IDirect3D9 *d3d; static IDirect3DDevice9 *device; D3DPRESENT_PARAMETERS param; D3DDISPLAYMODE d3ddm; switch (message) { case WM_CREATE: //DirectXを普通に初期化 d3d = Direct3DCreate9( D3D_SDK_VERSION ); d3d->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ); ZeroMemory( ¶m, sizeof(param) ); ここでまさかの3分割
773 :
k :2010/12/11(土) 03:14:19
すいませんソースが変です ソースはなかったことにして下さい・・・ >>フラットシェーディング? ソースを調べてみました。 シェーディングの設定は少しもしていないはずです。 塗りつぶしモードも setRendState( D3DFILL_POINT, mode ); setRendState( D3DFILL_WIREFRAME, mode ); setRendState( D3DFILL_SOLID, mode ); とやってみましたが、ワイヤーフレームとPOINTに関しては表示すらできず、 SOLIDで単色という感じです。諦めるしかないのか・・・
とりあえずどっかのロダにソース丸ごと上げてみろ、話はそれからだ
775 :
k :2010/12/11(土) 03:28:54
長文アップローダさがします(`・ω・´)
776 :
k :2010/12/11(土) 03:32:24
777 :
k :2010/12/11(土) 03:38:39
APIENTRY _tWinMainの所がまちがえてAPIENTRY_tWinMainになってました さっき編集して間違えたんだと思います。スペース挟んだらビルドできました。 ちょっとシェーディングの設定をしてみよう(`・ω・´)
こっちだと普通に頂点カラー反映されてるけど? とりあえずCreateDeviceで D3DCREATE_SOFTWARE_VERTEXPROCESSINGじゃなくて D3DCREATE_HARDWARE_VERTEXPROCESSING にしてみたら?
俺の勘だと rhw = 1
780 :
k :2010/12/11(土) 04:06:48
シェーディングモードを変えてみました。 device->SetRenderState( D3DRS_SHADEMODE , D3DSHADE_GOURAUD ); ⇒D3DPT_TRIANGLELIST色の違う頂点6個で、赤1色のぽりんごんに md.setShade( D3DSHADE_FLAT); ⇒D3DPT_TRIANGLELIST色の違う頂点6個で、黄色と黄緑のポリゴンに 目星がついてきた
781 :
k :2010/12/11(土) 04:59:56
rhwを1.0にしたらいけました!超ありがとうございます!! いや〜寝ずに質問してよかったです。 にしてもrhwは謎の存在だ
782 :
k :2010/12/11(土) 05:04:57
>>778 人のソースコードを眺めてるとD3DCREATE_SOFTWARE_VERTEXPROCESSINGの場合が
多かったからなんとなくそうしてました。
でもD3DCREATE_HARDWARE_VERTEXPROCESSINGのほうが速いらしいですね。それも
そうか。
>>782 誰かのソースがこうだったからなんとなくそうする、っていうのは後々困るからやめたほうがいい。
ちゃんと理解して書かないと今回みたいなことが頻発するぞ。
例えばCreateDeviceはまずD3DCREATE_HARDWARE_VERTEXPROCESSINGで実行して
失敗したらD3DCREATE_SOFTWARE_VERTEXPROCESSING、それでも失敗したら
D3DCREATE_SOFTWARE_VERTEXPROCESSINGって書き方すればよっぽどショボい
環境じゃなきゃデバイス作成失敗はしない(マトモに動作するかどうかは別)。
あと設定するフラグの意味とかもちゃんと理解すべき。
784 :
k :2010/12/11(土) 07:12:55
>>783 気をつけます(`・ω・´)
>>例えばCreateDeviceはまずD3DCREATE_HARDWARE_VERTEXPROCESSINGで実行して
>>失敗したらD3DCREATE_SOFTWARE_VERTEXPROCESSING、それでも失敗したら
>>D3DCREATE_SOFTWARE_VERTEXPROCESSINGって書き方すればよっぽどショボい
環境じゃなきゃデバイス作成失敗はしない(マトモに動作するかどうかは別)。
こうですねわかります。
if( D3D_OK == d3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING , ¶m, &device) )
return 0;
if( D3D_OK == d3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, ¶m, &device) )
return 0;
if( D3D_OK == d3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, ¶m, &device) )
return 0;
if( D3D_OK == d3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, ¶m, &device) )
return 0;
if( D3D_OK == d3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, ¶m, &device) ) return 0; if( D3D_OK == d3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, ¶m, &device) ) return 0; 何でこの二つを同時に並べてるの? 馬鹿?
786 :
k :2010/12/11(土) 07:48:41
>>785 本当だ
D3DADAPTER_DEFAULT と D3DCREATE_HARDWARE_VERTEXPROCESSING
の組合せはなしってドキュメントに書いてありました
あとrhwですが、float型ですがどうやらbool値っぽいです。0.01にしてみたり5.0に
してもポリゴンは不変でしたが、頂点によってrhw=0,rhw=1と変えてみたところ
rhw=0の頂点の色はグラデーションに反映されませんでした。ってきっとドキュメント
読めばちゃんと書いてあるんだろうな・・・読みます
>>776 色々つっこみどころがあるけど、一番地味な点を指摘しておこう。
>This method should not be run during the handling of WM_CREATE. An application should never pass a window handle to Direct3D while handling WM_CREATE.
(CreateDeviceの説明より)
WM_CREATEは特殊な状態で、 ハンドルはあるけど実体化してないような感じだからね。 その段階ではDirect3Dデバイスに関連付けることはできない。
なん・・・だと・・・
XPを捨ててCreateDeviceExを使えば幸せになれるよ。
>>790 ま、Vista以降だと無理してDirect3D9を使う理由もないから
最初から3D11に行っちゃうけどね。
directX10って全然話題にならないけど人気ないの?
>>792 DirectX11の方が洗練されててハードウェア対応も旧機種向けに拡大した上、
対象OSも変わらずだったので
DirectX10を使う意味が全くなくなった。
DirectX11もC++とWin32APIでプログラミングできますか? それとも.NETになってしまったんでしょうか
>>794 DirectX SDKを落として中を見てから言え。基本はC/C++のみだ。
逆に去年辺りまで公式の.NETサポートは無かったくらい。(XNA除く)
というかオープンソースでラッパライブラリ作ったはいいが、
MSDNその他の公式フォーラムでの扱いは未だにされてないな。
>>794 そういう疑問を持つ前に、SDKのインストールは終わっているのか?
見事にかぶったな
returnで戻しているのにelseを使う必要性がどこにあるんだ?
関数からの出口は1つにすべきっていう20年くらい前のコーディングスタイルを いまだに守ってる人とかw
801 :
デフォルトの名無しさん :2010/12/11(土) 20:43:24
DirectXの処理の仕組みについていまいちよくわかりません あるサイトでは処理ごとに違うプロシージャのようなものがよばれるとか、 またあるサイトではメッセージがなかったらゲーム処理をするとか DirectXではいつどのように処理をしているのですか?
それは設計の話なのでDirectX関係有りません
>>801 DirectXが処理するのはあくまで自分の持ち分である入出力の部分だけ
お前さんが見てる内容はDirectX関係なしに、単にwin32の領域の話
基礎としてWindowsの基本的な動き、メッセージ、ウィンドプロシジャの知識必須
そういう意味で、DirectXは単にwin32APIにおける各種関数やGDI関数のような立場
混同せずに順番に切り分けて理解すること
804 :
デフォルトの名無しさん :2010/12/11(土) 21:15:05
>>802 ,803
なるほど、そうだったんですね
てっきりwin32APIなどとは別物と思ってました
なんか分かって無さそう
>>804 win32APIと完全に別物だから切り分けろ関係ない、と上の奴は言ってる
キネクトでモーションキャプチャできるかもらしいのだが 試みた人居ますか?
もうされてる
スレチ
>>809 ofxKinect と opencv でもググれ。それで得られた値を使って、DirectXで何かしたいような場合
またこのスレに来るといいぜ
812 :
デフォルトの名無しさん :2010/12/12(日) 11:43:01
SDKにエンドユーザ向けランタイムをつくる方法があったと記憶していますが、どうやればいいのでしょうか?
プログラム板にキネクトスレ立てようぜ
>>812 SDKのライセンスの文章に書いてある。
スレチ厨うざいな
いやでもスレチだし
817 :
デフォルトの名無しさん :2010/12/12(日) 22:59:46
フレームレートを変更したいのですが以下で実行しても30FPSに設定されてしまいます。 // VIDEOINFOHEADERの取得 hr=pC->GetFormat(&pmtConfig); VIDEOINFOHEADER *pVih = (VIDEOINFOHEADER *)(pmtConfig->pbFormat); pVih->AvgTimePerFrame = 500000; // 20FPSに設定 // キャストして代入 pmtConfig->pbFormat=(BYTE*)pVih; //SetFormatでpbFormatの変更を適用 pC->SetFormat(pmtConfig); 設定方法が間違っているのでしょうか?
819 :
デフォルトの名無しさん :2010/12/13(月) 03:47:49
ランタイムって勝手にゲームと同封して再配布してもいいの?
>>819 DirectX 再頒布パッケージのことを言っているのなら、話は逆だ。
DirectX を使用しているプログラムを配布するときは、
使用しているDirectXのバージョンに合わせた再頒布パッケージを
「必ず」同梱しないといけない。
-1.#IND00 これなんですか? angle = acos(D3DXVec3Dot(&now_vec,&eye_vec)); っていう計算をしたら、angleに入ってきます。 ちなみに、now_vecとeye_vecは小数第3位あたりまでほぼ同じ数値が入っていて この場合、0が入ってきてほしいんですが… if(angle == -1.#IND00) angle = 0; とかしてみようとしましたが、数値ではないらしいのでエラー吐きます
計算が成り立ってないんだろう。
>>821 少なくとも 「if(angle == -1.#IND00)」 は通るはずが無いとまず思って欲しいが、
とりあえずその値は 「数値計算上、ありえない状態」 って意味。 要はエラー、INF みたいな物
あ、なんか誤解招く言い方したかも 「INF みたいな物」 ってのは、つまり数値表現の中の特殊な状態って意味で、みたいな物ってこと
>>821 三角関数について勉強しなおせ。
浮動小数点演算で例外が発生してるのでそれ以上計算しても無駄。
対策としては、そもそもそのような値が出てこない用に呼び出し前に場合分けをする。
826 :
821 :2010/12/13(月) 11:22:56
float dot; dot = D3DXVec3Dot(&now_vec,&eye_vec); angle = acos(dot); とすると、今のところ問題なく動くようになりました(・_・ ちなみに、dotには1.000000が入ってきていました
827 :
821 :2010/12/13(月) 11:43:03
828 :
821 :2010/12/13(月) 12:15:00
1.0000001が入ってくる場合があって、そのときに問題が発生しました。 桁落ちしていたようです 回りくどい対策をするのはいやなので、とりあえずfloatをdoubleに変えて対策してみます
830 :
821 :2010/12/13(月) 13:16:19
if(D3DXVec3Length(&(now_vec-eye_vec)) < 0.0001f) angledot = 0; else angledot = D3DXVec3Dot(&now_vec,&eye_vec); とりあえず、こんな感じにしてみました...
831 :
821 :2010/12/13(月) 13:27:48
angledot = 0 ↓ angledot = 1.0 でした
3Dモデルがアニメーションしており、例えば走っている時に、別のアクションをさせると 走っているモーションの値が維持されたままで、次にまた走るアニメーションを呼び出すと 途中から走っているアニメーションになってしまいます。 アニメーションの初期化はどうすれば出来るのでしょうか
どういう処理でどういうアニメーションをさせているのか
何を使っているのか等の初期設定すら他人に伝えられない人間が、 融通の利かないコンピュータのプログラムを書こうなど、到底無理な話だ。
じゃぁお前は最初の初期化はどうやってるんですか、と
アニメーションクリップが10秒定義されていたとして、5秒の所で中断して、 後日またそのアニメーションを再生したら5秒の所から再会しました。 0秒から開始するにはどうすればいいですか。 という質問だと思う。俺はDirectX知らないから後はまかせた。
directXを覚えちゃえばopenGLもすぐ分かったりしますか?
んなことない 3Dの概念は大体いっしょだけど ちょいちょい仕様の違いがあって引っかかる
一番基本的な相違は座標系が違うことかなー BulletやPhysXなんかは座標系がOpenGL仕様なので、 DirectXで使いたい場合は変換噛ませないといけない
>>837 3Dの概念は同じだし座標系が右手か左手かの違いだけ(だけっていうと言いすぎかもしれない)
どっちも使ってるけどGLのほうが覚えやすい印象はある。
でもGLはただのグラフィックライブラリだから、ゲーム楽に作りたいならDirectXのほうがいいと思う。
例えば行列にしろベクトルにしろ、DirectXはD3DXMATRIXとかD3DXVECTOR型が用意されてるけど
GLにはマトリックス型もベクトル型もないから自分で作らないといけない感じ。
すみません。 3Dモデル描画にSDK Sampleの加工品を使っています。 不透明モーション付きモデルはそれで事足りていましが、 半透明モーション付きモデルの再生を行いたく思い問題に。 真っ当に行くならVertex、IndexBufferなどからポリゴン情報を取得して全ソートして描画すべきなのでしょうが、 そこまでせずに「大体半透明」にしつつモデル制作の手間が肥大しない、良い簡略化(騙し)の手法は無いでしょうか? また、わざわざ全ソートしている作品をあまり見かけない気がするのですが、 (透けているものの、同一Objectらしき部分は裏面が消えうせている作品が多い気がします) 半透明はどう描画するのが定番なのでしょうか・・?
OpenGLと対応するのはDirect3Dだけじゃないの?
>>842 全てのポリゴンをソートではなく、オブジェクト単位でのソートとか
>>842 超適当でいいなら、不透明なものを全部描画してから半透明なものをZバッファ書き込み禁止で描画とか
>>845-846 そういう意味じゃないと思うぞ。
例えばキャラクター丸ごと半透明にした場合、オブジェクト単位でソートしても
重なる部分(腕->胴体)の描画順によってはきれいな半透明にならないので
ポリゴン単位でソートしないとまずいよねって話。
で、普通やらない。背面カリングして後はあきらめる。
半透明の描画は色々提案はされてるけど、根本的には現在のテクノロジーの限界だね。
http://hak.wablog.com/62.html
OpenGLと対応するのはDirect3Dのみ GLUTと対応するのはDXUTの3D周りのみ(3D以外を扱うDXUTってあったかどうか忘れた) -- win32+DirectX(割と全般)に対応するのはSDL(OpenGL含む) ※ただしSDLはLGPL
>>847 その問題は厄介そうだなぁ。
例えばいったん別のRenderingTargetに不透明で描画した後、
本来のフレームバッファに2D処理で合成すれば綺麗になるけど、
Zオーダーの処理が難しくなるね。
RenderTarget側で別のZバッファを持たせたとしても、
2枚のZバッファをうまく使って合成する処理なんて書けるものなの?
>>832 自前なのか何使ってるか分からないから概念だけ説明すると
歩きと走りはモーションが一周する速度が違うので、双方の再生速度を同時に変化させつつブレンドする必要がある
>>839 PhysXは変換かます必要ない
>>847 Aバッファの実装はまだですか
>>849 ZバッファのほかにマルチレンダーターゲットでZ値を書き出せば不可能ではないね
J.S.バッファ
J.S.ミル
854 :
デフォルトの名無しさん :2010/12/14(火) 14:51:13
シェーダーでメッシュを描画するとき エフェクトファイル内のグローバル変数にテクスチャを渡す形で描画したいんだけど デバイス->SetMaterial(); デバイス->SetTexture(); テクスチャ->DrawSubset(); の最後の「テクスチャ->DrawSubset();」は必要? これやらないとテクスチャが描画されないけど、文献の多くには「デバイス->SetTexture();」がテクスチャ描画だとしている。
テクスチャ->DrawSubset(); なんて存在しないでしょ メッシュ->DrawSubset(); ならあるけど とりあえずエフェクトつかってやるなら デバイス->SetMaterial(); デバイス->SetTexture(); は要らない(というかシェーダーに直接渡しているはず) DrawSubsetはどちらにしても要る DrawSubsetは内部で 頂点ストリームのセット、インデックスバッファのセット DrawIndexPrimitiveを呼び出して描画している
サンクス! デバイス->SetMaterial(); デバイス->SetTexture(); はクラス設計の問題でシェーダーに直接渡さないようにしてるんだけど問題あるかな?
>>851 半透明は1パス目でzだけレンダリングしてzバッファーx4枚で手前4つのオブジェクトを検出して
2パス目で見えている物体だけレンダリングすれば良い気がする。
シェーダー使えば今でもできると思うんだけど、このアルゴリズムではダメかな?
>>820 え、マジで?
ネットワークで配布するときも同様?
860 :
842 :2010/12/14(火) 21:08:32
>>847 の件、俺も自前のライブラリ作ってた時一瞬悩んだけど、
Vertex/IndexBufferを内部に一本で持って、各オブジェクトはそのバッファ内のオフセットで管理して、
単純に透過指定のマテリアルでまとめて描画で普通にクリアした
見た目のオブジェクト、管理上のオブジェクトが別だからって、バッファまで物理的に別にする必要無いので
その観点でさくっと解決した。そんな感じ。 ただし自前でモデル管理してないならお疲れ、としか言えない
別にID3DXMeshでやってても自前で管理できるぜ ID3DXMesh使ったサンプルって マテリアルごとのDrawSubsetが一般的だけど 実はもう1つアトリビュートテーブルってのを持ってて ここにDrawIndexedPrimitivesに必要な頂点オフセットや面数やらが格納される 面倒な読み込みまでをID3DXMeshに任せて そこからそのアトリビュートテーブルやら 頂点バッファインデックスバッファを抜いてきて使うと結構柔軟に対応できる
アニメーションモデルの逆再生がしたいのですが、 アニメーションコントローラーで実現できますか? (最終的には戻したり進めたりで、プルプルした動きをさせたい
>>861 で何がクリアできるのか分からないんだが・・・
コードイメージ伝わらないと初心者にはわからないよな
コードイメージは分かるけど
>>861 では
>>847 の解決になって無いと思うケド
重なる部分が発生しないレベルまで細分化する前提の話なのかな
キ選
SDKのskinnedmeshについて質問です ID3DXAnimationController::AdvanceTime( DOUBLE TimeDelta, LPD3DXANIMATIONCALLBACKHANDLER pCallbackHandler ); ここでアニメーションを進めていますが、SDKのサンプルのskinnedmesh.cpp内で どの変数に値を加算していっているのでしょうか
fElapsedTimeはDXUTで既に計算されてる前フレームからの経過時間 AdvanceTimeは絶対時間指定じゃなくて相対時間指定だからね AdvanceTimeの内部を知りたいって話なら無理な相談
そのアドバンスタイムの第一引数はどこの変数に加算しているのかが知りたいと思いました。 更新しているアニメーションを初期化(また1からアニメーション)したいのです そこでアドバンスタイムの第一引数の値をいじれれば出来るのかなと思いまして・・
そういうことがしたいなら SetTrackPosition
ありがとうございます、出来ました 関数名的にResetTimeなのかなと思っていました
どういたしまして わからないことがあったらまたおいで
お前誰だよw
875 :
デフォルトの名無しさん :2010/12/17(金) 03:28:22
質問していいっすかね?ちょっと手持ちPCが4年前の化石なので あの、D3D9 のテクスチャフォーマットなんですけど。ナニ使うのがベストなんですか。 なんか色々調べてみたんだけども、DX上位バージョンではRGBはGBRに統一されたんですよね? 古いのはサポート終了しただの、そこはDX内部の話だろうからどうでもいいんです。 ただ、新ハードGPUも古いフォーマットは切り捨てたとかあったので、さっぱり何がなんだか分からなくなりまして。 256色がとっくの昔に使えないのは知ってますけど、なんか Rgb16 Rgb32 も廃止ってあったので…。 たとえば、R5B6G5って新機種じゃもう使えないですか。一番ありそうな、A8R8G8B8 も無理? どうせDX上位バージョンがD3D9の旧形式から変換を勝手にやってくれると思うんですけど(たぶん) でも、RGBを自前でビット操作しているアプリは、BGRに並べ替えないとアウトって書いてあったので、そこでつまずいてます。 新しいフォーマットを旧DXから選択肢に選べるわけもなく、何をどうやって互換の判定をしたらいいんでしょう。 一度何か書き込んで、取り出して、色成分を調べてから処理を切り替えればよい?つーかそんな面倒が本当に必要? それとも、なにか思いっきり勘違いというか見当違いな心配をしていますか? 長い質問すいません。読んでくれた方、助けてください。
ん〜、いい心配だと思うよ〜。
878 :
875 :2010/12/17(金) 15:02:01
ありがとうございます。それ見た感じ、ほとんどアウトですか・・・。 でもたぶん聞きたい事がそれとちょっと違うんです。 たぶん、それはDX9から10への「移植」ですよね。つまりDX9自体を使わずにDX10デバイスで作りなおす場合の。 個人的に作り直す気はないんです。DX9のまま、HEL上で動いてくれればいいんです。 HALなら当然デバイスに依存するのは分かるんですけど、HELでもバイト順序は新しいハードに依存するんでしょうか。 あくまでDX9のDLLさえ入れておけば、古い形式で指定できて、HEL上にテクスチャをロードした場合 バイト順序も古いまま、オリジナルで保持されますか。 自PCはもちろん、周囲にも会社にもVistaとWindows7が一人もおらず全員XPなので、確認できないんです。 あればとっくに自己解決するんですけど・・・
そもそもHELなんてDirect3D7以前の話なんだが、 いったいどれだけタイムスリップしているんだ? Direct3D8、9、10、11にもHELなんて存在していないぞ。
DX9で普通に作ってVista/7で普通に動けばよし 普通に作って動かなかったらそのとき考えればいいじゃない
どうでも良い事で悩んでるな 何のためのDirectXだと思ってるんだ
884 :
875 :2010/12/17(金) 20:42:01
>>879 えっ?それはどういうこと??HELはHELで普通にありますよ。初心者だからってバカにしてます?
ちなみに俺のPCはオンボードのショボイやつなんで、9.0cでさえDirectDraw以外は完全にHELですけど何か。
Windows7でも、一旦HELで吸収してソフトウェアレンダリングされてるから2Dが重くなったんですよね(たしか)
俺がタイムスリップしてるんですか?テキトーに言ってませんか?
お前がおかしい
HELってハードウエアエミュレーションだっけ?DXのソフト実行モードかな。
これはあれだな。 間違ったことをさも当然のようにかつ挑発的に書くことで 豚オタどもが鬼の首とったかのように本当のことを教えてくれるとか思ってる輩だな。
888 :
875 :2010/12/17(金) 21:31:43
>>886 そうです。ハードウェアアクセラレータをOFFにした場合の。
初期化コードで、HARDWAREとSOFTWAREとVERTEXHARD/SOFTをtry〜catchで選択設定するでしょ。
HALとHELの分岐処理。それをせずにコード組んでる人なんていないと思うし、
なのに「無い」とか「おかしい」とか言われちゃうしなぁ。
なんか、ちゃんと知ってる人々がちゃんと答えてくれると思ってたから、がっかり。
ちゃんとした場所の人々に聞くことにします。
マルチポストで通報してやんよ
>>888 そっちを目的で組む人は早々いないから、答えられないんじゃない?
全力で作ったらHELだと重すぎるでしょ。
ま、君が最初の人柱だ。ってことかもね。
>>888 なんか突っ込むのも恥ずかしいが、それはHELじゃない
馬鹿は放っておけばいいんじゃない?
Direct3D9の話をしているかと思えば、Direct3D7を最後に廃止されたHELの話を出してきたり、 頂点計算をCPU側に行わせる設定をHELと言ったり、さっぱり意味不明。
そもそもDirect3D9自体R5B6G5やA8R8G8B8に対応している保証はない。 フォーマットの保証がついたのはDirect3D10以降から。
ソフトウェアT&Lの話だったの?
ソフトウェアT&LをHELと勘違いして突っ込まれたら逆ギレした馬鹿のお話
897 :
887 :2010/12/17(金) 23:18:10
このように続々と突っ込みが寄せられ
>>875 はまんまと情報を得るわけです
まさにHellだな
REFと間(略
一回覚えた概念を修正するのって大変だよね。拡張は楽だけど。
ID出ないからやりたい放題だな
なんだまたバカが沸いたのか
すみません。DirectX9で半透明モデルの描画を 両面描画モードと D3DRS_ALPHATESTENABLE のTRUEで行っているのですが、 モデルが輝く様に真っ白になってしまいます。(何かの設定を勘違いしてるハズですよね・・) これをテクスチャの色や模様が“出来るだけ”しっかり見えるようにするにはどうすれば良いでしょうか? ググって自己解決を目指していますが中々良い情報を見つけきれず、ご助言頂けますと幸いです。
ライティングの設定は?
とりあえず半透明じゃないときはちゃんと表示できてるの?
906 :
903 :2010/12/18(土) 10:02:25
>>904 light.Type = D3DLIGHT_DIRECTIONAL; light.Direction = D3DXVECTOR3(-1, -20, 0);
light.Diffuse.r = 1.0f; light.Diffuse.g = 0.5f; ight.Diffuse.b = 0.5f; という設定になっておりました。
>>905 はい。他のモデルはライトでの影などは描画しておらず、テクスチャ色だけで正常描画されています。
輝くように真っ白になっていたのですが調べていると「アルファブレンド係数」の設定で
D3DBLEND_SRCALPHA、D3DBLEND_DESTALPHAだと輝く様に真っ白
D3DBLEND_INVSRCALPHAだとモデルが全く見えず(完全透明?)
D3DBLEND_SRCCOLORだと輝く程ではない加算ぎみに半透明 という結果でした。
加算合成ではなく色合いを後ろのモデルと色と足して2で割った色にしたい という感じでしょうか…もう少し色々試してみます。
モデルデータにα値を設定してないんじゃ……
マテリアルがみあたらねぇ アルファは計算式わかってるのか?
それとRenderStateのライト設定云々 他色々考えられるけど面倒臭くて聞けねぇ確認項目が多すぎる すでに動いてるサンプルを手本にして自分でなんとかしろ
両面なのにライティングを有効している時点で間違い
えっ
そもそもどこでαをイジって半透明にしようとしてるんだろうか? 頂点カラー? マテリアル? テクスチャ? とりあえず、コレをやって結果をみてくれ デバイス->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); デバイス->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); デバイス->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
>light.Direction = D3DXVECTOR3(-1, -20, 0); 正規化はしといたほうがいい
正規化したほうがいいですね
両面でライティングすると、裏側の法線が逆転してまともに描画できないのは分かっているのか?
へー? 両面描画すると 面の描画順の問題でZバッファの整合性が取れなくなることはあるけど 法線云々なんて聞いたこと無いわ
でもシェーダ通すと法線が頂点にくっついてるから黒くしかならんよーな気がするね 固定シェーダだとうまくやってくれんのかな?
>>52 :デフォルトの名無しさん:2010/11/01(月) 00:37:52
>理解って、高校で習った筈だろ。
>数Cだっけ?
「行列」は旧数Uの中の「代数・幾何」の中に入ってた記憶がある。
「基礎解析」(正関数までの微積)の方ではない。
919 :
903 :2010/12/19(日) 03:14:23
>>907 モデルには無しでブレンドできないかと思っておりました;
>>908 久しぶりに描画関係を触りテクスチャステージステートの存在すら忘れておりました…orz
>>909 他のα抜きモデルはテクスチャでしており、SetRenderStateは触っていないと気付きました;
>>910 両面でライティングは駄目なのですね;
>>912 やってみた所普通に不透明描画でした。モデルのDiffuseのaを変えても変化は無く…色々勉強不足を実感しました;
>>913 >>914 ご指摘ありがとうございます。ライトを正規化するよう書き換えました。
>>915 >>916 その様な事になる?のですね。今後ライトを触る場合頭に入れて用心します。
>>917 HLSLと固定シェーダ両方混在気味なので気になりますが…注意しようと思います。
今回はテクスチャに透明度を埋め込んで一応の解決に至りました。
(αの不要なテクスチャまでα計算してるのかもと思うと少々気が重いですが…)
沢山のご助言ありがとうございました。TextureStageStateから復習しなければ・・ですね。
色々と勉強になるお話、ありがとうございました。
固定シェーダは確認項目多すぎ
固定シェーダで動かしたときのチェックリストが必要だな
どうせしばらくは使う奴減らないだろうし
>>907-917 までのような項目を躓くたびに確認しないといけない
開発効率悪すぎ
何が起こってるのかわからなすぎ
そもそも固定シェーダなど存在しない
directx11の頂点バッファを動的に書き換えられる設定で作成し、 (D3D11_USAGE_DYNAMICとD3D11_CPU_ACCESS_WRITE) 頂点が typedef struct{ Vector4 Pos; Vector2 Tex; }Vertex;(16 + 8 = 24バイト) で、毎フレームロックしてアンロックを繰り返しました ※描画はしていない 三角形を 500個作った場合 fps700前後 1000個作った場合 fps360前後 2000個作った場合 fps150前後 何もしないでclearとpresentだけ fps8000前後 ずいぶん遅いなという印象になったのですが、 これは変な値ですか? それとも頂点のロックはdynamic設定でもこのくらい重いものですか? Drawの回数を減らして3角形を描画したいためにロックしてまとめてdrawしようとしたのが 目的です
そんな時の関数ですよ。
924 :
922 :2010/12/19(日) 11:59:49
925 :
922 :2010/12/19(日) 12:25:56
書き忘れてました win7 メモリ2G CPU Intel(R) Core(TM)2 Duo CPU E8400 @ 3.00GHz (2 CPUs), ~3.0GHz NVIDIA GeForce GTX 460 です
大量に繰り返すのなら、一つのバッファに一気に書いて、 キューに投入するときにバッファのインデックスを指定すればいい。
927 :
922 :2010/12/19(日) 14:05:57
>>926 ありがとうございます。
しかし今は頂点バッファがひとつだけなのでそれ以前の箇所なのです・・・
インデックスを指定は
ID3D11DeviceContext::Draw
ID3D11DeviceContext::DrawIndexed
などのStartIndexLocation、StartVertexLocation
での指定ですよね?
3角形の数だけLockしてるならそんなもん 1フレームに1Lockだけなら いくら大量の頂点データをコピーしたとしても その数値ありえないからどっかおかしい
FPSの測り方がおかしいとか。
バッファが一つなのに1フレームでロックを繰り返すのがそもそもおかしい。 確かにそれ以前の問題だ。
931 :
922 :2010/12/19(日) 15:34:19
すみません説明の仕方が悪かったです ロックは1フレームに1回です
932 :
922 :2010/12/19(日) 15:37:09
>>928 ありがとうございます、なるほど・・・他の原因を探ってみようとおもいます
933 :
922 :2010/12/19(日) 16:02:17
すみません、直前に呼び出していたソートが原因でした・・・ 最強にバカだったようです ちょっと別スレ逝ってきます ちなみに 2000頂点ロックしても 1000fpsでました 答えてくださった方々に感謝申し上げます
934 :
922 :2010/12/19(日) 17:51:37
935 :
デフォルトの名無しさん :2010/12/19(日) 18:47:32
スキンメッシュのマトリックス変換って外でやるよりシェーダー内でやったほうが速い?
それ単体を比べただけなら大差はないけど 後々、やりたい事が増えた時のために GPUに投げられる部分は投げちゃってCPUの空き時間を増やした方がいいよ
>>935 CPUとGPUが具体的に何なのか分からないのに答えられるわけがない。
間抜けな質問を書く前に、その程度のことも考えられないのか?
>>937 そんな厳密に答えなくていいんだよ。
質問者もそこまで求めてないの。
自閉症かなんかで理解出来ない病気なの?
>>935 この時期は外でやると寒いしお勧めしない。
不覚にもワロタ
>>935 スキンメッシュで描画する個数分だけ頂点をグラボに流し込まないといけないけど
その対象の環境と動かしてるゲームで測ってみないとなんともいえないな
大してたくさん描画してないんじゃ気にするだけ無駄だしね
○○無双系のもん作ったら超遅くなるだろうけどね
ここで設計の相談するとスレチって言われる? じゃあどこですればいいのよ
ゲ製作板
さよなら
そもそもこのスレが板違い 次スレはゲ製作板でいいよな?
以前は両方にあったけど 統合されて(向こうが自然消滅して)ココだけになった ここが板違いならム板の半数のスレが板違いになるぞ
スレタイ的には全然まったく板違いじゃないんだが、 どうも 「DirectX」 でかつ 「初心者」 と付くとコーディング以外の話に興味があるような怪しい人が 集まって来やすいとは思う。 だからゲ製行け、みたいな話になる ライブラリ以前の言語初心者とかはここ来るより前にするべき事あるよな、みたいなのも
テンプレに関連スレを記述する程度でいいと思う そもそも純粋にプログラムの話題はこっちでいいだろう あっちはゲームが絡んでこその板だろうし
板だろうし
ふと思ったんだけど、世間の DirectX 関係の解説サイトって、あんまり stl や boost 使ってる所無いよな スマポ使わずに SAFE_RELEASE マクロとかだし。 単純な文字列さえMSマクロのまんまだし。 なんとなく不思議な感じだ
NHKでチラっと映ったソースはSTLを使ってたな ちなみに今夜24:15にNHK総合で再放送だ
stl も boost も普段 DirectX以外のコードを C++ で書いてる時普通に使ってる物だから 俺も当たり前に使ってるけど、例えばこんな感じのスマポを自分で書いた所でたいした手間じゃないので、 template<typename T> class DXPtr { T *ptr; public: DXPtr(T *p) { ptr = p; } ~DXPtr() { ptr->Release(); delete ptr; ptr = NULL; } T* operator->() { return ptr; } }; //IDirect3DVertexBuffer9* vb; の代わりに //DXPtr<IDirect3DVertexBuffer9> vb を使う みたいにしてもいいし、std::vectorにぶち込む時には、カスタムデリータ付きの既存のスマポ使ってもいいしと思った
NULLの意味がないとかどーでもいい所が気になってしまう人は スマポとか向いてないんだろうな
俺なんで NULL 足したんだろうなww
NULLぽ
そう言った癖はいい事だと思うぞ
>>950 普通はサンプルとして載せるコードには、API以外の知識が必要がないように気を使って書く。
行数は短く、処理の流れは可能な限り上から下に順番に流れるようにするので、classの使用も控えて、
グローバル変数を多用するようになる。
サンプルコードを見る人はコピペしたいんじゃなくて、APIを呼ぶタイミングや順番を見たいだけだから、
必要のない情報は可能な限り排除すべき。
それを分かってない奴が、猫でもわかる〜とかのコードにケチ付けてるけど、APIの使い方の例としての
コードはあれでいい。
あと、Direct3DのCOMの使い方だと、スマートポインタってあんまり恩恵ないと思う。
中級者向けの解説サイトが少ないと思う
スマートポインタの恩恵はあるだろう intrusive_ptr とかまさに
まるぺけさんのとこは比較的スマポつかってたような
まるぺけは入門向けって言うより ある程度分かってる人が「あぁ、なるほど」って思える記事が多いんじゃないか?
STLを使う方が入門者向けだろう 簡単簡潔にするためのものなんだから
>>963 Direct3D9でいえば
xファイル読み書きしてぼちぼちライティング処理やったり、
関節処理実装したり、
デバイスロスト問題でヒーヒー言ったりが中級じゃないかね。
directx9でシェーダーで描画してるつもりだけど、固定機能パイプラインで描画されてるのかシェーダーで描画されてるのかいまいちわからない。 確認する方法ってありますか?
>>965 シェーダーの出力を真っ黒にしてみる
1行加えるだけでできるだろう
質問です。 D3DXMatrixPerspectiveFovLHで描画したオブジェクトと D3DXMatrixOrthoLHで描画したオブジェクトが 同じシーンに混在してても問題ってないでしょうか?(Zバッファとか)
>>957 >普通はサンプルとして載せるコードには、API以外の知識が必要がないように気を使って書く。
実際、これに尽きるんだけどな。ただスマポの恩恵無いってのはあり得ないけども
HLSLの入門サイトってあります? 演算子とか組み方とか載ってるようなやつ
>>962 それは無い。std::cout や std::string みたいな物しか想像してないとそうも思えるけど、
実際標準ライブラリや準標準の boost とかスマポやイテレータ/ストリームだけじゃないから
それらの挙動を理解しないで、最終的に生の内容に取り出すような時、あるいは駆使したロジックを書くとき、
それらのテンプレートライブラリの挙動をある程度理解せずに変な記述すると、あっと言う間に意味フなエラーが何百も吐き出されて
入門者じゃ手に負えなくなると思うよ。 普段使ってる人間なら過去に何度も見ているはず。それを思えばその台詞は間違っても言えない
>>967 大丈夫だ、問題ない
途中の行列演算が変化するだけ。
射影後はすべて、
最終的なクリップ座標系(-1 < x < 1,-1 < y < 1,0 < z < 1の空間)
に移動する。2Dのものならzをznにしておけばzテストで落ちることはない
>>970 boostやそれ以外はSTLに関係無いだろ
>>972 ありがとうございます
安心して使えます
XNAってOOなクラスがちゃんと用意されてて便利そうだなぁ
XNAはDirect9しか使わないから ここで言うサンプルよか簡単なのは あたり前
何重にもくるまれた大切な赤ちゃんのようなXNA
980 :
デフォルトの名無しさん :2010/12/22(水) 08:16:20
次スレ立ててくる テンプレに何を追加すればおk?
Directx11にて、 HLSLでテクスチャを張るポリゴンと張らないポリゴンを切り替えるには、 パスを切り替えるしかありませんか? float4 PS(PS_INPUT In) : SV_Target { return In.Color; } float4 PSTex(PS_INPUT In) : SV_Target { return txDiffuse.Sample(samLinear,In.Tex) * In.Color; } と二つピクセルシェーダを用意しなければならいのは仕方ないですか?
>>982 if文つかえば定数を変更するだけでできるんではないかな?
どういう条件で切り替えるのかによりけり
985 :
982 :2010/12/22(水) 16:02:07
とりあえずテクスチャを張るか、張らないかだけなので、ps自体挿げ替えようとおもいます。 また状況が変わればifを使うのも一つと考えておきます。 ありがとうございました。
シェーダー内で制御構造とか遅くならない?
>>986 シェーダーでは分岐もループも静的に展開される。
>>988 ルールを変えるときは次スレ立てる前に確認するっていうのも追加しといて
正直どうでもいいと思った
そんな厳密にルールなんて決める必要ない ルールにしたがってたって気に入らないレスには解答しないし ルールから逸脱してても自分が気に入る話題には解答するし 本当に困ったちゃんは役に立たないルールを指摘して 自分の気に入らないやりとりを止めてしまう育ちの悪い糞ガキ
ルールは全員が意見を出し合って決めた内容なら納得もいくけど 個人がテキトーに追加できるこんな形ではあっても喧嘩の材料になるだけ
まぁルールってのは、本当にどうしようもない状況を回避する為のもんだから
それと最近明らかに回答するレベルにない奴がとんちんかんなレスしてるから注意したほうがいい 前はいなかったから最近来た奴
とりあえずうめ
追加したルール内容は賛成だけど、勝手に追加するのはまずいな。
テンプレ変更前はスレに貼り付けてこれでいい?って聞くのが普通だろ そういう根回しが出来ないからコミュ能力がないって言われるんだよ
埋め
1000ならちんぽ晒す
やめれ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。