【C++】 DirectX初心者質問スレ Part22 【C】
※回答する人も、質問する人も必ず読んでください
これらに当てはまる人のための質問スレです。
1.C/C++は多少理解している。
2.最近DirectXを始めたばかり
3.SDKを見ても、Googleで検索しても、いまいち理解できない人
4.余計な雑談は不要ですよ
【 回答してくださる方 】
・ できるだけ優しく質問に答えてあげてください。
・ 優しく教えるのが嫌でしたら、解決するためのヒントだけでも結構です。
「ググれ」「SDK見れ」以外の回答でおながいします。
・ 神ですら理解不能な質問は無視して下さい。
【 質問する方 】
・ どんな事で躓いているのか明確にしよう。
・ 長くならないなら躓いている部分のコードを晒してみれ。
・ 解決した場合、お礼を言うのは当然だが、何をどうしたら解決したかを明確に書こう。
・ 回答して貰ったら、出来るだけお礼もしよう。
【C++】 DirectX初心者質問スレ Part21 【C】
http://pc11.2ch.net/test/read.cgi/tech/1229078397/
頂点フォーマットはD3DFVF_XYZRHWってことでいいのかい?
5 :
デフォルトの名無しさん :2009/02/28(土) 11:44:28
directx9.0bがインストールされているPCって何年前くらいのですか? 学校のパソコンが全部9.0bなのでD3DX関数を使ったアプリを起動すると d3dx_xx.dllがありませんと出ます
>>4 ポリゴンの位置座標をワールド空間で扱うなら、サイズもワールド空間に変換しないとだめね。
(スクリーン上での幅が、ワールドではいくつになるか計算。)
元々のポリゴンの幅が2.0(-1.0〜1.0)だから、(ワールド幅 / 2.0)倍ね。
D3DXMATRIXA16 matMod;
D3DXVECTOR3 p1, p2;
CalcScreenToWorld(&p1, 0, 0, 0, 640, 480, &matView, &matProj);
CalcScreenToWorld(&p2, 256, 256, 0, 640, 480, &matView, &matProj);
float worldWidth = p2.x - p1.x;
float worldHeight = -(p2.y - p1.y);
D3DXMatrixScaling(&matMod, worldWidth / 2.0f, worldHeight / 2.0f, 1.0f);
matScale = matMod * matScale;
単に等倍表示しただけなら、正射影にすれば、CalcScreenToWorld とかいらなくなるわよ。
D3DXMatrixOrthoOffCenterLH( &matProj, 0, vp.Width, vp.Height, 0, 5.0f, 100.0f );
D3DFVF_XYZRHW でもできるけど、SetTransform とか使えないモードだから注意ね。
7 :
デフォルトの名無しさん :2009/02/28(土) 11:54:19
d3dx9_37.dll に入っている代表的な関数は何がありますか?
関係ない D3DX関数を使っていると November2007でコンパイルしている場合d3dx9_37.dllが必要 August2007でコンパイルしている場合 それより後にでているd3dx9_37.dllがあったとしてもダメでd3dx9_35.dllが必要
D3DXがスタティックライブラリだった最後のバージョンってOctober2004くらいだっけ? どうしても気になるならそっち使えばいいんじゃね
>>6 拡大率の方にも必要だったのですね、この方法で出来ました。
ありがとうございます。
拡大回転もやりたいので正射影ではダメなんです。
それでもう一点気づいたのですが、
CalcScreenToWorld使ってるとX軸やY軸の回転で、
見えない所が出てしまうんですね…。
スクリーン座標や拡大率を保ったまま回転させて、
画像の全範囲を表示する方法はあるのでしょうか?
>>9 December2004もスタティックでいけました。
>>10 ポリゴンが欠けるのは、回転した部分がニア平面より手前に来るからね。
CalcScreenToWorld の引数 fZ を それぞれ 0.5f にすればとりあえず直るわよ。
>>12 なるほど、0か1かでしか考えてなかったのがダメだったのですね。
本当に何から何まで本当にありがとうございます。
おかげさまで思い通りの挙動をさせる事が出来ました。
14 :
デフォルトの名無しさん :2009/02/28(土) 16:17:58
Y軸回転のみするモデルに穴があり、そこだけヒットを無くし 穴から落ちるような処理を作りたいのですが 当然、穴も回転するのですが 回転後の穴の座標を取得するにはどうすれば良いのでしょうか?
15 :
デフォルトの名無しさん :2009/02/28(土) 16:20:15
すみません、Hitの方法は
16 :
デフォルトの名無しさん :2009/02/28(土) 16:22:56
また間違えて書きこんでしまった……。すいません。 Hitの方法は、Y軸回転のみするモデルはAABBであたり判定を行い 穴の部分は球でのあたり判定を行うつもりです。 2重の当たり判定を行い、穴から落ちるような処理を作ろうとしています。
球の中心座標をモデルのローカル座標に直して モデルと同じ回転行列を掛けるだけじゃ?
18 :
13 :2009/02/28(土) 22:20:37
度々すみません。 回転や拡大の中心座標を変えたいのですが、 ポリゴンの場合どの部分がそれに当たるのでしょうか?
20 :
13 :2009/02/28(土) 22:40:39
0が中心位置
22 :
デフォルトの名無しさん :2009/03/01(日) 09:52:34
>>19 返事が遅れました。申し訳ありません。
>モデルのローカル座標に直して
という意味がわかりません……。
しかし回転、移動の変換行列をかけてみたら解決できました。
ありがとうございます!
もうひとつ質問なのですが、
この場合って、モデルのローカル座標の実際の数値を調べて、
中心位置を出さなければなりませんが、
他にスマートな方法はあるのでしょうか?
あたり判定用のモデルを読み込むとかですかね?
データの中身をみないで結果が割り出せるとは、どんな魔法のことだ?
モデルを作った人間ならどこが中心かなんか分かるだろう もしくは、この位置に穴を開けてくれとプログラマーがデザイナーに頼むもの
二つあるマトリクスから、その二つの回転角度を得るのってどういう計算すれば取る事出来ますか? スケールはないものと考えます。 宜しくお願い致します。
二つのベクトルが成す角度の求め方なら昔高校でやったような気がするけど思い出せない……
>>25 // 行列が2つあるとしたら
D3DXMATRIX m, n;
D3DXMatrixRotationY(&m, D3DXToRadian(20));
D3DXMatrixRotationY(&n, D3DXToRadian(50));
// m から n への回転行列 ( inv(m)*n ) を作って、
D3DXMATRIX im, imn;
D3DXMatrixInverse(&im, NULL, &m);
imn = im * n;
// それをクォータニオンに変換して
D3DXQUATERNION q;
D3DXQuaternionRotationMatrix(&q, &imn);
// 回転角を求めれば終わり。
D3DXVECTOR3 axis;
float angle;
D3DXQuaternionToAxisAngle(&q, &axis, &angle);
angle = D3DXToDegree(angle); // ほぼ30ね。
28 :
27 :2009/03/01(日) 17:27:43
というか、m,nをそれぞれクォータニオンにした方が速いわね。 D3DXMATRIX m, n; D3DXMatrixRotationY(&m, D3DXToRadian(20)); D3DXMatrixRotationY(&n, D3DXToRadian(50)); D3DXQUATERNION qm, qim, qn; D3DXQuaternionRotationMatrix(&qm, &m); D3DXQuaternionRotationMatrix(&qn, &n); D3DXQuaternionInverse(&qim, &qm); D3DXQuaternionMultiply(&q, &qim, &qn); D3DXVECTOR3 axis; float angle; D3DXQuaternionToAxisAngle(&q, &axis, &angle); angle = D3DXToDegree(angle);
29 :
25 :2009/03/01(日) 21:24:13
DirectMusicでBGMを流すと同時に効果音を鳴らすってできますか? 今やっているのですがどうも片方しかできなくて。。。
HRESULT CDXMusic::PlayMusic(DWORD index) { // 演奏中であれば戻る if(m_performance->IsPlaying(m_segment[index], NULL) == S_OK) { return E_FAIL; } m_performance->PlaySegmentEx(m_segment[index], NULL, NULL, 0, 0, NULL, NULL, NULL); return S_OK; } 楽曲を3つ読み込ませて再生させているのですが 1を再生中に2を再生すると1が消えてしまいます 原因エスパーしてもらえませんか;;
何故まずヘルプを読まない? 使い方を確認しない?
すみませんヘルプ読みました 要するにDirectMusicは プライマリ セグメントは、一度に 1 つだけ演奏できる。再生のためにプライマリ セグメントを挿入するときは、演奏中のセグメントが終わった後でそのセグメントを演奏するように指定したり、現在のプライマリ セグメントを置き換えたりすることができる。 一方、セカンダリ セグメントは現在のプライマリ セグメント上で演奏され、任意の数のセカンダリ セグメントを同時に演奏できる。 DirectSoundはDirectMusicみたいにしなくても普通に同時に再生できるってことでしょうか? (入力フォーカスが移動する際に、アプリケーションはバッファの再生と停止を繰り返す必要はない。)
>>33 DirectSoundは波形を直截保持しているからDierectMusicのように面倒なことをしなくても
同時に再生できるよ。
HLSLでシェーダを書いているのですが、このポリゴンを「加算合成」するのか「半透明描画するのか」はシェーダ側では決められないのでしょうか?
ついで
>>9 >>11 スタティックな頃には、Xファイル周りで致命的なバグがあるのでやめたほうがいいです
でかいXファイルを読むとメモリー破壊されます(DirectX付属のサンプルソースですら)
>>36 お返事ありがとうございます。
どちらでも構いません。
できれば双方教えていただいてよいでしょうか?
38 :
デフォルトの名無しさん :2009/03/03(火) 08:50:33
s
39 :
デフォルトの名無しさん :2009/03/03(火) 09:03:47
40 :
35 :2009/03/03(火) 11:57:44
昨日から
>>35 の件について探し回っているのですが、それっぽいものが一向に見つかりません。
どなたかわかる方いらっしゃいましたら、アドバイスお願いいたします
テクニック内でレンダリングステートを変更して 半透明用テクニック、加算合成用テクニックを作るとかじゃだめなの?
>>41 お返事ありがとうございます。
HLSLのテクニック定義の部分でレンダリングステートが変更できるのですか?
その方法が、まさに知りたかったものだと思われます。
technique Test
{
pass P0
{
VertexShader = (vsTexture);
PixelShader = (psTexture);
}
pass P1
{
VertexShader = (vsNoTexture);
PixelShader = (psNoTexture);
}
}
現状こんな書き方なのですが、レンダリングステートを書き換える記述法(が書いてあるMSDNのページとかでもいいです)を教えていただけないでしょうか。
よろしくお願いします
>>44 素晴らしい、それでそれです。
一覧表がないなーと思いながら、C#版とかで「どうやらC#版の設定プロパティと名前が一緒らしいな」とか推測しながらいじってましたw
これで、描画周りが完全にプログラムから切り離せました。
嬉しい。
46 :
デフォルトの名無しさん :2009/03/03(火) 16:24:45
(MDXとXNAは過疎化が酷いのでこちらで質問させてください。) MDXを勉強中のプログラマ(C++/C#)です。今は土日の趣味でやってます。 MDXは情報が少ないため、UnmanagedかXNAに移行を考えていまが以下の点で悩んでいます。 Unmanage C++がめんどい XNA フレームワーク導入めんどい 出来ればMDX2.0リリースか、XNAがOS標準搭載にならないかと・・・ Xbox用途以外ではUnmanagedに進むのが妥当なのでしょうか? 同じような経験された方、最終的にどうされましたか?
いや、Unmanagedの話ばっかりしてるここで聞かれてもw 別によっぽどカリカリにチューンしたゲームを作りたいってことでもなきゃ、XNAでいいんじゃない? ただ、それを不特定多数に売ったり、配ったりするつもりなら、XNAの実行環境のインスコを促すのは敷居がかなり高いとだけ。
48 :
46 :2009/03/03(火) 16:37:06
>>47 早々のレスどうもです。
やっぱりXNAは敷居高いですよね。OSというかDirectXに標準搭載されれば敷居が低いのですが・・・
どうもありがとうございます。自分もUnmanaged方針に変えます。
両方やればいいんだよ 楽しいぞ
50 :
46 :2009/03/03(火) 21:39:14
>>49 いや〜個人的にはそうなんですよね。C++/CLIでUnmanaged。
ただ、将来的に業務用ツール用にDirectX検討しているんですが、
フレームワーク導入は敷居が・・・(.net or vistaですら厳しい!DirectXって何って感じです。)
元Javaな人にはC#しか・・・
なんでもないです。愚痴ってすいません。
俺もツール作っててインタフェースはDirectXだけど、C#+MDXでやってる。 MDX自体は情報少ないけど、DirectX/C++からの脳内翻訳が効くし、 メモリリーク云々を考えるとマネージは外せないという結論に至った。 どうしても情報が無くて困った時はグーグルのコードサーチを使うといいよ。 web検索で2件とかしかでてこないような情報でもそれを使用したソースが ズバリでてくる。ただライセンスには注意な。
52 :
46 :2009/03/03(火) 23:30:31
>>51 レスサンクスです。
私も苦労の末(?)Unmaged脳内変換が出来るようになりました。
たいていは同じような書き方なのでなんとか。ほんと無駄な技術。
メモリリーク面倒ですよね。やっぱりC#楽ですよね・・・
ありがとうございます。けど10&11を見据えてUnmanagedがんがります。
そういえば.NETのコードは逆コンパイルできるから気を付けないといけない ネットで見つけてきたコードは高確率で訴訟用に公開してる。このへんは誰でも気づくんだけど 注意しなきゃいけないのは元コードを自演転用で無料公開してる場合があるということ
54 :
デフォルトの名無しさん :2009/03/04(水) 07:56:15
>>52 メモリリークなんて起きるときは大抵どっかがおかしい
おかしいのに無理に進むと余計におかしくなる
別にメモリリークを解決してくれてるわけじゃなくて
単に落ちないだけだろ
55 :
デフォルトの名無しさん :2009/03/04(水) 08:11:47
c#はusingで破棄してくれから便利。
>>52 ちょっとDirectXと離れるかもしれんが
shared_ptr
CComPtr
を使った上でメモリーリークするのか?
この2つを使えば、メモリーリークなんて(循環参照くらいしか)ないだろう。
もし何かミスって出したとしても、DirectXまわりはデバッガがリーク量を丁寧に出してくれるし
通常のメモリーについても
http://marupeke296.com/TIPS_No7_SearchMemoryLeak.html これで超簡単表示
C++はメモリー管理が〜とかいう人のほとんどは、shared_ptrとかそういうほぼ標準ともいわれているライブラリ群を知らないだけに思える
>>56 ほぼ標準と標準の間には大きな隔たりがあるんだぜ。
まずboostのインストールをしなきゃならん。
boostのインスコって、いまや公式いってEXEファイルDLしてきて、ダブルクリックすれば設定含めて全部終わるんだぜ それが嫌だとしても、shared_ptrもCComPtrもテンプレートだから、単体ヘッダファイルを持ってきてincludeすればおしまい もちろん標準とほぼ標準には雲泥の差があるが、リークが嫌なら5分くらいの手間はかけようよw
リークする貧相なプログラム技術を放置したままのほうがよっぽど危ない。 shared_ptrも万能ではないしまずはリークの検出修正が出来るように腕の磨くべき。 主観的にはboostみたいな非標準のものは出来る人間が楽をするために使うべきだと思う。
60 :
デフォルトの名無しさん :2009/03/04(水) 11:28:15
>> 39 oggをwaveに変換してセカンダリバッファにデータに渡したあと 一時的なデータを保持していた変数をSAFE_DELETE()してないからメモリがスタックしてるんじゃないか?
>>59 みたいな人間が、C++使いとして恥ずかしいです…。
そんな「C++を使いたいなら、まずは基礎力をもっとつけろやwwww」みたいな排他的な姿勢はアホくさい。
C++自体、メモリーリークするわ、GCないわ、スレッドが言語標準じゃないわと「今どきの言語」に比べたら貧弱。
継承されるクラスのデストラクタにはvirtualをつけるのがお約束!なんていうくだらない「お約束」も大量にある。
それを「使う人間の基礎力が〜」とかに転嫁してどーする
ここ質スレなのにすぐスレ違いの自己主張を始めるやつが現れるよな
初心者スレで、初心者に「お前のプログラム技術が貧弱だからだ」とか言っちゃうんだもんな それともDirectXのみ初心者で、プログラム技術自体は高い人間しか質問しちゃいけないのかっていう
だったらお前のスタンスで好きに回答しろ。 ただし別のスタンスで回答する奴もいる。 いちいち噛み付いて迷惑するのは質問者なんだよ。
言語なんか個人の自由 技量が無いなら使い手側に何のメリット無い、より高水準な言語を使っていればいい
Direct3Dにスプライトなど無い
つまらん! お前の話はつまらん!!
カーソルの移動量を調べたいんだけど APIの機能でカーソルの位置を調べて前のフレームとの差を取る方法だとカーソルが画面の端に来た時に移動しなくなって困るので DirectInputを使おうと思ってるんですが、これAPIでは解決できませんか?
カーソルの絶対座標はどうでもいいのか? 1フレームごとにSetCursorPosで画面の真ん中に移動させれば大体の用は果たすと思うが。
>>69 ありがとうございます
その方法でやってみます
71 :
デフォルトの名無しさん :2009/03/04(水) 14:37:06
http://toruweb.web.fc2.com/dm/2.html このサイトにあるDirectMusicによるogg再生のプログラムで
oggからwaveに変換した後セカンダリバッファに書き込むのですが
MidiとWaveの再生 / 終了処理と同じ処理をし、確保したメモリを解放します。
/* #define SAFE_RELEASE(p) if(p){p->Release();p=NULL;} */
SAFE_DELETE( lpWaveData );
とあるのですが
waveに変換してセカンダリバッファに書き込んだ後SAFE_DELETE()ではいけないのですか?
実際になってみたら落ちました
72 :
デフォルトの名無しさん :2009/03/04(水) 14:38:14
訂正:実際に書き込んだ後すぐにSAFE_DELETE()したら落ちました
73 :
デフォルトの名無しさん :2009/03/04(水) 15:41:08
ぶっちゃけストリーミング再生実装しないと 容量多いファイル再生すると落ちるよ・・・ そんなんも知らないの?
ソース
GPUを使ってサウンドエンジンを作るってどうやるの?
76 :
デフォルトの名無しさん :2009/03/04(水) 20:42:11
fxc.exeを使ってfxファイルをデバッグしてるんですが、コマンドプロンプトが使いにくいです。 このスレの方々はどうやってますか?
78 :
46 :2009/03/04(水) 23:09:18
46です。 皆さん色々アドバイスありがとうございます。 Boostとか非標準は会社での導入は難しいですね・・・規約を含めた運用変えるのに年単位でかかります。 個人ならOKでも、チームや部門では色々大変なのです。 9x,NT->2000,XP->2003sとかですでにてんやわんやなんで。 (ある程度の規模の会社はどこも同じとおもいますがw) もしかして純粋なソフトウェアハウスさんなら違うのかな? CComPtrは知らなかったので調べてみます。 激しくスレチになるでこれで失礼します! 今日は雪がまた降って大変でした。
DirectXを使ったゲームを作るのに初心者(BCBで簡単なアプリが作れる程度)にとって最適な開発環境って何ですか? VCとかVBとかBCBとか。
VC+イルリヒト
VC++ですか?
>>80 値段的にもランクがあると思うんだけど、なんでも大丈夫かな?
高いのは購入できないので。
>>81 Express editionでぐぐれ。 無料版がある。
つーかBCBは今となっては古いマイナー標準準拠度悪の三重苦なので、
DirectX抜きにしてもさっさとVCに乗り換えた方がいい。
ちなみに言語にこだわらないならたぶんC#とかの.NET系言語から呼び出す方が楽だと思う。
>>83 .NETって作ったアプリをインストールする環境にもフレームワークのインストールが必要ですよね?
ランタイムは極力不要な状態にしたいんだけどC#も似たような感じかな?
BCBはダメなのか。扱いやすいから気に入ってたんだけど残念。
>>82 テクスチャフィルタが掛けてあるから縁にアンチエイリアスがかかってる
g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_POINT );
g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_POINT );
g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_POINT );
としてフィルターを切るか
これだと拡大時に画像が荒くなるののでそれが嫌なら元画像にもよるけど
テクスチャアドレッシングモードを
g_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP );
g_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP );
とすれば消えるかもしれない
プロジェクトが入ってないからコンパイルしてないので結果は自分で見てね
>>85 こんな方法があったとは…、まさにビンゴです。
テクスチャの端を使わなかったり色々やってみたのですが、
上手くいかなかったので本当に助かりました。
プロジェクトを入れないならソースの頭に #pragma comment( lib, "dxerr.lib" ) #pragma comment( lib, "dxguid.lib" ) #pragma comment( lib, "d3d9.lib" ) #if defined(DEBUG) || defined(_DEBUG) #pragma comment( lib, "d3dx9d.lib" ) #else #pragma comment( lib, "d3dx9.lib" ) #endif #pragma comment( lib, "winmm.lib" ) と入れとくと見てくれる率があがるかもしれない
DirectX9.0SDKの最新を使ってPixelShader1.1などを使おうとすると、 ps_1_x is no longer supported というエラーが出てしまいます。 DirectX9.0ではすでにps1.xがサポート外になっているのは知っているのですが、 作っているゲームは古いグラボでも動けるようにしたいものです。 この場合、 PixelShader = compile ps_2_0 と書いたHLSLファイルと PixelShader = compile ps_1_1 と書いたHLSLファイルを両方用意しておかなければならないのでしょうか?
古いので動かしたいならシェーダーを使わないのが正解だろう。
90 :
デフォルトの名無しさん :2009/03/06(金) 01:10:12
ID3D10EffectPass::GetDesc(pDesc) でE_FAILが返り、pDescに何も代入されずに返ってきます。 この場合どういう原因が考えられるでしょうか?
>>88 D3DXSHADER_ENABLE_BACKWARDS_COMPATIBILITY
92 :
90 :2009/03/06(金) 01:49:17
D3DX10CreateEffectFromFile()でFXファイルを読み込んで、ID3D10Effectを作りました。ここではS_OKが 返ってます。その後D3D10_EFFECT_DESCを取得して中身をみてみると全てのメンバーが0でした。FXファイルを fxc.exeでコンパイルしてみると、mainエントリーがないといわれます。なので文法的には問題ないと おもっているのですが、、 こういう場合どうすればよいでしょうか?
なんか.xのアニメーションってやけにむずかしくね?
94 :
90 :2009/03/06(金) 02:36:10
一応解決したようです。 FXファイルのエンコーディングに原因があったようなのですが、よくわかりませんでした。 同じ内容のFXファイルを用意して、日本語のコメントを全部消してセーブして読み込ませたところ 問題なく動作しました。それまでは日本語のコメントが山ほど入っており、それをセーブする際には ユニコードでセーブするか?と聞かれてYESを選択してました。 これからはFXファイルに日本語コメントを使わないようにしようと思いますが、いったんFXファイルを ユニコードでセーブした後変更する方法が分からないのと、いまいちなにが問題なのか良く分からないので、 どなたか理由がわかる方いらっしゃったら教えてください。 ありがとうございました。
日本語コメントなんて普通に使ってるが・・・
全角空白じゃね?
97の誤爆失礼しました。
>>91 ありがとうございました。
情報があまりになく、英語MSDNまで調べにいくことになりました。日本語MSDNにすらのってないですね。
これを考えると、常に「なるべく最新のPS、VSとしてコンパイルしたい」という気がしますね。
同じコードでも、ps11としてコンパイルするのと、ps20としてコンパイルするのでは吐かれたコードの効率が違いましたし。
そういうオプションもないかな?と思い探してみましたが、無いようです。
みなさんはVS20, PS20の決め打ちでHLSLを書いているのでしょうか?
99 :
デフォルトの名無しさん :2009/03/07(土) 02:22:42
DirectX10のコードを書いているのですが、ウィンドウのクライアント領域を全く なくしてしまうと Device->ClearDepthStencilView() というコードが例外を出します。ID3D10DepthStencilViewをReleaseしようとしても だめなようです。ID3D10DepthStencilViewをReleaseする前にチェックしないとだめなことって どんなことがあるでしょうか?
ものすごく簡単な事だったらすいません。 家のパソコンはネットにつながっていないのですが、 買ってきたゲームがDirectX9以上が必要と書いてありました。 漫画喫茶で落としてインストールしようと思ったんですができません。 何か方法ありますか?
>>100 スレ違い
通常のインストーラはWebインストーラなので
DirectX End-User Runtimes (November 2008)を漫画喫茶で落として来い
もう二度と来るなよ
102 :
デフォルトの名無しさん :2009/03/07(土) 02:46:36
方法あります 本体をおとしてください
Xファイルのアニメーションについて詳しく書かれてるサイトある?
MSDNのサイトに書かれています
理論だけならまるぺけが詳しい ただしソースは無い(あるけど記事に沿ったものはない) そこを読みながら 結局SDKのサンプルのSkinnedMeshを1ステップずつデバックしながら どこで何をやってるのか地道に理解するのが一番の早道
お手軽に動くソースを欲しがるから難しく感じるんだよ どの順番でどの変数に何が読み込まれているのかをじっくり追っていけば そんなに難しいもんじゃない
HLSLについてなんですが、固定シェーダ機能のアルファ設定を AlphaBlendEnable = TRUE; SrcBlend = SRCALPHA; DestBlend = INVSRCALPHA; このようにした場合、色成分はアルファ値に応じた混合がなされるのは分かるのですが、 混合結果後のアルファチャンネルの値はどのようになるのでしょうか? 現在のレンダリング結果に対し、過去のレンダリング結果の蓄積をアルファ合成し続ける フィードバックエフェクト(残像っぽくなるやつで過去のアルファ値は0.5f〜0.9f)をしていると、 もともとがアルファ値1.0fのピクセル同士の混合後のアルファ値が1.0fではなく、少し低くなって 0.8fかそこらへんに下がってしまい、若干暗い絵になってしまいます。
α値がどうなるかはSetTextureStageState()で設定したとおりになる。
109 :
107 :2009/03/07(土) 13:11:59
>>108 アプリ側で設定してやるんですね。
ありがとうございました。
とあるゲーム作成の参考書どおりに設定を行ったところ 1>LINK : fatal error LNK1104: ファイル 'd3dx9.lib' を開くことができません。 といったエラーが表示されます サブシステムのパスは通しています ・インクルードファイル C:\Program Files\Microsoft DirectX SDK (April 2007)\Include C:\Program Files\Microsoft Platform SDK\Include ・ライブラリファイル C:\Program Files\Microsoft DirectX SDK (April 2007)\Lib C:\Program Files\Microsoft Platform SDK\Lib ちなみにApril 2007となっているのは雑誌と同様にしているからです
>>110 実際にそのフォルダ見てみればいいじゃない。
環境によるかもしれないが、その下にx86って無いか?
ちょっと質問です。 Microsoft DirectX SDK (November 2008)、DirectX9 を使って開発を行っています。 ところで、作ったアプリを動かすための必要環境を、「9.0c 以上」 ではなく 「9.0 以上」 まで下げたいのです。 どうすればこのアプリは、確実に 「必要環境: 9.0 以上」 と言えるようになるのでしょうか? たとえば、ピクセルシェーダ 3.0 を使ってしまうと 9.0c が必須になりそうなので 2.0 を使ったり、などはしています。 ですが、他の機能となると、どこまで使っていいのかが分かりません…。 SDK のバージョンを落とせばいいのかな?とも思ったのですが、どこまで落とせばいいのかも分からないし、 古すぎる SDK は簡単には手に入らないので、これも何か違っている気がします。 よろしくお願いします。
PS2.0でも9.0cが必須なんだが・・・。
ぶっちゃけ、古いSDKで開発するしかない 探せば簡単に見つかる
DirectX7お勧め。
古い SDK しかないですか…それっぽいのが見つかったので試してみます。 ありがとうございました。
みんな、Microsoft DirectX SDK (November 2008)のNovember 2008の部分が違うものを 3つも4つもインストールしてるんだぜ・・・
それ以前にどのOSとSPが、DirectXの下限バージョンなのかきちんと調べたのか? ターゲットOSを明確にした上での選択なのか甚だ疑問。
つーかDirectX9世代なら気にせずwebインストーラー添付して「入れてね☆」とか出しとけばいい。 下のサポートを考慮するならDirectX7やDirectX8を考慮するべし。
DirectX9cならインストーラなど付けなくても、 WindowsXPのSP2以降と明記しておけばいいだけ。 それ以前なら既にセキュリティパッチが打ち止めになっていて、 SPすら入れない奴をそもそもサポートする必要性もない。
こんにちは、識者の方々、哀れな初心者をお助けください。 <聞きたいこと> 環境によって、表示される画像が1ドット多く表示される32ピクセル表示する命令なのに、33ピクセル表示される感じ。 なぜ、これがおこるのか? この現象の回避方法は? <詳細> Vistaで2Dゲームを作成しています。 512×512のビットマップのうち、座標(0,0)から32×32のサイズの部分が画面の背景で、その32×32のサイズを画面に繰り返し描画しています。 開発マシン(Vista:解像度1280×800)では正常に表示されますがテストマシン(XP:解像度1024×768)で表示すると1ピクセル余計に画像が表示されていてしまいます。 開発はDiretX9で、表示はID3DXSprite::Drawでおこなっています。 下みたいな感じ g_pSprite->Begin(); g_pSprite->Draw(pTexture, &rect, //表示範囲 &D3DXVECTOR2(scale_x,scale_y), //拡大率 NULL,g_rotation, //回転 &D3DXVECTOR2(F(x),F(y)), D3DCOLOR_XRGB(255,255,255) ); g_pSprite->End(); 変数とかは察してください(笑) もし、なにかお分かりの方がいらっしゃれば、ぜひ、ご教授願います。よろしくお願います m(..)m
まずそれ以前に、SDKのヘルプに乗っているチュートリアルはすべて終わらせたのか?
123 :
112 :2009/03/08(日) 18:53:21
いろいろとご指摘ありがとうございます。 諸事情で DirectX9 は是非使いたいのです。 Windows2000 以降対応にしたいのですが、2000 には初期状態で 7.0 しか入っていないので、DirectX のインストーラは同梱させる予定です。 ただ、2000 には 9.0c はインストールできないと聞いたことがあるので、9.0 で動くようにしたかったのです。 このあたりの情報は検索してもなかなか見つからなくて…正直自信ないです。
124 :
121 :2009/03/08(日) 19:02:06
>112 一応みました。 ぐぐったりもしましたが、原因が分からず 質問させていただきました
>>123 9.0cは2000どころかD3DXのバージョンによっては98SEとかでも動くんだが。
2000でインストールできないってそれ割れOSなんじゃないの? 2kのは大分出回ったみたいだし
>>124 見るんじゃなく、一つ一つ動かして動作を確認しろ。
話はそれからだ。
128 :
121 :2009/03/08(日) 22:07:38
>127 ひとつだけ、教えてください。 わたしが、示したコードはおかしなところがありますか? わたしはおかしくないつもりだったのですが、 わたしのコードがおかしいから、動作を確認しろと アドバイスをいただいているのかどうか、気になっています。
1部じゃなくて全ソース晒して方がはやそう たぶん描画部分以外の問題の希ガス あとID3DXSpriteは内部でレンダリングステートや テクスチャーステージを勝手に変更してたりするから実際に見ないとたぶん分からん
>>128 スクリーンショットとって大きさ計ってみた?
132 :
121 :2009/03/09(月) 10:12:40
みなさんアドレスありがとうございます。 >129 勝手にサイズを変えるんですか、なるほどです。 今出先でソース晒せないので家に帰ったら晒します >131 いいえ、計っていません。こちらも家に帰ってから計ってみます!
133 :
121 :2009/03/09(月) 11:33:40
>>132 一言もサイズとは書いてないですね
勘違いしました
すみません。
なんつーか、FILTERをLINEARにしてましたとかいうオチじゃなかろうな・・・?
135 :
デフォルトの名無しさん :2009/03/09(月) 11:51:02
ブレンドステートってどういうときに使いますか? いまいち用途がわかりません。
αブレンドするときに使います。
137 :
デフォルトの名無しさん :2009/03/09(月) 11:54:55
ありがとうございます。 αブレンドと言われても全然わからない自分は、まだまた勉強不足ということですね。
まだまだというより、これから勉強始めるところじゃないの?
139 :
デフォルトの名無しさん :2009/03/09(月) 17:23:53
2Dのゲームプログラムを組んでます。 画面全体を揺らすプログラムを組みたいんですが、そういうサンプル無いでしょうか。 このAPI使えるよとかでも構いません。 表示してるテクスチャをすべて同時に動かすぐらいしか思い付かなかったんですが、 皆さんどんな感じで実装してるんでしょうか。 ドラクエでダメージを受けると画面が揺れますが、あんなかんじの演出を考えてます。 よろしくお願いしますm(__)mペコ
>>139 ウィンドー全体を揺らしちゃえよ
フルスクリーンでは無理だが
>>140 回答ありがとうございます。なるほど!参考になります。
フルスクリーンは、、、そうっすね。
142 :
デフォルトの名無しさん :2009/03/09(月) 21:10:29
>>140 バックバッファの内容全体を揺らせばいいんじゃないの?フルスクリーンとかも関係ないじゃん。
2D系でしょ 表示してるテクスチャをすべて同時に動かすでいいんじゃね?
いちばん簡単なのはテクスチャに描画してテクスチャを動かす方法だろ 他のエフェクトと兼用できるし
テクスチャーに描画するとき、サンプリングが利かなくなるからしょぼくなる
いや普通に利くだろ・・・
ドラクエでダメージ受けて画面揺れるのってステータスや文字表示部分だけだろ そういう処理やりたいなら全体をまとめて揺らすよりも、個別で表示位置変える方が融通効くんじゃないの? 逆に文字だけは揺らしたくないとかってケースもあると思うけど
148 :
121 :2009/03/10(火) 00:12:18
とりあえず、先にスクリーンショットの報告です。 スクリーンショット撮ってサイズを測ってみました。 結果、サイズ自体はただしかったです。 つまり、正しく32ピクセル表示しているのに 画像のサイズが少し小さくなって、33ピクセル分 表示されている感じでした。 テクスチャをロードした時に、すこし小さくなっているのでしょうか・・??
フィルタリングの設定見直せ
151 :
139 :2009/03/10(火) 00:40:06
みんあーありがと!いろいろ参考になったよ。 揺らしたことないからテクスチャに描画して動かす方法で感じ掴んでみるー。
>>148 ID3DXSpriteはBigenで現在設定してるレンダリングステートを保存して
スプライト用に書き換えてから描画し
Endで保存したステートを復元している
たしか自動でフィルターもONになってたはず
スプライト->Beginのパラメーターで変更しないように出来たはずだが
ID3DXSpriteはあんまり使ったこと無いので嘘かも
ソース上げてくれたらチェックするが
153 :
121 :2009/03/10(火) 01:47:31
みなさま、アドバイスありがとうございます。 やはり、フィルターの設定だったようです。 g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_POINT ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_POINT ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_POINT ); を付け加えることで、正しく表示ができました。 正直、まだ、半分くらいしか理解できていないので これから、もっと精進して勉強していきます! ちなみにみなさんは、どうやって知識を蓄えて行かれたのですか? やっぱり地道にMSDNとかでしょうか? ずばっと答えて下さるみなさんにあこがれちゃいます
ぶっちゃけ、こればっかりは長く続けて経験値を上げていくしかない これだけ見ればOKみたいなサイトや書籍は存在しないので 基本は色んな場所から良いと取りすることになるんだけど なにが「良い」のかを判断できるようになるにはやっぱり経験が必要 結局はいろいろ失敗しつつも自分であれこれいじっていくしない
サンプルフレームワークで質問があります ウインドウモードで起動し、ウインドウサイズを拡大していくと、フォントやGUI部分は同じ大きさなのに モデルやスプライト等のサイズのみ大きくなっていくのですが、これはフレームバッファのサイズ自体が変化していくということでしょうか?
座標変換済み頂点を使ってるものは画面サイズに関わらず変化しない 頂点変換掛けてるものは射影行列が同じな限り 画面に対しての比率は常に一定、つまり画面が大きくなれば大きくなる
スキンメッシュアニメーションの読み込みと表示のサンプルきぼん
あのサンプルは解像度も変わってるよ
いま現在の自分のDirectX技術のレポートと 想定しているシステムのスケルトンプログラムを提出してくれたら それにあった奴を書いてやるよ 使用目的も分からないとSDKのサンプルみたいな煩雑なコードになるから
>158 いいサンプルがSDKにはいってんべ
struct CUSTOMVERTEX { D3DXVECTOR3 position; // 頂点の 3D 位置。 D3DXVECTOR3 normal; // 頂点のサーフェイス法線。 }; の頂点のサーフェイス法線の意味がわかりません。 お願いします
複数ウィンドウ(親ウィンドウと子ウインドウ)のとき、 描画ループの順番はどうしたらよいでしょうか? while(true) { pParent->Clear(ARGB); pParent->Begin(); ... pParent->End(); pParent->Present(); pChild->Clear(ARGB); pChild->Begin(); ... pChild->End(); pChild->Present(); } 上記のようにするべきなのか、それとも pParent->Clear(); pChild->Clear(); pParent->Begin(); pChild->Begin(); このようにするべきでしょうか?
ぶっちゃけどっちでもいいと思う
>>157 >>159 フレームバッファサイズが変わってそれに合わせて頂点変換されてるものの表示サイズも変わるってことでしょうか?
フレームバッファサイズを固定したままウィンドウサイズを変えることってできないでしょうか?
例えば、DXUTCreateDevice()で640x480のフレームバッファ、ウィンドウサイズを持つアプリを作り
それをマウス操作でウィンドウサイズを拡大、このときにフレームバッファサイズを固定したまま引き伸ばして
ウィンドウの形状の拡大させたいのです
166 :
デフォルトの名無しさん :2009/03/11(水) 00:58:22
伸ばした部分は黒枠でいいの?
それはたぶん無理 DXUTの中身をいじれば出来るけどそれが出来たらこんな質問でないよね 荒業としてはUI部分だけ別のレンダリングターゲットに描画して後から合成とか
DXUT.cpp 3643行周辺でバックバッファ領域をクライアントサイズに変更してその後にデバイスをリセット
BassicHLSLからコールバックで登録したOnResetDeviceが呼ばれて
そこでGUI部分の表示位置、サイズを修正してる感じかでしょうか?
ここのバックバッファサイズをクライアントサイズに変更する箇所を無くすと
画面自体は
http://nagamochi.info/src/up30413.jpgになったのですが 、
GUIコントロールの位置が表示されてる場所からずれてしまいました(ずれたのは表示位置の方なのですが)
ずれたのは OnResetDevice内でバックサーフェイスのサイズにあわせて SetLocationしなおしてるから そこを消せばOKなんじゃない?
DirectX9で ID3DXFont::DrawText すると、文字の下と右っかわに 変なわくみたいな線がとぎれとぎれに出ます? なぜ〜〜〜????
>>158 煽りでもなんでもなく、ほんとにサンプルに入ってるやつをぶっこぬくのが一番いい。
腐ってもマイクソといった感じの、すごいいいソースだった
質問です Direct3D9のボリュームテクスチャに、GPUで直接レンダリングする方法が分かりません ボリュームから特定の軸で分割したサーフェイスが取得できると思っていたのですが マニュアルを見てもサーフェイスを取得する方法が分かりません Direct3D10でのやり方は分かるのですが、もしかしてDirect3D9では出来ないのでしょうか?
ヘルプに書いてある通り。
お前こっちまで来てんのかww ワロタwww
つまりヘルプを読めば解決
困ってるんだ!頼む教えてくれ!
それが人にものを教えてもらうときの態度かね
猿!草履を用意せい!
お昼の部の人気に嫉妬
>>173 ボリュームテクスチャをレンダーターゲットにしたいってこと?
はい
DirectXのチュートリアルでマウスの状態が I の状態になったり 砂時計になったりするとそのままだよね これを矢印の状態にするにはどうすればいいでしょうか?
DirectXと関係ない
186 :
デフォルトの名無しさん :2009/03/11(水) 20:08:45
最近良く見る床で反射(?)してる風の見た目を実現しようと思っています。
今はID3DXSpriteを使ってPNGファイルを表示させているんですが
同時に同じ画像を反転させて元の画像の下に表示させてさらにグラデーションをかけたいです。
イメージとしてはこんな感じ。(サンプルは文字になってますけど)
http://www2.uploda.org/uporg2081830.png スプライトを反転させて元スプライトの下に表示まではできたんですけど
グラデーションをかけることができません。
どうやったら実現できるか識者の方、知恵を貸してください。。。
Direct3Dにスプライトなど存z
DrawPrimitive使え
189 :
186 :2009/03/11(水) 20:20:45
あ、言葉間違ってましたか?すいません。 基本が全然わかってないです。。。 > 187 スプライトっていうかID3DXSpriteインターフェイスを使って画像を表示させてます。 この表示させてる画像にグラデーションがかけて表示することができるのかなって質問です。 > 188 ID3DXSprite使っちゃできないってことですか?
できない 少しでも特殊なことしたいならID3DXSpriteはやめるべき
191 :
デフォルトの名無しさん :2009/03/11(水) 20:32:13
>190 マジですか、ありがとうございます。
>>170 SetLocationしなおさないとそれはそれで位置がずれてしまいました
DXUTgui.cpp内で参照されるマウスの位置にフレームバッファサイズとウィンドウサイズの比率分オフセット噛ますって方法で
強引な気はするのですが、対処できそうです、ありがとうございました。
カメラが理解できないんですが、オブジェクトと同じようにカメラの位置と方向を決めて移動させるようには出来ないんですか? オブジェクト全てにカメラの設定をしているように見えて理解できないんです 世界中の全てのものを見えてようが見えてなかろうが視点の設定をするのってものすごく無駄じゃないですか?
DirectXにカメラなど無い
それは自分で言ってる通り理解が間違ってる
たぶんビデオカメラみたいに撮影したものが 画面に表示されているイメージなんだろうけど 3Dの世界では ある位置にカメラがあると仮定したときに 全ての物体に対してそれがカメラに対してどの位置にあるかを計算して さらにそれを2Dのスクリーンに投影したときにどうみえるかを計算して 初めて画面に描画することができる ビデオみたいに光学で観測した結果を描画してるわけじゃない
まじですか オブジェクトをパッキングしてカメラを移動させるだけに作りかえるようなことは普通しないですか? もしやめたほうがいいならやめます オブジェクト毎に視界に入ってるかどうかをを判断させた後に入っているもののみビュー行列変換するであってますか?
それとも処理落ちが始まるまで全オブジェクトビュー変換するほうがいいんですか? いつ処理落ちがはじまるかわからないんですが、以外と早くきますか?
プログラム云々以前に、日本語を何とかするのが先決だ。
そもそもビュー変換が視界に入ってるかどうかの判定の第一歩なんだが 続く射影変換で視界の外にいるorその位置から見えないと判定されたピクセルは描画されない この描画が一番重い部分なのでいかに描画するピクセルを減らすかの計算をしていると思えば良い
・カメラの位置と向きを決める ・すべての物体を、カメラ基準の座標系に変換する ・カメラの範囲から飛び出ているものはごっそり描画を省く(←ここだけ手動) ・描画を行う
>171 どゆこと?
>171 どゆこと?
ハードで計算できる部分を わざわざCPUで判定するなんて 物体が増えたときに負荷になるだけじゃん
そのハードに送るデータ量を減らすためにCPUで判定するんだろ データ送信が一番重いんだから
普通は全ての物体を変換するだろ 視界内かどうかの判定なんか考えるな ロードするかしないかで分けろ
そうなの?
んにゃ
地面のでこぼこにあわせて吸着するように物体を置くのはどうやるの? 物体のワールド座標Yに地面のワールド座標Yを影響させるのはわかるんだけど どう計算すれば出てくるの?
210 :
デフォルトの名無しさん :2009/03/12(木) 07:26:35
吸着とか意味わかんない 地面の高さを設定すれば単純にそこに出てくるだろ? 何が不満?
211 :
デフォルトの名無しさん :2009/03/12(木) 07:34:06
そもそも地面のxzに対するy座標は取得できてんのかよ
出来てない Xファイルをワールド配置したあとのワールド座標xzのyって ローカル座標をXファイルの原点をワールド座標に変換した値にプラスするの? ワールド座標XZ上にある点を全て列挙する関数はないの?
まずはモデルデータの読み込みを自前で作るところから始めた方がいい。 怠けて高レベル関数に頼っていたら何も出来ない。
214 :
デフォルトの名無しさん :2009/03/12(木) 08:26:23
>出来てない ざまぁwwww
お前ら雪とか雨はどうしてる?
傘を差します
オレは家から出ない
>>206 カメラが決して動かないならそれは正しい意見だ。
雪とかは地面に近づいたら適当にアルファ値あげて消して、地面は雪シェーダで適当に白くして終わり
D3DXでも任意の点の上空からレイを飛ばして 衝突までの距離を出せば地面の高さがわかるんでない? 使ったこと無いから速度は知らんけど
完全に地面のメッシュが独立してるなら D3DXIntersectでいけるかもね ただ、その方法だとトンネルとかあったらアウトだけど
本の目次に書いてあるんですが、高すぎて買えないので教えてください GPUを使ったサウンドエンジンってどういうことですか?
使いたい音源だけをデータに含ませて文字列だけでMIDIのように鳴らすのに使う リアルタイムで音階など全てを単音から作り上げたり、効果音とかを複雑に変形させたりしてる。 これのおかげで大作でも音容量10MBいかなくなった
スキンメッシュの日本語訳を開始したぜ
それはどういった向きの質問で?
HLSLについて解説している書籍やサイトを見るとSetRenderStateで出来ていることをわざわざ書いていたりしますが、 これからはSetRenderStateを使わずに出来る限りHLSLで処理させる流れなのでしょうか?
うん
いまさらだけどボリュームテクスチャにレンダリングって何がしたいんだろうな。
/) ///) /,.=゙''"/ / i f ,.r='"-‐'つ____ こまけぇこたぁいいんだよ!! / / _,.-‐'~/⌒ ⌒\ / ,i ,二ニ⊃( ●). (●)\ / ノ il゙フ::::::⌒(__人__)⌒::::: \ ,イ「ト、 ,!,!| |r┬-| | / iトヾヽ_/ィ"\ `ー'´ /
まぁ、DirectX10から実装された機能を9で使えますか? なんて聞いても煽りレスしかつかんだろ こういうことをやりたいんだけど 9で実現するにはどうすればいいですか?と聞いてくれればいいんだが
いやマルチだからそこらじゅうに書きこしてる
スキンメッシュはDXUT.cppは外してもいいの?
スキンメッシュに関わらずUT使ってないならいらない
初心者ですが、DXUTって現場で使われるんですか? 9の勉強中で、DXUTの膨大さに圧倒されてます・・・
仕事ならDXUTなんて豆粒にしか見えないような膨大なライブラリを作ります。
うちの会社の規模ではWindowsなんてミジンコです。
>>236-237 レスどうもです。豆粒、Winミジンコなんて凄いですね・・・
本場は1000万ステップ越えるのでしょうか・・・
参考になりました!
239 :
デフォルトの名無しさん :2009/03/13(金) 15:38:54
DXUTって何? 本体のライブラリ? マイクロソフトの描写ライブラリの分量を超えるプログラム作ってるって事?
240 :
デフォルトの名無しさん :2009/03/13(金) 15:53:44
それよりも BitBltの遅さを何とかするために開発されたDirectXを使っておいて なぜそこで先祖がえりを起こすのか問い詰めたい
d3dpp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
>>243 そこのフラグを入れないとダメだったのですね。
ご教授頂きありがとうございました。
>>242 バックバッファーに描画したピクセルを編集したいと思ったのですが、
VRAM→MEMORY→VRAM という手順を踏んで描画すると物凄く遅くなってしまったのです。
なのでVRAM→MEMORYだけにして、編集後のピクセルをBITBLTでやれば少しはマシになるかなと。
それとも他にもっといい方法があるのですかね?
245 :
デフォルトの名無しさん :2009/03/14(土) 04:01:49
バックバッファに描画しないでテクスチャに描いて最後にバックバッファに描くとか
>>245 テクスチャに描画する為にはレンダーターゲットにしなくてならなくて、
レンダーターゲット指定の物はLockRect出来ないため、
D3DPOOL_SYSTEMMEMなサーフェスにGetRenderTargetDataする事で、
LockRectをして編集可能になる…という事であってますよね?
そこから更にUpdateSurfaceをして…となると遅くなってしまうのです。
もし何か間違いがありましたら指摘して貰えると助かります。
247 :
デフォルトの名無しさん :2009/03/14(土) 04:16:05
ピクセルシェーダ使えばいいんじゃね?
GDIで描くのにくらべたら何やっても速いって気もするけどね ピクセルをどう編集したいかにもよるけど 俺もテクスチャに描いてシェーダーで加工してレンダリングに1票
やりたい事に対して 自分の考えた方法の詳細を聞くよりも やりたい事と条件を出して、どうすれば?っての方が断然早いw …でも大体は提示された方法を理解出来ない、と だから自分の考えた方法が頓珍漢なんだがね…
WindowsXP DX9 2009/04 シェーダー(HLSL)の勉強をしています。 頂点シェーダーを普通のXファイルに使うのは問題ないのですが、(DXの)スキンメッシュでは上手く行きません。 DrawMeshContainer関数内で「g_SkinningMethod」が常に「D3DNONINDEXED」を通るのでそこにBeginPass等を書くと ボーンかウェイトが正しく反映されず頂点(面)が分離して表示されてしまいます。 少し下を見ると「if (g_SkinningMethod == D3DINDEXEDHSLSVS)」があったのでここを通せばいいのかと思って 「g_SkinningMethod」の値を書き換えると実行中にエラーが出ました(SetSoftwareVertexProcessingにて)。 スキンメッシュそのものは「メタセコイア」から「rok de bone2」を経由して出力したアニメーション付きXファイルです。 そこで2点伺いたいことがあります。 ・頂点シェーダーを使いたい場合はD3DINDEXEDHSLSVSの部分を通して使うのは正しい(意図した)方法なのか ・D3DINDEXEDHSLSVSを通すために何かすべき事があるのか(スキンメッシュのコンバートなど) 特異なことをやっていますが、もし分かる方がいればレスをお願いしますorz
訂正 バージョンは2009/04ではなくて2008/04です
シェーダ上でウエイトの計算をしていないからだろ
というか値書き換えてもエラーなんてでないだろ
ヘルプを読むことだな
256 :
250 :2009/03/14(土) 21:07:08
>>252 ありがとうございます。
若干前へ進めました。
pMesh->DrawSubsetの上でSetTransform(D3DTS_WORLDMATRIX(i), &matTemp )をやっており、
この値を正しく渡すことが出来れば問題は解決しそうです。
しかし、これを繰り返す回数である「pMeshContainer->NumInfl」に何が入っているのか(常に4?)、
どうやって頂点シェーダーでどの行列を使うのかを指定してやるのかが分かりません。
前者に関しては100とか200の数値が入るとHLSLに配列として保持させるのは現実的ではありませんよね。
後者は前者が4固定だとすれば、頂点情報にフラグがあればそれを取得することで解決しそうです。
そこら辺について詳しい片はいらっしゃらないでしょうか。
>どうやって頂点シェーダーでどの行列を使うのかを指定してやるのかが分かりません。 なんでそんな基本事項が分からないのかが分からない。
258 :
250 :2009/03/14(土) 23:18:24
>>257 現在使っている頂点シェーダーは以下の通りです。
float4 TestVS(
float4 Pos : POSITION,
float3 Normal : NORMAL,
float2 TexCoord0 : TEXCOORD0 ) : POSITION
{
float4 a = mul( Pos, gMatrixWVP );
return a;
}
gMatrixWVPはpMesh->DrawSubsetの前にmatWorld * matView * matProjectの結果を入れています。
上記で期待している結果はシェーダーをかけてもかけなくても同じ形状。
matWorld(gMatrixWVP)の値を変えることで解決はするのでしょうが、
pMesh->DrawSubsetで複数の頂点が描画されるのでバラバラに設定できない。
そもそもどの頂点がどの行列を使うのかを知り得ないので躓いています。
頂点シェーダー内で各頂点通常描画と同じワールド座標が取得できればいいのですが無理ですよね・・。
>そもそもどの頂点がどの行列を使うのかを知り得ないので躓いています。 頂点の情報の中に含まれてるだろ 全然分かっていないんだから、 D3DXを使わずに直接頂点を設定するところからやり直せ
とりあえず「スキンメッシュ シェーダ」でぐぐるくらいのことはしたのか? それっぽいのがゴロゴロ出てくるぞ?
そもそもSDKのサンプルにシェーダーで動くサンプルがそのまま入ってますやん
規制が解除されてたら HLSL用スキンメッシュのサンプルをうpする
おめでとう
日本語ドキュメント来たな
>>262 くそう、いつのまにか全規制からVIPのみ規制に切り替わってた
いまコピペの嵐でサンプル作った
・DirectX9
・基本ベースはSDKサンプルのチュートリアル(非DXUT)
・スキンメッシュ部分はSkinnedMeshからの部分コピペ
・HLSLはMultiAnimationからほぼそのまま
・アニメーション制御はまるぺけを参考
・デバイスのリセットに未対応
・キャラクタ(インスタンス)のコピーとか無理
・影響度が一つも設定されてない頂点のあるメッシュは表示しない
・テクスチャの設定されてないマテリアルは真っ黒
全部対応できるけどお手軽最小限ってことでこれらは自分でなんとかしてね
で良くて二人以上希望者がいたらうp
キボンヌ
あ、俺もおねがいします
俺も俺も
これがどうすごいか解説ヨロ
よくわからないけどいただきました。 よくわからないけどべんきょうにつかわせていただきます。
別にどうすごくもないただのサンプルでしょ 動作原理を知らなくてもスキンメッシュを再生したい人には良いんでない? すでにできてる人にはあまり意味ないかと
>>270 素かワザとか判断に迷う所だが
簡便じゃなく勘弁な、ワザとだったら勘弁な
さんくす 少ないファイル数でまとめてるとわかりやすいわ
あんまり甘やかすなよw ここがDirectXの一つの山場なんだから
くやしいのうwwwくやしいのうwww
CDXUTMeshってググってもあまり引っかからないのですが 一般的にはあまり使いませんか?
最適化とか勝手にやってくれるし UTベースでCXFileMesh使うならいろいろ手間が省けていいんでない?
ごめ ×CXFileMesh ○LPD3DXMESH
>>265 SUGEEEEEEEEEEEE!!!
やっと日本語版の最新がきたのかw
D3DXAnimationControllerが最新対応になっていて感動した!
でもバグも直せ
>>265 久しぶりの翻訳は(日本法人)新社長の公約のおかげかな。
こういう時期なら翻訳をねじ込めるかもしれないので
翻訳して欲しい資料についてはフィードバックしておくと良いのかも。
ttp://ascii.jp/elem/000/000/165/165823/ >樋口氏は、「ITエンジニアの皆様に対するお約束」として、エンジニアからの
>要望が強かったという「技術資料の不足」「製品の品質」「分かりにくいライセンス」
>などの問題の解決に当たっていることを説明。
>過去6カ月間に、1万ページ強の技術資料を日本語翻訳した経過を報告し、
>「さらに今後10カ月間で1万ページの技術資料を追加翻訳する」と約束した。
つまり、今後の質問は全てヘルプを見ろってことでおk?
別に日本語サンプルできたからって全然変わらないだろ
285 :
デフォルトの名無しさん :2009/03/18(水) 10:52:39
スキンアニメーションに使うXファイルを作っているのですが 歩行アニメーションを作る場合は3Dソフト上で場所を動かさず歩行モーションだけを作って ゲームのほうでキー入力によって位置を移動しながらアニメーションを再生させるんでしょうか
むしろxファイル上で位置を変えようと思ったお前の発想が凄い そのうちどこかで使おうと思った
>>285 そう作ってもいいし、
xファイル上で移動するように作っておいて、その移動量を毎フレゲーム内に加算、モーションの方でその移動をなかったことにする
前者だとすべるような動きになりがちだけど後者モーションと移動量をリンクできる
288 :
デフォルトの名無しさん :2009/03/18(水) 11:49:55
ありがとうございます とりあえずはゲームのほうで移動するようにしてみます
スキンメッシュが1秒くらいの周期で動きが異常に速くなったり戻ったりを繰り返す エスパーの方どこが問題かわかります?
時間の進め方が AdvanceTime ( 1/60) ; とすべきところを time += 1/60 ; AdvanceTime ( time ) ; そしてるとか
>>290 かなり良い線行ってましたわ
直接数字入れたら直った
変数timeがあっちこっちでごっちゃになってたみたいだサンクス!
でもクラスに移植する前はマトモに動いてたのになー
292 :
デフォルトの名無しさん :2009/03/20(金) 12:50:06
シェーダーを使ったメッシュって元々設定してたライトの影響を受けることはできますか? シェーダーを使ったメッシュに新しく設定しなきゃ駄目ですか?
で、新しく設定しないで実行した結果はどうなった?
294 :
デフォルトの名無しさん :2009/03/20(金) 13:51:59
光が当たりませんでした。何か方法はありますか?
描画速度の計測ってtimeGettimeなどで時間計測すればいいんでしょうか? 余りにも短い時間で終了してしまう場合は、その処理を何百回とか繰り返して 負荷をかけるだけで大丈夫ですか?それとも同じ処理だと二回目以降は高速になります?
>>292 元々へったくれもなく、自分で計算内容を書くのは理解しているのか?
>>295 処理しないなら休ませろ
物体を回転させるのはわかったんですが 物体の周りで同じ半径で物体を円運動させるにはどうすればいいんですか?
まず数学から学んだほうが早いんじゃね?とか思うのは俺だけか。
行列計算とか色々関数があるから手軽になってるけど、根本的な内容を理解していないと
>>297 のような状態に。
必要なのは三角関数だけだけどな
月の裏側見えちゃうじゃん!
>>296 >処理しないなら休ませろ
いや処理にかかる時間をはかりたいのです。
例えば、3つのテクスチャーで作られるモデルがあるとして、それを5箇所に描画する場合って
モデル1つづつ描画していくのと、1つめのテクスチャーをセットして、そのテクスチャが必要な部分だけ5箇所に描画、2つめのセットして描画
って繰り返すのとどっちが速いんでしょうか?
切り替えなくてすむのなら切り替えない方が速い
フレーム4個うちボーン2個のスキンメッシュがあって、 頂点バッファをダンプするとDWORDのBlendIndicesの値には ボーンのインデックスの00か01しか現れないと思ったのですが 3f800000だったり3f7ffb37のような値になっています。 これはどういう計算でこうなるのでしょうか? 描画は正常に表示できています。シェーダ内ではD3DCOLORtoUBYTE4を使ってます。
304 :
デフォルトの名無しさん :2009/03/21(土) 18:16:57
プログラム言語なんて所詮コンピュータに人間のやりたいこと伝える通訳でしかねぇんだよ。 通訳なんて自分自身は生涯主役になれない黒子だろ?脇役だろ?奴隷だろ? 伝わりさえすりゃそんなもんの優劣なんてどうでもいいんだよ。 何でも出来る? そんなもんは「私はただの通訳じゃありません。ヒンタボ語も使えます!」と 自信満々に言ってるようなもんだ。 そんなもん使う側の人間にすりゃ 「はぁそうですか。便利そうですね。…ヒンタボに行く人にとっては。」レベルの ゴミ自慢だっていい加減気づこうなw まぁ、これに懲りたら挑発しにくんな。奴隷。
ヒンタボ語に泣いたw おまえはたけしかwww
コリジョンクラスを作ろうと思うのですが モデル管理クラスはプレイヤーとその他で2つ別のを作るのと同じクラスで管理するのはどちらがいいですか? アドバイスお願いします
>>306 表記ミスだね、符号付16bit整数は -32768 〜 32767
309 :
デフォルトの名無しさん :2009/03/22(日) 17:44:23
シェーダープログラミングで点光源ってどうやるの? シェーダーにするとライトの設定異常に面倒じゃない?おれが間違った解釈してるのかな?
MMORPG作ったけど
ふむ?
ゲームパッドのデバイス作成しようと思ったら、ウィンドウハンドル必要だけど、 コンソールアプリではDirectInput使えない?
使える
.xのアニメーション(スキンメッシュ)ってもしかしてシェーダー必須?
いいえ
316 :
デフォルトの名無しさん :2009/03/24(火) 15:12:35
318 :
デフォルトの名無しさん :2009/03/25(水) 00:40:04
ID3DSprite を使ったスプライト表示について教えて下さい。 テクスチャを準備して、ビットマップを表示しているのですが 縦横比をビットマップと同じように表示するにはどうすれば 良いでしょうか? よろしくお願いします。
319 :
318 :2009/03/25(水) 00:53:42
すみません、環境は DirectX9 で、表示はWindowです。 Windowサイズを変えるとスプライトの縦横比が変わるのを 防ぎたいです。 宜しくお願いします。
画面の大きさ変わったらそれに応じた行列作って与えればいいんじゃない?
321 :
デフォルトの名無しさん :2009/03/25(水) 01:31:27
>>320 ウィンドウの縦横比とスプライトの縦横比の関係が
どうなっているのか分からないのですが、これを確認する
方法がありますでしょうか?
そもそもID3DSpriteなど存在しない
>>319 Windowサイズを変更できないようにしろ
ウインドウサイズが変更さたら、D3Dデバイスも変更するといいと思う
Xファイルの再生でアニメーションコントローラーを使って 指定したフレームから指定したフレームまでの再生ってできますか? 1つのXファイルに歩行・ジャンプ・座るなどのモーションを詰め込んでどうすればいいか悩んでます;;
できるけど 切り替えやモーション移行時の合成のことを考えたら アニメーションセットを複数持った方が楽
>> 326 ありがとう アニメーションセット 複数 でググったら色々出てきたので勉強してみます
328 :
デフォルトの名無しさん :2009/03/25(水) 15:48:13
カメラでビュー変換した後のmatrixを、移動したり回転したりするには、どう計算したらいいんですか?
板違い
ビュー行列にあらかじめ移動行列やら回転行列やら掛けとけば?
板違い ??
332 :
デフォルトの名無しさん :2009/03/25(水) 16:53:07
>>330 カメラの動きを出力するツールがあり、その出力データを他のツールで読み込み再生したいんです。
しかしその出力データにはビュー変換後のmatrixしか入っておらず、変換前のデータにあらかじめどうこうというのは出来ないんです。
カメラの位置と向きから逆計算すればよい
後だし情報多すぎだな もう回答はつくまい
335 :
デフォルトの名無しさん :2009/03/25(水) 17:35:02
できたあああああああああ。 ひゃっっほおおお カメラですが、みなさんありがとうございました。 上手く行かない原因がわかりました。 ツール側のxyzが逆になっていただけでした。 transrateだけで行けないわけがないのに、それすらできないなんてPG人生終わったな、ぐらい追い詰められてました。 幾何学の基本的な公式から読み直したり(ry ありがとー!
どういたしまして^^
DirectX9に対応してないビデオカード使ってる奴がうざいんだけど どうすればいいですか
暗殺しろ
何作ってるかによるな
この手のクレームは無視一択じゃね
必要環境にDirectX9と書いてあるなら対応する必要なし
必須環境なのに対応しろって苦情が入るのでうぜーとか 下の方の環境も拾おうとしてる所為で全力で戦えなくてイライラしてるのか 両対応でできる限り遜色ない見栄え要求されて大変とか
DirectSoundのクラスを作っているんですが 音楽を読み込ませる場合は最初に使う分ロードしておくのと必要な場面でロードするのはどちらがいいですか?
DirectSoundクラスを実装しているのですが 音楽データは最初にすべてロードするのと必要な場面ごとにロードするのはどちらがいいですか?
音楽データなら理想を言えばoggファイルとかからストリーミング再生がいい DirectMusicならやり方分かるがDirectSoundでどうやったかな SEじゃなくてBGMだろ?事前に全BGMを読み込むのはあり得ない^^;
346 :
デフォルトの名無しさん :2009/03/26(木) 09:51:03
>>345 レスありがと
directMusicでoggファイル再生を実装してみます
ストリーミングはスレッドを使っているみたい?なのですが
スレッドの勉強はまだ不十分なので、必要な時にロード・必要なくなったら消去
という風な仕様で作ってみます。
347 :
デフォルトの名無しさん :2009/03/26(木) 10:00:37
お前もしかして○×にも書いてなかったか?俺と全く同じペースで進めてるわけだが・・・
○×? どこよ
つくろードットコムだったりして? ファイル全読み込みで発生するラグはプレイヤーのストレス源になるからな 世の中には全部読んだあと更にデコードまでする人もいるらしいが なるべくストリーミングしたほうが良いね
D3DXを使わずにテクスチャを読み込むにはどうすればいいんでしょうか。
テクスチャを作成し、バッファをロックして、ピクセルデータを書き込む。 画像ファイルからピクセルデータを取得するには、各フォーマットを調べるか、 WinAPIやその他ライブラリ関数を使ってビットマップを取得する。
c++とc#の基礎的な部分の勉強はしたことあるのですが、 3D表示に手を伸ばそうとしたときdirectXとXNAというものがあると聞きました もちろん一長一短はあると思いますが、やはりメジャーなdirectXの方が解説サイトなどが豊富で 初心者向けなのでしょうか?
>>351 ありがとうございます。
LockRectの第2引数がバッファを指すポインタを持っている事に今気がつきました。
書き込むデータは、IDirect3DDevice9::CreateTextureのD3DFORMAT に指定した引数に従って書き込めばいいのでしょうか。
CreateDirect3D9やDirectInput8CreateはCOMを初期化するのにCoInitializeを使っているというわけではないのですか? D3DやDIオブジェクト作成した後でCoInitalizeExにいろいろな値を渡しても、失敗することがないので気になるのですが。
355 :
デフォルトの名無しさん :2009/03/26(木) 22:27:21
Visual Stduio 2008を使用していて、DXSDKをインストールしたんですが、 プロジェクトのビルド時に include ファイルを開けません。'DSound.h': No such file or directory というエラーがでます。 VSの設定でDXSDKのincludeディレクトリとlibディレクトリへのパスは通してあります 何が悪いんでしょうか?
libは64とかはあってるのか? 優先度を一番上にしてるのか? 実際にファイルはあるのか?
デスクトップ上に半透明化した画像を常に手前に表示したままの状態で、後ろに表示されている別のウインドウを操作できるようにしたいんですが、VC++で可能でしょうか? 何かよい方法があれば教えてください。
directx関係ない気がするんだがな 可能。方法のヒント ハンドル
>>355 現在のDirectXSDKのincludeフォルダに存在する?
PlatformSDKにはいってたりして・・・
360 :
355 :2009/03/27(金) 00:56:38
大丈夫じゃない
あとはdebugとリリースそれぞれ違うから 両方設定して。 それでだめならlibとかをdirectxのみにする
sas
365 :
デフォルトの名無しさん :2009/03/28(土) 14:01:36
sdkのサンプルにdirectsoundのやつが入ってないんだけど昔のバージョンには入ってるの? MSDNには\Samples\C++\DirectSound\みたいなこと書いてあるのに見当たらない
366 :
デフォルトの名無しさん :2009/03/29(日) 13:05:09
質問です 複数のウィンドウハンドルに描画するにはどうすればいいのでしょうか? また、モーダルなウィンドウを生成した時、生成側でそれを検知して描画を止めるような処理をしたいのですが方法はあるでしょうか?
>>366 生成側で検知できない方がどうかしてないか?
モーダルウィンドウを作る直前に描画を禁止するフラグでも立てて
戻ってきたら寝かせるだけだろ。
>>365 Microsoft DirectX SDK (August 2007)には入ってるね
これ以降無くなったヘッダとかもあるからインストールしといたら便利だよ
質問です。 MCIを使用してmp3を再生しようと思うんですが、 ffdshowが起動してしまいます。 つまり公開した場合、各自ffdshowをインストールして下さいという必要があるという事ですか? ゲームBGMに使用したいのですが、 MediaPlayerを用いた方が標準的に入っているので、そちらの方が適当でしょうか。
お前さんが自分でffdshow使うようにOSに設定してるだけだろ・・・
水面ってどういう作り方があるんですか? 半透明で下の土が見えてるだけしか思いつきません クライシスの波だったりするのってアニメーションなんですか?それとも計算で動かしてるんですか?
sinとか使って計算するんじゃなかったっけ?
375 :
デフォルトの名無しさん :2009/03/31(火) 08:58:38
質問です。 ある画像を描画する際に、アルファ付きのスプライトなどでマスクを掛けて 円形の内側だけを描画するようにしたいのですが、思ったような結果が得られません。 まず円形の内側がアルファ値255、外側が0になるような画像を描画し、 その後マスクを掛ける画像を描画する前にD3DRS_SRCBLENDに D3DBLEND_DESTALPHAを指定してみているのですが上手くいきません。 アルファブレンドを利用したマスク処理について知りたいので 詳しい方のご教授、もしくは参考になるサイトなど教えて頂けると助かります。
ステンシルバッファ使えよ
DirectSoundでストリーミング再生しながら IDirectSound8::DuplicateSoundBuffer()使うとやばいですか? 下手したらロック可能な場所がなくなりますよね?つまりこれは短い効果音なんかに使う用と考えておkですか?
おk
Zバッファがどうたらと色々なページに書いてあったので、それを参考にして書き換えてみたのですが 相変わらず位置に関係なく、後に描いたものが前面に来てしまいます。 考えられる原因をお願いします。
380 :
デフォルトの名無しさん :2009/04/02(木) 21:22:34
ダークマター
Zバッファが登録されてない。 D3DRS_ZENABLEが有効になってない。 D3DRS_ZWRITEENABLEが有効になってない。 Zバッファがクリアされてない。 Z値の奥と手前が逆。 実は描画順が逆だった。
回答ありがとうございます。 EnableAutoDepthStencil = TRUE; AutoDepthStencilFormat = D3DFMT_D16; SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); SetRenderState(D3DRS_ZWRITEENABLE,TRUE); Clear(NULL, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, NULL); 追加・変更してはみたものの、やはりうまくいかないようです。 もっと細かく調べてみることにします。
>>381 一番ありがちな「ニアクリップの距離が0」が抜けてるぜセニョリータ
描画の前後に関係ねーだろボケ 何がセニョリータだタコ
セニョリータとかボケとかタコとかやってるとこ悪いが 俺のありがちトラブルリストに追加させてもらったぜ ありがと
383=385
384=386
>>384 Znを0にするとZバッファが効果なくなるよ。
わりと常識のレベル。
手計算で座標変換してみれば、何が起こるのかすぐわかる。
389 :
デフォルトの名無しさん :2009/04/03(金) 12:16:32
スキンアニメーションクラスを作っているのですが ファイル読み込み・コリジョンに必要な値の取得・アニメーション制御 を1つのクラスでまとめているのですが分けたほうがいいですか?
結局モデルデータ、アニメーション、物理データ(衝突検出等)のクラスに分けたところで、 それらの合成クラスを自分が作るだけになるという・・・
DXUTって超便利じゃん
392 :
デフォルトの名無しさん :2009/04/04(土) 13:15:49
あるサイトのサンプルなのですが //アニメーショントラックを得る for(DWORD i=0;i<pAnim->pAC->GetNumAnimationSets();i++) { pAnim->pAC->GetAnimationSet(i,&pAnim->pAnimSet[i]); pAnim->pAnimSet[i]->Release(); } アニメーションコントローラーを設定した後リリースしてるのはなぜですか?
>pAnim->pAC->GetAnimationSet(i,&pAnim->pAnimSet[i]); で使い終わってるから
394 :
デフォルトの名無しさん :2009/04/04(土) 14:31:00
DirectDrawの終了処理でつまづいてます gDraw->Flip( hwnd ); にて画面を更新しているのですが whie(1) PeekMessage( ... をぬけると 最後に描画した gDraw->Flip( hwnd ); の画面が最前面に表示され 最後の画面が描画されたまま終了してしまいます どう対処すればいいでしょうか?
かなり初心者なのですが、ちょっと質問させてください。 ゲームで半透明処理をしているオブジェクトで、ドットをディザリングさせて半透明を 実現しているものをたまに見かけます。DirectXではないですがMGS4も半透明処理がディザしてます。 しかし多くのゲームではきちんとうまく半透明処理(アルファブレンディング?)をしているように見えるのですが 前者と後者はどのような処理方法でやっているのでしょうか? またなぜわざわざ汚く見えるディザリングをやっているゲームがあるのでしょうか?
>>396 ディザリングしてるゲームなんて見たことないんで適当なこと言うけど
半透明は描画順に依存するからじゃないか?
正しく半透明を描画するには奥から手前の順に描く必要があるので、
描画するときにポリゴン単位でソートが必要になる。
いったんレンダーターゲットに不透明でレンダリングしてから 2D画像処理を掛けながらビルボードとしてゲームに乗せる。 本当に半透明で描画すると、透過中にjs目玉とか歯茎が透けて見えてキモイことになる。
やっとSkinnedMeshから#include "SDKmisc.h"を除去できたぜ
DXUT外しってムズイ?
DXUTって外さないと何か問題とかあります?
スキンメッシュの部分だけを抽出させるとソースがボッコボコになる。 DXUT自体不要な機能が多々あるので外したほうが無難。 自前で実装するために学ぶのにも役立つから最小構成にする価値は十分ある。
#include "DXUTcamera.h"も外したぜ DXUT.h外すのは一苦労
てか、UT外すなら削ってくんじゃなくて 必要な部分だけのせていったほうが速いんじゃ
早い云々よりも必要な部分が何なのかが理解できなくなるので抽出してくほうが為にはなるはず。
削るとかの前に自前で最小実装した方が理解度が高まるかと もうできるって?サーセンwww
必要な部分ってどこだよぅ
>>270 はSDKサンプルそのままで縮めてほしかったな
自作クラスとか使ってたら余計理解できん
あとSDKサンプルでは読み込めて表示できるファイルが表示できなくなってるのはマイナス
なに?なんで
いきなり
>>207 の話になってんの?
>>406 自前で実装するためにDXUTを必要最小限にするのが正しいかな。
削らない状態で参考にするのは容易では無いし、逆に何も参考にする必要が無いほどの技術者ならスレ違い。
>>270 のサンプルはたしかに一部ファイルは表示できたが
SDKサンプルで表示できる物全てに対応してないから没
SDKサンプルからDXUT.h、DXUTcamera.h、SDKmisc.hを外して
d3dx9.hとSkinnedMesh.cppだけで動作するようにしてくんないと初心者は付いて行けないぞ
>>266 に書いてるじゃんか
>全てに対応してないから没
>初心者は付いて行けないぞ
www
どういうのがほしいんだい?
後でこうでないから〜とか
ならないよううに、よ〜〜く
考えて書いてねw
自作クラスとかは使わないでね
270で表示できないのがあるのって注意書きにも書いてあったけど あるifに対応するelseの部分がまんま空白になってるからだ そこを埋めるのはたいした作業じゃないんだけど、どうしても分からないなら頼んでみたら まだここみてるかわからんけど
自分でやってこそ、身に付くという物だ したがって要らぬ世話はしなくて良い
D3DXVec3TransformCoordって vec.x = (vec.x * mat._11) + (vec.y * mat._21) + (vec.z * mat._31) + ( 1 * mat._41); vec.y = (vec.x * mat._12) + (vec.y * mat._22) + (vec.z * mat._32) + ( 1 * mat._42); vec.z = (vec.x * mat._13) + (vec.y * mat._23) + (vec.z * mat._33) + ( 1 * mat._43); のあとに何をやれば再現できる? vecはD3DXVECTOR3 matはD3DXMATRIX
const double w = (vec.x * mat._14) + (vec.y * mat._24) + (vec.z * mat._34) + ( 1 * mat._44) vec.x /= w; vec.y /= w; vec.z /= w; で再現できるお
417 :
デフォルトの名無しさん :2009/04/06(月) 20:36:31
DXUT外したベース集つくらない?
DXUTはずしたところで、似たような別なコード書いただけじゃないの? 外す意味がわからないんだが
DXUTのせいで初心者は理解できんのだ 外す事には大いに意味がある
421 :
デフォルトの名無しさん :2009/04/06(月) 21:17:34
誰かサイト作ってくれよ 言いだしっぺの俺からうpしていくから
422 :
デフォルトの名無しさん :2009/04/06(月) 21:18:19
SDKのバージョンとかの互換の問題でgdgdになりそうな悪寒
ConvertToIndexedBlendedMeshの自前版て欲しい?
426 :
デフォルトの名無しさん :2009/04/06(月) 22:35:41
何でもいいからほしい とにかくとりあえずデータベースで収集したい
動画編集ソフトのようなものを作ろうとしていて DirectShowのサンプルグラバから受け取ったデータを DirectSoundを使って再生したいんですが どうすればいいですか?
428 :
415 :2009/04/06(月) 23:33:17
>>416 ありがとうございます!
無事に出来ました
Windows XP SP3、DirectX 9.0c(Mar 2008) という環境で フルスクリーンモードで作っているのですが 640x360という解像度で実行しようとすると、エラーも出ずに 止まってしまって実行できません どうすれば640x360という解像度をフルスクリーンで作れますか? ちなみに、モンハンのベンチマークで640x360のモードで実行できるので ビデオカードのドライバが対応してないという事も無いようです
とりあえず、デバッグランタイムで動かしてみて、エラーメッセージ全部見る
640x350なら聞いたことあるけど360なんてほんとにあるの?
内部動作が不明な他人の作ったものをどうこう言う前に、 まずはディスプレイモードの一覧を列挙しろよ。 なんでその程度のことすらやろうとしないんだよ?
エラーは出てると思うけどな。 そのエラーをチェックすらしてないだけだろう。
434 :
デフォルトの名無しさん :2009/04/07(火) 20:55:03
DirectSoundFullDuplexCreate8って難しいな プライマリバッファはいらないってこと?キャプチャしながらエフェクトとか難しすぎる directsoundって舐めてたけどスキンメッシュ並に難しいな
DXUT外すのは無理だった 諦めた
436 :
デフォルトの名無しさん :2009/04/08(水) 12:38:02
スキンメッシュ自体はそれほど難しくは無い 問題はDXUTが邪魔な事
邪魔なら最初から使うな
438 :
デフォルトの名無しさん :2009/04/08(水) 14:55:56
まずは触ってみましょう
SetRenderTargetを使ってテクスチャに描きたいのですが スプライトのときは無視されて画面に表示されるです。 どうすけばいいですか?
442 :
デフォルトの名無しさん :2009/04/09(木) 07:42:11
ざまぁwwww
DirectXにスプライトなど無い
ID3DXRenderToSurface
>>441 首から下パホイホイ溶岩に埋まって悶え苦しみながら死ねばいいと思うよ。
パホイホイ萌えが俺以外にもいたとはな
このスレ的にスプライトはタブーだから
いんねんつけてくる奴がいるからなw
VC++.NETでポリゴンのモデリングツールを作ろうと足掻いてます。 (メタセコなどの存在は知っていますが自分好みのを作りたいのです。) しかしmeshというものがいまいち理解できません。 頂点バッファなどの内容をあえてmeshで管理する利点があるのでしょうか? 形状作成機能でティーポットなんて作っても仕方が無いし、 ネットで調べても外部ツールで作成したXファイルを読んでといった説明ばかりで、 meshデータに対して頂点追加や編集したりといったものを見付ける事が出来ませんでした。
>>450 D3DXMeshのことを言ってるんなら
俺みたいな馬鹿が簡単にポリゴンを描画できるようにしたもの
だから頂点を編集するような機能がほしければ自分で頂点バッファを管理するべき
>meshで管理する利点 meshはmeshを含めれるので 頂点バッファとかの管理が楽になる
>>450 それ以前の問題として、チュートリアルはきちんと終わらせたのか?
D3DXは使うなと何度言わせれば気が済む
メッシュの頂点バッファとかインデックスバッファ取得する関数あるだろ それ使えばいいじゃん
DirectSoundでキャプチャしながらエフェクト再生するのはDirectSoundFullDuplexCreate8じゃないとできない? DirectSoundFullDuplexCreate8がどうもうまくいかないからDirectSoundCaptureCreate8でキャプチャして他に作ったセカンダリバッファに渡してエフェクトかけて再生しようと思うんだけどできますか?
459 :
450 :2009/04/10(金) 06:18:12
ある程度概要を流し読みしてドロウイングツールをLine文で作ってたときのような感覚で ぶっつけ本番いこうとしてます。 やっぱり頂点バッファやインデックスバッファでやればいいんですね。 そもそもモーフィング的なこともするつもりだから全頂点の移動などもやらないといけないし。 あえてメッシュが存在してるのはビデオカードのハード的な面で 大きな利点があるのかと思ってました。 ありがとうございました。
頂点バッファやインデックスバッファを統合したものがメッシュなんだが、 いったい何を言ってるんだ?
ただの思い込みだろ?突っ込んでやるなよ・・・・
462 :
デフォルトの名無しさん :2009/04/10(金) 18:00:20
スキンメッシュからDXUT除去してくれ
DXUT外す手間をかける時間があれば、自前のスキンメッシュ作れるんじゃね?
ならスキンメッシュの仕組みと実装例が詳しく載ってる資料を下しあ
カスはどこまでも他力本願だな
スキンメッシュ部分を自作プログラムに組み込んだが上手く行かない エラーで強制終了する どの部分をどうやって使うのか 実装サンプルくれよーーーーーーーーーーーーーー
LWS→自前形式変換ツールの95%がd-stormのdevkitをまんまぱくったやつでな。
ソースコードの分量の話な。
複数のアニメーションを含んだXファイルをDirectX Viewerで全て確認することは出来ないのでしょうか。
出来る
ソースを見る限りアニメーションを変更してる箇所はなさそう てか、ツールも全部ソースついてるんだから書き換えてカスタマイズすればいいじゃない
レスありがとうございます。 自前で再生は出来ているので、軽量化して代用しますわ。
■警察が自殺と断定、または事件性が無いと判断したもの │ ├自動車事故で胸部大動脈損傷したあと5キロほど車を運転して、橋の欄干から5mほど飛行して投身自殺した自衛官 │ ├400kgの重りを自分で身体に縛り付けて海に飛び込んだ高校生 │ ├時速80キロで、ガードレールとガードレールのわずかな隙間を │タイヤ痕ひとつ残さない絶妙な運転テクニックですり抜けて50m下へ転落したナース集団 │ ├ロープを首に巻いて空中浮揚し門扉にひっかかったタクシー運転手 │ ├証拠品の銃を奪い取って別の袋から再装填しわざわざ離して自分の │胸に発射、ただちに飛び散った血をふき取って取調室を掃除、この間5秒。 │ ├逆立ちしてマンションの窓際まで、指でひきずった跡をつけながら歩行、 │足から逆エルードして手すりにぶら下がり、空中で方向転換して50cmの隙間に向けて飛行した市議会議員 │ ├わざわざ動脈と反対側の手や腕の甲を切って自殺しようとするも未遂、 │自分で自分の背中に針金でおもりを結びつけて川にうつぶせになり死亡 │ ├火の気のない玄関で人体発火現象を起こして、燃え尽きるまで気管に煤が入らないようじっと息を止めて待ってた審査委員長 │ ├手首の甲をリスカして全身をメッタ刺ししてから、血の跡ひとつつけずに非常ボタンを押した証券会社副社長 │ ├口の中に靴下を入れたままガムテープで口を塞ぎ、両手を後ろで手錠により │拘束し左手には手錠の鍵を持ち玄関内で衣服の乱れもなく窒息死した記者 │ └玄関と窓、共に無施錠のまま首に電気コードを巻かれ、寝室に血痕を残した上で2階から落下したネイリスト
いままでの警察に自殺と発表された例 * 大阪、タクシー運転手 - 首にロープを巻いて、家の門扉の前でジャンプしロープを門扉にひっかけて首吊り。門扉の高さは数mあった。 * 東京、アフガン航空常務 - 全財産をつぎ込んだFX取引きで失敗し、社内で自分の心臓を刺してから窓枠を乗り越えて離陸。 * 大阪、社長 - 全身をロープと粘着テープで縛って、ビル屋上の鉄柵を飛び越えた。 * 千葉、少年 - 全身をロープと手錠で縛って、柵に囲われた線路に飛び込み。 * 東村山市議 - 逆立ちしてマンションの窓際まで、指でひきずった跡をつけながら歩行、足から手すりにぶら下がり、空中で方向転換して50cmの隙間に向けて飛行。 * 沖縄、社長 - 全身をめった刺しにして自殺。背中や手の甲もきちっと刺してあった。血の跡ひとつつけずに非常ボタンを押した。 * 大阪、潜水ルポライター - 水深数十センチの川で全身を縛ってめった刺しにしてからうつぶせに水中に横たわった。ご丁寧に背中に重しまで乗っけた。 * 神戸、ヤクザ - 自分で自分の首をはねて自殺した。首はみつかっていない。 * 東京 - 火の気のない玄関で人体発火現象を起こして、燃え尽きるまで気管に煤が入らないようじっと息を止めて焼身自殺。 * 愛媛 - 風呂場で自分で自分の頭をハンマーで殴り自殺。 * 茨城、おばさん - 首吊りしたあと歩いて川に入り息を止めて自殺。気管には水なし。 * 熊本 - 某病院主要関係者を乗せ、峠道を時速80キロで、ガードレールのわずかな隙間をタイヤ痕ひとつ残さない絶妙な運転テクニックですり抜けて50m下へダイブ。 * 福岡、高校生 - 400kgの重しを抱いて海に飛び込む。 * 東京 - 頭に穴があく不思議な方法で首吊り。 * 千葉 - 首吊りをしてからわざわざ飛び降り自殺。死因は飛び降りではなく窒息。 * 名古屋 - 車で首吊りをしようとして首を切断。しかし、首がないまま駐車、車庫入れをこなす。 * 大阪 - 歩道橋から飛び降り自殺するも、なぜか歩道橋から45メートル離れた路上で発見される。
スキンメッシュからOnFrameMoveを除去したぜ
さらにOnCreateDeviceとOnResetDeviceも除去
それは報告しなくていいです。
スキンメッシュ部を抜き出し そろそろ自作プログラムで実装できそうだ いや〜ここまでが長かったなぁ デバイスロスト処理しないと一々メッセージウインドウでるんだな
フライトシミュレータで誘導ミサイルの軌跡を煙のビルボードで表示しているのですが、 一定時間で削除したり、遠いものは簡略化しても、 ミサイルの数によっては大量になりすぎてしまいます。 ビルボードを置く間隔を広くすると、煙の軌跡がつながって見えず、点線のようになってしまいます。 エースコンバットなどではどのような方法で表示しているのでしょうか?
明らかにスレ違いだけど参考程度に。 ミサイルの煙は1本のテープのように長い帯で描かれている。 それだと横から見たら棒線に見え、場合によっては見えなくなるので帯を十字に配置。 ただ1枚の帯を2倍にしただけで処理が増えるので 今は帯をビルボードにして常にこちらを向いている帯(煙)を演出している。
場合分け。 基本は帯。射影後の制御点が一定距離以下ならば帯を薄くしてビルボードを置いてゆく。 もちろんいきなり切り替わりのでなく透明度を変化させる。
画面全体を覆う煙のテクスチャを用意して ミサイルの軌跡を求めて、ピクセルシェーダー使って軌跡との距離によって透明度を上げていく そうすれば1枚のテクスチャしか使わなくていいんじゃないか
煙にテクスチャを何枚も使うことは少ないよ。 1枚のテクスチャに煙をアニメーションさせる絵を収めている感じかな。 バンプすら使わなかったりするし。
なんでデバイスがロストしちゃうの?
なんで人間は死んじゃうの?
DirectX11に期待
487 :
479 :2009/04/12(日) 22:08:26
デバイスのロストって8から?
デバイスのロストっていうか DiectDraw時代はサーフェースのロストって言ってたな
10はロストしないの?何故?
9Exもロスとしないよ
>>491 ドライバモデルの大幅な変更があったからな。
494 :
デフォルトの名無しさん :2009/04/13(月) 12:50:35
9EXって何?
IDirect3DDevice9Exのことじゃね 俺使ったこと無いけど
デバイスロストってのはVRAMの仕切り直しだからな
昔の3Dゲームでよく一枚のポリゴンにテクスチャを張り付けて木や草などを表現していたと思うのですが、 あの手法ってなんていうんでしたっけ? 以前本で見た気がするのですが、今手元になく思い出せなくて困っています。 恐らく誰でも知ってるような名前だったと思うのですが、教えていただけますか?
498 :
497 :2009/04/13(月) 14:32:05
すみません、今思い出しました、ビルボードです。 お騒がせしてしまい、申し訳ありません。
書いてから気づくことはよくある。
書き込んでから10分ぐらいかけてれば尚更だな。
9EXはロストはしないけどVista以降専用じゃないっけ? なら最初から10使えよっていう。
ハードの問題もあるし
503 :
デフォルトの名無しさん :2009/04/14(火) 10:18:02
directsoundってチュートリアルとか解説本にプライマリバッファを作るところから始まってるけどネット上のサンプル見るとプライマリバッファに触れてないのが多いんだけど 内部でプライマリバッファが自動的に作成されてたりするのかな?
504 :
デフォルトの名無しさん :2009/04/14(火) 18:22:40
効果音は普通、セカンダリバッファを使う
>>441 Draw呼んだらキューに積むだけで
Endのとき処理されるから。
ttp://www1.axfc.net/uploader/Ne/so/50100 上記ページにプロジェクトを載せております。
この自作ソースを生かして、
方向キーを押したらキャラクターがそちらを向きその直進方向に前進するようにしたいのですが、
カメラの向きに上下左右共動いてしまい、思うようにキャラクタが動いてくれません。
この原因は何でしょうか。
また、キャラクタが向いてる方に直進するようにするにはどうすればいいでしょうか。
昨日一日悩んだのですが、思うようにソースコードが書けず困っています。
どなたか教えてください。
現状ソースではRが右周り、Wが左回り、方向キーが上下左右の動きとなっております。
開発言語はC++ 開発環境はVisual C++ 2008 Express Edition OSはWindows XP です。
あちこちいじってエラーを打開できたんだけどどうしてできたのかわからん いじって戻していじって戻してって結局最初のソースのはずだけどなぜか正常に動いてる こういう場合どうやってできたのか知る方法ない?
同じようにいじって動かなくして見る
ビルドする度にバックアップとる
バックアップつーか、Subversionでも入れてビルドのたびにコミットしとけばいい。 VS使ってるならAnkhSVNいいぞ
>>511 解決しました。
一応数学は微分積分学、線形代数学まで学んでおりますが、
誰からもDirectX自体教わったことがないので手探りで勉強しております。
ありがとうございました。
3D描画の各座標変換について学べばいいんではないだろうか。
スプライトのゲームなんだけど一枚の画像に 何種類かの絵が描いてあって常に足踏みをしながら 上下左右に動いた宝庫煮を向くにはどうすればいいの?
スレ違い
Direct3Dなんですが?
DirectX関係ない一般的な話なきがするが。 元絵の描画範囲指定すれば済む話だべ。 具体的なコードが出てくるのなら、DirectX関連として話してもいいのかもしれない。
Direct3Dにスプライトなど存在しない
ゲームのビルボードなんだけど一枚の画像に 何種類かの絵が描いてあって常に足踏みをしながら 上下左右に動いた宝庫煮を向くにはどうすればいいの?
コピー元テクスチャの矩形範囲を適当に選ぶだけ。
ものっ凄い初心者質問ですが教えて下さい。 メタセコイアなどだと「材質」はポリゴンの板単位で設定してます。 でもDirectxの頂点データはバーテックス一個単位でカラーやら反射光を持ってます。 これはメタセコイアの場合、例えば違う材質同士に所属するバーテックスが有る場合は、 描画する際にその都度該当頂点データを書き換えることで、グラデーションにならない二色にくっきり分かれたポリゴンを 描画しているんでしょうか? もしそうだとするとポリゴン数がどんどん増えてきた場合に、毎回頂点データを上書き処理が走るという えげつない事をやっていると思っていいのでしょうか? 実際にゲーム作成する場合もデータ削減のためにポリゴン単位で材質管理して描画の都度に頂点データ上書きなどを しているのでしょうか? 頂点データの上書き無しに描画しようとすると、例えば □■ と二面のポリゴンがあって■が通常、□がツヤツヤの場合、 くっきりとした区切りの無い徐々にツヤツヤになる描写になってしまうかと思います。
材質が違う所は頂点をダブらせれば?
HLSL使えばいいのに
524 :
デフォルトの名無しさん :2009/04/16(木) 20:40:53
if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) return E_FAIL; ↑コンパイルできないのですがなぜでしょうか? 環境はVC2008++でdirectX9SDKです。 追加の依存ファイルにはdxerr.lib dxguid.lib d3dx9.lib d3d9.lib winmm.libを指定しています。 エラー内容は、 'g_pD3D' : 定義されていない識別子です。 'D3D_SDK_VERSION' : 定義されていない識別子です。 'Direct3DCreate9': 識別子が見つかりませんでした
ヘッダがインクルードされてないだけじゃ?
>>525 ヘッダはwindows.hをインクルードしていますが他に何か必要なものがあるのでしょうか?
d3d9.hとd3dx9.hとdxerr9.h入れとけば大丈夫かと
528 :
524 :2009/04/16(木) 20:58:17
>>527 ありがとうございます。おかげで2個のエラーを解決できました!!
しかし1つだけエラーが残ってしまいました。↓
'g_pD3D' : 定義されていない識別子です。
よければこちらの解決法もご教授願います
#include <dxerr9.h> extern int g_pD3D;
530 :
524 :2009/04/16(木) 21:20:52
>>529 やってみたのですが78行目「if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )」をさしてエラーが発生しました。
内容⇒ '=' : 'IDirect3D9 *' から 'int' に変換できません。
まあ、自分でもう少し解決策を探してみます。
ご指導くださった皆さんありがとうございました。
もはやDirectX以前の問題 そもそも宣言すらされてない予感 LPDIRECT3D9 g_pD3D; ってどっかにあるか? 別ソースファイルにあったりしないか?
g_pD3Dは個人が作った変数なんだからどこかで宣言しないとだめなのは読みとろうや。 変数の型はDirect3DCreate9の戻り値の変数と同じ。 エラーにも出ているのに解決策を探るとかそういう問題じゃないだろうに。
コピペだけじゃなくて理解しようとしなきゃ知識にはならんぞ
if( NULL == ( g_pD3D = (int)Direct3DCreate9( D3D_SDK_VERSION ) ) )
テクスチャにライティングする時はどこで計算すればいいんですか? ピクセルシェーダでテクスチャの値に法線を使ってかけ合わせるんですか?
法線と光源方向の内積をテクスチャの値にかける
ピクセルシェーダで内積の計算までさせるんですか? どこかでピクシェルシェーダは遅いと書いてあったんですが、 マルチテクスチャで光テクスチャと絵テクスチャをブレンドしてピクセルシェーダに渡すとかもヘルプに書いてあったんですが 意味がわかりません、頂点シェーダで光テクスチャを法線から作りだすことができるってことなんでしょうか?
頂点シェーダーでやるなら頂点のカラー出力に内積結果を放り込んで ピクセルシェーダーでそのカラーとテクスチャカラーを掛け算するだけ 光テクスチャ?ライトマップの事かな どっちにしても頂点シェーダでテクスチャは作れません
だからその矩形を選ぶのにどう計算すれば 左向きの右足左足、右向きの右足左足…略 になるのかと聞いているのだが?
しかもそれがキャラクターの数だけ存在するし
>>538 thxわかってきました
光源が移動しないものに関しては初期化時に一度だけCPUで光テクスチャを作ってマルチで渡して、
変化があるが全体的な光は頂点シェーダで計算してプリミティブ単位の大雑把なライティングにして、
細かい物でしかも変化のあるものはグラデーションなどもできるようにピクシェルシェーダでピクセル単位で計算すればいいんですね
もう完璧ですありがとうございました
すみません。レンダリング理論は完全に精通したのですが プコリンパイルヘッダーが見つからないのですが
ユウコリンパイルヘッダー ・・・次の方どうぞ
頂点シェーダに1頂点送った後、戻り値をピクセルシェーダに送った時のピクセルシェーダの処理はどうなってるんですか? 補間されると書いてあるんですが、頂点シェーダから3頂点送られてくるまでピクセルシェーダは待ってくれるんですか? 1頂点で補間ってイメージできないんですが、どうなってるんでしょうか
おちついて自分の文章読み直して推敲してみろ エスパーするが、シェーダ云々以前にDirect3Dが描画する基本単位は 『頂点』ではなく『頂点三つからなる三角形』だ。
わかりません、VertexShaderの引数にたとえば float4 VertexShader(float4 Position : POSITION) : COLOR とすると VertexShader関数に送られるのは1頂点づつですよね、でreturnされたものが float4 PixelShader(float4 Color : COLOR) : COLOR の引数Colorに入れられるまでが1頂点じゃないんですか? pass一回で指定した数のプリミティブを送ってるのはわかるんですが、データの流れが1頂点づつに見えるんです
>>546 頂点を1つづつVertexShaderで処理し終わったら、
VertexShaderから3つの頂点を与えられた「ラスタライザ」というユニットが
それの中を補完し、ラスタデータ単位で、PixelShaderに与えるんだ。
だからPixelShaderの引数は頂点でもポリゴンでもない。
ラスタデータだ。(ラスタデータからピクセルデータを作るからPixelShaderっていうんだよ。)
ちなみにラスタデータってのはピクセルのように必ずしも色じゃないんだが、
色を作るための情報をピクセルと同じように、
平面を分割するという方法で持ってるデータだな。
たとえばテクスチャのUV値なんかも、ラスタデータは持てる。
これは色じゃないが、ピクセルシェーダによってテクスチャを引いてくりゃ色になるだろ。
なるほどわかりました。1頂点づつVS、PSをループしてると思ってました。 すごくよくわかりました。ピクセルシェーダを使いこなせるのは当分先なこともわかりました。 ありがとうございました!
基本的に一週間ごとにループするのですが 祠に入れたものは引き継ぐ方法はありますか?
お前の適応係数高そうだなw
すみません。ラスタライザの動作原理については完全に精通したのですが 学校を中退することにしたので作る必要がなくなりました
passでテクスチャを描画した後に、半透明ONにしてD3DBLEND_SRCCOLORでVSで作った float4(1.0, 1.0, 1.0, 0.2) : COLOR をそのままPSに贈ったんですが、テクスチャと合成されません。テクスチャ描画の前に半透明ONにすると下まで全部透けるので上乗せしたいCOLOR のアルファ値でテクスチャの色合いを変化させたいんですが、アルファ値1.0より小さくしてもテクスチャが透けないんです。どうなってるんですか?
質問がおおざっぱだから間違いの原因が推測できなくて返事が来ないパターン。
テクスチャ描画まではうまくいくんですが、パスCOLORがブレンドされないんです Draw(){ パステクスチャで描画; // テクスチャは描画される SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCCOLOR); パスCOLORで描画; // 一色で埋まるがテクスチャとブレンドされない SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); } //.fx テクニック{ パステクスチャ{ VS PS } パスCOLOR{ float4 VS(posision) : COLOR{return float4(1.0, 1.0, 1.0, 0.2)} PS(float4 in : COLOR) : COLOR{return in} } }
SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
なるほど!第2引数はどの値を使うかってことだったんですね アルファ値で掛け合わされるのかと思いました、ありがとうございました。 もう少しで波に乗れそうなんです、またお願いします!
波乗り野郎
ポリゴン描画速度について教えてください。 D3DPT_TRIANGLELISTに比べて、D3DPT_TRIANGLESTRIPやD3DPT_TRIANGLEFANは劇的に高速になるのでしょうか? もしそうであれば、例えば1万程度の頂点数の物体描画する時に、 全てD3DPT_TRIANGLELISTで描画せずに、インデックス情報組み立て時に、 物凄い工夫して分析して、出来る限りD3DPT_TRIANGLESTRIPやD3DPT_TRIANGLEFANで描ける部分を抽出し、 それぞれ別個に描画するという物凄い手間をかける価値はあるのでしょうか?
描画の高速化が求められるような巨大なモデルをSTRIPやFANにいつでもわける方法がないので、 ごく限られた形状に対して最適化するのは可能です。
可能なのは当たり前だろ 質問は >価値はあるのでしょうか? ほとんど価値はない。
562 :
559 :2009/04/19(日) 19:01:08
レスありがとうございます。 自分が考えてる最も簡単なものはTRIANGLELIST用グループとFAN用グループに分けて、 頂点からの接続ラインが一定数以上のものを検索してFAN用グループに移動。 これの繰り返しで例えば人体モデルなら全身に斑点が出来るようにFAN用グループが削り取られて、 余った部分をTRIANGLELISTで描画。 効果が絶大であればトライする価値があるかなと思いました。
GAME PROGRAMMING GEMS の2巻以降って買う価値1と同じぐらいありますか?いきなり内容薄くならないですよね? 1に感動したのに12までこの濃さで続くんですか?最新から買うといいとかどっかで見たんですが1を読んだ後は1からだとしか思えません
目次などを参考にして、あなたが必要とするものを手に入れればいいでしょう。
図書館や本屋で立ち読みしてくればいい 田舎だと厳しいが
シェーダー使用プログラムからシェーダー無しプログラムにする方法を教えて下さい
無理デブ
高速になる可能性があるのは、STRIPの飛び島のような群を縮退ポリゴンで連結し、 一回のDrawPrimitveで済ませるときだけ。それ以外は全敗北。 と4〜5年前は思っていたけど、いまでもこんな感じ?
だいたい合ってる スキンメッシュなんかはシェーダではやらない 何回も塗る必要があるからやっぱり汎用性重視
俺はやるけど
>>571 スキンをシェーダでやると
バンプ+スキン
バンプ+ノーマル
スペキュラ+スキン
スペキュラ+ノーマル
・
・
・
みたいにエフェクトごとにスキン有無全部作らないといけなくて面倒だぞ
まあ、面倒なだけだけど
頂点変換部分とかを#defineで有り無しで分けといて、 バッチファイル使ってfxcで必要な分吐くだけなのに何がめんどいんだ?
>>573 別にスキンメッシュに限らないけど
頂点変換あるたびそれ入れんのー?w
やりづれー
単体ならシェーダが早いけど、 シャドウマップ×3・本体・本体鏡像 の例では5回もスキニングの計算やるより 自前でメモリ上に変換したやつを使った方がいいのだろうな。 DX10ならそれもHWでできるし。
スキニングの]計算つってるけど数千頂点程度なら VertexShaderの負荷なんてPixelShaderとか αブレンドなんかに比べるとゴミみたいなもんだぞ。
>>574 俺は簡単なシェーダジェネレータ作ってある程度自動生成させてるからそれほどでもない
スキニングありが必須で、 スキニングなしのモデルは、 スキニングのウエイト数0とするのが吉
FX Composer使いだしたら手書きとかすることなくなる?
FX Composerは手書き用だろ?
手書きがいやなら既存のエンジン使えってはなしだな
ボーンの入ってないプレーンなメッシュを表示できるようになったので マルチトラックのスキンメッシュをアニメーション表示するサンプルを勉強してますた で、スキンメッシュそのものをアニメーションさせることはできるようになったんですが そのコードにプレーンなメッシュも描画するコードを加えたところ、 スキンメッシュをDrawSubSetした後にプレーンなメッシュをDrawSubSetすると 0x7c812afb で初回の例外が発生しました: Microsoft C++ の例外: long (メモリの場所 0x0012fb28)。 と出力ウインドウに表示されてプレーンなメッシュのほうが表示されません しかし、エラーでとまるわけでもなくスキンメッシュのほうだけは正常に表示されます スキンメッシュかプレーンなメッシュか片方だけをDrawSubSetすると正常に表示されます ぐぐったところBeginScene()とEndScene()の間でDrawSubSetしていなかったというブログはみつかったものの コードを確認したところそのミスはしておらず、どこを修正すればいいのかわからなくて困っています 同じような症状を解決されたかたはいませんでしょうか?
それはいくらなんでもコード出してもらわないと何も言いようがない
DrawIndexedPrimitive で、複数の頂点ストリームから インデックス形式で描画できないのでしょうか? たとえば、頂点座標ストリームは0、法線ストリームは1、UVはストリーム2と指定して、 それぞれのインデックスを1,2,2 のように3つずつ与えて描画したいのですが
頂点ストリームは分割できるがインデックスは1つだ。
ありがとうございました やっぱりできないのですね これができればモデル容量をかなり減らせると思ったのですが
>>586 別々に指定してもせいぜい法線がちょっと減らせる程度だと思うが・・・。
そもそも別途頂点ごとにインデックスが必要になるから煩雑になるし。
洋ゲーは断面がもてはやされて羨ましいよね。 日本だと俺がどれだけやりたがっても通らない。 デザイナーもやりたがらないし。
>>579 出力するファイルが微妙だし、無料版は機能制限あるが、そういうのはmental millだな
断面って何の断面?
DS_INCOMPLETEを使うと、定義されていないとコンパイルエラーが出ますが、どこで定義されてるんでしょう? MSDN見る限り値自体は0x08780014のようなのですが、これを使えばいいんですかね。
598 :
595 :2009/04/21(火) 16:48:58
ぼくのDirectX SDK March 2009のdsound.hにはありませんね。 とりあえず、dsound.hのインクルードの後、定義されてなければ定義する方向でやってみます。 ありがとうございました。
#define DIRECTSOUND_VERSION 0x0800 /* Version 8.0 */ 9で無くなったのか
600 :
595 :2009/04/21(火) 16:57:58
ちなみに2009MarchSDK付属ドキュメントの"DirectSound Return Values by Nunber"には載ってました。
601 :
582 :2009/04/21(火) 19:43:21
事故解決しますた スキンメッシュをDrawしたあと、 プレーンなメッシュをDrawするまえに pDevice->SetRenderState(D3DRS_VERTEXBLEND, 0); をすることでエラーでなくなりまつた
セルフシャドーはどうやって作ればいいんですか?
DirectXに手を出すならまずはこれっていう定番参考書ってありますか?
ヘルプのチュートリアル
SDKのサンプル
607 :
デフォルトの名無しさん :2009/04/22(水) 20:43:04
DirectX逆引き500
Xファイルから属性テーブルを抜き出して モデルを描画したいのですが、 pMesh->GetAttributeTable(NULL, &sz); D3DXATTRIBUTERANGE* g_pAttrTable = new D3DXATTRIBUTERANGE[sz]; pMesh->GetAttributeTable(g_pAttrTable, &sz); これで属性テーブルを抜き出した後どうすれば良いでしょうか? DrawIndexedPrimitiveで使おうとするとエラーがでてしまいます
D3DXATTRIBUTERANGE::FaceStartとFaceCountはポリゴン単位の数値で、 DrawIndexedPrimitiveのインデックスに使うにはFaceStart * 3, FaceCount * 3にする必要があるとかじゃね
>>609 Count * 3でできました
ありがとうございます!
611 :
デフォルトの名無しさん :2009/04/23(木) 18:40:36
directsoundで音声キャプチャしながら再生しようと思っています キャプチャバッファ->Lock( g_dwNextCaptureOffset, lLockSize, &pbCaptureData, &dwCaptureLength, &pbCaptureData2, &dwCaptureLength2, 0L ); 再生バッファ->Lock( 0, size, &pbPlayData, &dwPlayLength, &pDate, &dwLength, 0 ); 再生バッファ->Unlock( pbPlayData, dwPlayLength, pDate, dwLength ); キャプチャバッファ->Unlock( pbCaptureData, dwCaptureLength, pbCaptureData2, dwCaptureLength2 ); 再生バッファをロックしたあとキャプチャバッファからデータをコピーしたいのですが上手くいきません。どなたかご教授おねがいします。
すいません質問です。 DirectXでGPUで計算して頂点変換を行っているゲームを作っています。(固定変換ではなくシェーダーで) 一台目:グラボありのデスクトップパソコン 二台目:グラボなしのミニノートパソコン でチェックをしています。 しかし現在だとノートだとグラボがない為、 バーテックスシェーダー・ピクセルシェーダーがバージョンが低く動かせません。 CPUで変換するとノートPCでもPCでも動くんですけど、 CPUじゃもちろんGPU変換ほど速度でませんよね? 市販の3DゲームはノートPCでもグラボありのデクストップでも両方動作してますが それはグラボの有無を認識してCPUかGPU計算か判断してるのでしょうか? それともノートでもバージョンによってはGPUの計算が出来るのでしょうか? もし前者であればグラボの有無を確認する方法を教えてくれたらありがたいです。 後者であれば何かヒントをくれるとありがたいです。
D3DVS_VERSION D3DPS_VERSION でぐぐれば幸せになれるかもしれない
D3DCAPS9のVertexShaderVersionの値を見てみて判断しろってことでしょうか?
>>613 ノートPCつってもネットブックやミニノートでもなきゃ
普通にビデオカード積んでるし。
ノート云々関係なくシェーダーのバージョンチェックはちゃんとするべき。
オンボードのはカードと言わずチップと言う /) ///) /,.=゙''"/ / i f ,.r='"-‐'つ____ こまけぇこたぁいいんだよ!! / / _,.-‐'~/⌒ ⌒\ / ,i ,二ニ⊃( ●). (●)\ / ノ il゙フ::::::⌒(__人__)⌒::::: \ ,イ「ト、 ,!,!| |r┬-| | / iトヾヽ_/ィ"\ `ー'´ /
ノートだったらチップセットに内蔵のだろ
最近の上位ノートはちゃんとグラフィックチップ乗っけてるのが多いよ グラフィックカードを買い換える気分でノートを買い換えたくなるから困る
620 :
611 :2009/04/24(金) 19:59:47
どなたかお願いします そもそも再生バッファをロックしたあとn
DirectShow使えば
固定機能ではテクスチャを張った物体にライティングは適用されないんですか?
ライトつくよ
SetTextureStageStateで色を動的に変えていたのが原因でした。
どういうこと?ループの外でライトの設定してループ内でテクスチャを切り替えてたってこと?
D3DTA_DIFFUSEをかけ忘れて、D3DTA_TEXTUREとD3DTA_TFACTORだけかけていました
シェーダに比べたら固定機能の方が複雑怪奇なのに なんで初心者はそっちを選ぶの?
最初の実装までが面倒 シェーダー言語の解説がほとんど無い そもそも凝ったことするつもりが無い この辺かな?
ハードウェアシェーダがない…とか
シェーダーの解説がないとかDirectX8時代じゃねんだぞ・・・ 捨てるほどネット上に転がってるじゃねぇか。
あるベクトルを基準としてもう一つのベクトルがx軸、y軸、z軸に何度回転しているか調べるってどうやれば出来ますか?
それぞれの平面に射影して内積すりゃいいんじゃね
>>631 1軸固定ならそれなりに楽なんだけど?
ホントに全部回転してなきゃダメなの?
2軸の回転までなら連立方程式でいけるけど 何軸で回転してるのかすら分からないんじゃハイコストすぎて計算する気が起きない たぶんだけど、ベクトルの回転角度が必要なんじゃなくて ある方向を指すための回転ベクトルが必要なんじゃないの? 本当にやりたいことを省略せずに書いてごらん
文章読む分には、ベクトル→オイラー角の変換がやりたいんじゃね? どうやるんだったっけw
ん。今思いついたけど、 ローテーションオーダー順に軸の向きを向くように回転させていけばいいだけじゃね? だめ?
深度バッファシャドウってどういう仕組みになってるのか全然わかりません 全ての頂点に1−0の範囲で深度値を作った後、光に遮られてるかどうかはどうやって計算すればいいんですか? 光点と調査点の間に遮蔽物があるかどうかを調べるには1調査点につき全ての存在する点を調べないといけなく無いですか? ありえないんですけど、どうなってるんですか?
頂点を作る時にUV座標有りと無しを混在させてまとめて渡すにはどうすればいいんですか? 複数面がある物体を点で手動で描いたんですが一部だけテクスチャを張り付けたくないんですが頂点タイプの混在をしたいんです
とりあえず固定機能でやってるのかシェーダーでやってるのかくらい書こうぜ
>>637 >全ての頂点に1−0の範囲で深度値を作った後、
これは、シャドウマップを作るってことでいいんだよな。
そのシャドウマップを作る為に求めた深度値を
各参照点につき、もう一度同じ計算で求め、深度値と比較する。
これはピクセルシェーダの工程だから、ピクセル毎に行う。
sShadowDepth = tex2Dproj( spShadowMap, vVertPosInLight );
sDepth = vVertPosInLight.z / vVertPosInLight.w;
sAlpha = sDepth > sShadowDepth : 0.0f : 1.0f;
641 :
631 :2009/04/28(火) 08:41:17
>>632 ,633
1軸固定して射影してあげればいいんですかね。試してみます。
>>634 はい、ある方向を指すための回転行列が欲しいです。
>>635 今後の勉強のためにベクトル→オイラー角のやり方を質問しました。
そして、オイラー角から回転行列を求めようと思っていました。
643 :
デフォルトの名無しさん :2009/04/28(火) 10:58:31
行列から角度を逆算する方法を模索中です。 只今、メッシュに親子関係を持たせるクラスを設計しています。 概ね描画も出来てroot(一番上の親)を回転や移動をすると、子や兄弟も 一緒に動くまでは、実装できました。 そこまでは、単純に行列の積で出せるので、出来たんですが。 そこから、当たり判定などをつける際に躓きました。 OBB判定などを行う場合メッシュの絶対位置や絶対スケール、 絶対角度が必要になってしまいます。 しかし、行列から位置は(mat._41,mat._42,mat._43)を取り出し、 スケールは、rootまでをたどり単純に掛け算をして求められたんですが(コストかかりすぎですが。。。) 角度だけがどうにもならず苦戦しています。 位置はよしとして、スケール及び角度をスマートに行列から逆算する方法はないでしょうか? よろしくお願いします。
OBBは姿勢(各メッシュのワールド行列)と 各軸のサイズが分かっていれば計算できるのになんで角度が必要なの?
645 :
デフォルトの名無しさん :2009/04/28(火) 11:39:31
>>644 すみません、大きな勘違いをしてました・・・
自己解決しました・・スレ汚しすいませんでした・・・
野暮なこと言うが こういうのって絶対自己じゃないよな 自尊心が過大すぎるんだろう
そもそも成分を分離して持っておけばいいだけなのに、 なぜか行列一本でやろうとして無駄なコストをかけようとするのが不思議でならない。
姿勢の掛け算は行列の方が早いけどな
コストてか すでに表示してる以上姿勢は既に分かってるんだから計算するまでもないだろ
DirectInput使うとウイルスバスターから警告が出るんですけど、どうにかなりませんか? このプログラムは自動的にDLLを読み込む設定にどうのこうのって警告されます
ウイルスバスターをアンインストール
それDirectInput8Create使わなくても出るんだっけ
リリースならビルドしてから1日放置すると出なくなるよ
質問です。Direct3D9 SDK (2004 August) を使っています。 ビューポートの MinZ、MaxZ をそれぞれ 0.0f、1.0f にしています。 ところが、とあるマシンで、z 座標がちょうど 1.0f の座標変換済み頂点(D3DFVF_XYZRHW)が描画されない現象が起きました。 (現象が起きたのはノートPCで、グラフィックカードは dxdiag で調べたところ Mobile Intel(R) 945GM Express Chipset Family とありました。) これはデバイスの能力の問題なのでしょうか。つまり、D3DCAPS9 の何らかの値を調べることで、判定できる問題なのでしょうか? それとも、仕様と割り切って、1.0f ちょうどの頂点は作らないようにするべきなのでしょうか。 よろしくお願いします。
DirectXのチュートリアルでは座標変換済み頂点のZ座標は0.5fになってるし、たぶん仕様だと思う っていうか俺の環境だと1.0fは描画されないから、むしろ描画されないものだと思っていた ちなみにビデオカードはnVIDIAのGTX280
なるほど…。 Radeon、Geforce 含む複数の環境で正常に描画されていたので安心してたのですが、 念のため 0.1f 〜 0.9f あたりにまるめるように組んでいこうと思います。 ありがとうございました!
1.0は外界でしょう。
>>265 これってローカルで見たい。
MSDNライブラリに入っていますか?
無 限 次 元 平 行 宇 宙(次元が無限であり、この宇宙ではないので比較不可)  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 10 次 元 バ ル ク 空 間(次元が異なるため比較不可能)  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 膜 宇 宙(太陽の∞倍)  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ グ レ ー ト ウ ォ ー ル  ̄ ̄ ――__(長さ:太陽の3500兆倍、幅:太陽の2100兆倍)__―- ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ _,,,,,,,,_ /` `'i、 超銀河団(太陽の約680兆倍) | l ゙l、 / `'ー---'" 銀河系(太陽の6800万倍) o IRS5(太陽の10000倍の恒星の種) ・ 太陽(直径13万km) 地球 (直径1.27万km)
660 :
デフォルトの名無しさん :2009/05/02(土) 15:14:35
質問です。環境は XP DirectX9 VC++2005 です。 頂点バッファなのですが、「CreateVertexBuffer」で サイズを指定してメモリを確保していると思いますが、 これはデバイスタイプが「D3DDEVTYPE_HAL」の時は ビデオメモリ上に確保されプリミティブ描画時にハードウェア処理される ということで合ってますでしょうか? 迷っていることは、プリミティブが動的に変化する場合、 頂点が増える減るたびに頂点バッファを作り直さなければならない のかと言う点です。 自分の結論としては作り直さなければならないという結論が出ました。 変更があるたびにリリース→作成としなければならないので レスポンスが悪いなと感じているんですがしょうがないのでしょうか? みなさんどうされていますか?
>>660 違う。
バッファが作られる先は、CreateVertexBufferの第4引数
のPOOLで決まる。
662 :
デフォルトの名無しさん :2009/05/02(土) 15:36:30
>>661 即レスありがとうございます。
ちょっと「Pool」について日本語ヘルプ見てみます。
自分のコードは「D3DPOOL_MANAGED」使ってました。
ヘルプ見る限りでは、
”D3DPOOL_MANAGED は、ほとんどのアプリケーションで
D3DPOOL_DEFAULT よりも適している場合が多い。”
と書いてあるので、「MANAGED」使えばいいのかなと思いますが、
これはビデオメモリを使っているということなんですかね?
ハードとドライバ次第
664 :
デフォルトの名無しさん :2009/05/02(土) 15:46:59
>>663 ハードウェア次第でビデオメモリが使われるわけですね。
自分がしたいと思っていることは動的な頂点バッファの使用方法ですが、
「Pool」からたどっていくと、
ヘルプにそれらしきことが書いてありました!!
ちょっとヘルプ読んでみます。
動的な頂点バッファって使ったことありますか?
どさくさにまぎれてまた質問してすいません。
665 :
デフォルトの名無しさん :2009/05/02(土) 17:11:01
660です。 そもそも勘違いしていたようです。 動的な頂点バッファとは頂点の追加や挿入・削除が可能なものと 思っていましたが、動的な頂点バッファでも頂点数はやっぱり 固定みたいです。位置とか色とかを動的に変更できるものかと。 そうすると求めているものとは違うので、 (私は頂点を追加したり挿入したり削除したい) 自分で動的配列作って「DrawPrimitiveUP」を呼ぶようにするしか 無いと思っています。 自分で用意するとなるとビデオメモリは使えなくなるので、 パフォーマンスが低下すると思います。 みなさん「DrawPrimitiveUP」って使ったりしてますか?
>>665 頂点バッファを使う場合に、最大の頂点数が事前に分かっていれば、
それに合わせて作ればいい。
あるいは足りなくなったときだけサイズを拡張する方法が良いかと。
もし毎フレーム頂点バッファの内容が変わるなら、Lockの仕方とかも
注意が必要なので、面倒ならUP系でドライバ任せが一番いい。
UP系は頂点バッファを適切に使うよりほんの少しだけ遅いが、十分速い。
頂点バッファの使い方が下手ならUP系の方が速い。
667 :
デフォルトの名無しさん :2009/05/02(土) 18:53:20
>666 さん 回答ありがとうございます。 頂点の座標は毎フレームで変わりますし、入力パラメータ次第で、 頂点数も変わります。曲面の詳細度制御みたいなことをさせたいので。 このような場合は自分で頂点を管理した方が良いってことですよね?
バッファが足りない場合だけ作り直すようにすれば? そもそも実際に組んで問題が出ることを確認する前からゴチャゴチャ考えるのは時間の無駄。
>>667 それ、DirectX9じゃないとダメ?
10以降だともうちょっといい解決方法あると思うんだが。
670 :
デフォルトの名無しさん :2009/05/02(土) 22:12:58
>>668 バッファが足りない場合だけというはちょっとピンとこないです。
最初に100個とか確保しておくとか言うことでしょうか。
足りなくなれば頂点バッファを作成しなおして、少ない場合は
使い回すって事ですかね、複雑になりそうな気がするのですが。
実際に組んでないんで申し訳ないですが、組む前の展望が欲しいのです。
>>669 9でお願いします。持ってる本、動作環境、日本語ヘルプの関係からです。
671 :
デフォルトの名無しさん :2009/05/02(土) 22:20:17
>>670 まったく組んでない訳ではないです(汗。
頂点バッファ使ってプリミティブ描画までは行ったのですが、
頂点バッファって固定長の配列じゃね?ってとこでつまづいてます。
ダメだこいつ。 どんなアドバイスを受けても、ゴチャゴチャ言って何もしないタイプだ。
UP系だってドライバ依存の何か特別な技術で動いてるわけじゃなく、 ユーティリティ関数の類。 要するに、サイズ自動伸張などを隠蔽した動的頂点バッファだよ。
674 :
デフォルトの名無しさん :2009/05/03(日) 00:52:29
>>673 意味分からないですけど、勉強になります。
質問しながらいろいろと調べて勉強になりました。
とりえあず色々やってみようと思います。
みなさん、あざっす。
気になったんだけどD3DPOOL_DEFAULTとD3DPOOL_MANAGEDって、D3DPOOL_DEFAULTのほうがシステムメモリ使わなくて高速ですよね? それとも速度とか変わらなかったりします?
DirectDrawのサーフェイス感覚かよ。
677 :
デフォルトの名無しさん :2009/05/03(日) 07:32:12
>>675 8000ポリで切り替えて試してみましたが、速度変わらかったっす。
どっちもビデオメモリ使ってるみたいですね。
ヘルプで推奨されてるぐらいだからMANAGEDで良いのでは。
678 :
デフォルトの名無しさん :2009/05/03(日) 07:40:31
固定機能パイプラインって何者?
>>675 D3DPOOL_MANAGEDは、デバイスロストした際に中身を復元できるように
システムメモリにコピーを持っているだけで、テクスチャそのものはVRAMに
乗っているから、速度は変わらないよ。
D3DPOOL_MANAGEDの仕事は
・デバイスロストした再に自動で中身を復元する
・テクスチャがVRAMに収まりきらないときに自動的に必要性の低いテクスチャを解放する
主にこの2つ。
前者はともかく、後者のテクスチャ管理は自分で実装すると結構面倒。
D3DXCreateSphereで作成したメッシュにテクスチャを貼りたいのですが、何故かテクスチャの継ぎ目が変になってしまいます。
どこが間違っているのでしょうか。教えてください。
・ソース
Vertex3D *data; //FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_TEX1;
HRESULT hr = mesh->LockVertexBuffer(0, (void**)&data);
if FAILED(hr) return;
unsigned int num = mesh->GetNumVertices();
for (unsigned int i = 0; i < num; i++) {
//rは球の半径
float x = data[i].x / r;
float y = data[i].y / r;
float z = data[i].z / r;
float phi = acos(y);
data[i].tv = (float)(phi / D3DX_PI);
if (y == 1.0f || y == -1.0f) {
data[i].tu = 0.5f;
} else {
data[i].tu = (float)(acos(max(-1.0, min(1.0, z / sin(phi)))) / (2.0 * D3DX_PI));
}
if (x > 0) data[i].tu = 1.0f - data[i].tu;
}
・参考
http://msdn.microsoft.com/ja-jp/library/bb932345.aspx
コード読まずに書くが、テクスチャのWRAPは正しく設定してる?
オレも読まずに書くけどメッシュの球にテクスチャ貼ったら継ぎ目が変になったっけな。
だぶんとかいい加減な答えを書く前に、 何を設定しているのか具体的にかけよ。
球で繋ぎ目っていえばWRAPだからな
687 :
デフォルトの名無しさん :2009/05/04(月) 18:07:33
DirectShowに出来て、WindowsMediaPlayerコントロールに出来ない事教えて下さい。
688 :
デフォルトの名無しさん :2009/05/04(月) 18:08:48
再生のときにもたついてユーザをイライラさせること
>>681 テクスチャラッピング?
SetRenderState(D3DRS_WRAP0, D3DWRAPCOORD_0)
691 :
デフォルトの名無しさん :2009/05/04(月) 20:04:26
ラトルズの15歳から始めるC++ DirectX 9プログラミングで勉強してるんですが my3dlib.cppに #include "my3dlib.h" //グローバル変数 LPDIRECT3D9 g_pD3D = NULL; LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; float g_aspect = 1.0f; と書いて my3dlib.hに struct Model{ LPD3DXMESH pmesh; D3DMATERIAL9* pmaterials; LPDIRECT3DTEXTURE9* ptextures; DWORD nummaterials; BOOL used; } extern LPDIRECT3D9 g_pD3D; extern LPDIRECT3DDEVICE9 g_pd3dDevice; extern float g_aspect; と記述すると 型指定子がありませんってエラーがでるんですがどうすればいいんでしょうか? structの部分がないとエラーは出ないんですが・・・
つ セミコロン
ま・・・まさかそんな問題で3日も悩んだというのか!! すいません
DirectXの勉強だけではなくC++の基礎も勉強しておかないと、これからも躓くと思うよ。 実行時のバグではなくコンパイル時のエラーはかなり分かりやすい問題だから、早く自力で解けるようになったほうがいい。
よくある事だ、気にすんな
696 :
デフォルトの名無しさん :2009/05/04(月) 23:24:59
tes
697 :
デフォルトの名無しさん :2009/05/04(月) 23:25:47
ID3DXMESHのGetFVFで返された値が3435973836なのですが どういうFVFの組み合わせかわかりますか?
3435973836って16進で0xcccccccc
dmusici.hをインクルードしようとしたらファイルがないって出るんだけどオミットされたの?
とっくに無くなってる。 2007年あたりのを入れてみては
702 :
デフォルトの名無しさん :2009/05/05(火) 14:13:50
703 :
デフォルトの名無しさん :2009/05/05(火) 17:07:05
頂点フォーマットの定数を調べたいのでGetFVF()メソッドで値を取得したら 0x00000152でした。 d3dtypes.hの宣言やヘルプを見ても何を指しているか分かりませんでした。 0x00000152はどの定数の組み合わせなのでしょうか、分析方法教えてください>< 10進数に直すと338でした。
10進にしてどうするよ。 2進数になおしたほうがわかりやすいだろう。 まあ0x0152は 0x0100、0x0040、0x0010、0x0002 にわけられるよね。 1,2,4,8でわけるのさ
直すなら、2進数に直せよ
706 :
デフォルトの名無しさん :2009/05/05(火) 17:46:36
SkinnedMesh(DXUT)はSleep(0)を使っている事がわかりました。 一般にゲームを作る場合はSleep(0)を使うのが良いのですか? フレームレート解説サイトではSleep(1)を推奨していますが3D描画となると Sleep(1)では遅すぎます。 皆さんはどうしてますか?
Sleep(0)は強制コンテキストスイッチの為に用いられる。 そのサンプルもスレッドをスリープする為には使ってないんじゃないか。
709 :
706 :2009/05/05(火) 19:06:34
答えを導く方法を調べていたのですが 2進数に変換までできました 0x0152 ↓ 0000 0001 0101 0010 そのあとの >まあ0x0152は 0x0100、0x0040、0x0010、0x0002 にわけられるよね。 1,2,4,8でわけるのさ が理解できないのですがもう少し詳しく教えていただけませんが スレ違いですいません;;
ゲームを作る場合は while ( TRUE ) { if ( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) ) { if ( !GetMessage(&msg, NULL, 0, 0) ) break; TranslateMessage(&msg); DispatchMessage(&msg); } else { //UpdateFrame(); Sleep(1); } } ってするよりメインループを別スレッドにした方が良いの?
711 :
デフォルトの名無しさん :2009/05/05(火) 19:46:04
XFileを読み込んでID3DXMESHオブジェクトにした後 頂点バッファー(座標やディフューズ等)を直接見たいんだけどどうすればいいのかな? GetVertexBufferメソッドで頂点バッファを取得して GetDescメソッドでブレークポイントを置いて自動変数見たけど目的の物が見えませんでした
データを直接見るほど電脳視覚デバイスは発達していません。 盲人が視覚を得るということを目標に研究はされているらしいけど。
713 :
711 :2009/05/05(火) 20:00:59
すんません、言い方が悪かったですw UV値がちゃんと渡されているか確認したかったんです なにかやり方ありませんかね? GetDescメソッドじゃリソースの記述しか見れなくて・・・
>>711 >>681 のようにVertexBufferをロックしてみる。
>>712 お前このスレに常駐して、クソにもならないレスを
返す方ですか?ウザいんでしんでくさい。
最初にSYSTEMMEM付きでロードする。何かCPUで計算なり加工する。 そのあと、描画用のメッシュはCloneMeshでSYSTEMMEMを持たせないで複製したものを使う。 最初のがいらなくなったらそっちは開放する。 こういう手順を起動時に毎回やるのが煩雑だか非効率と思えるようになった人は、自作フォーマットの段階へ進む。
>>710 00000001 → 0x01
00000010 → 0x02
00000100 → 0x04
00001000 → 0x08
わかる?
718 :
デフォルトの名無しさん :2009/05/06(水) 20:40:17
XAudio2とOggVorbisでストリーミング再生試してるんだけど、 あきらかにバッファリングが追いついてなくて音がブチブチするのは どうすればいいんだぜ? OnBufferEndコールバックのたびにov_readしちゃだめ?
スレ違いだと思うよ
720 :
デフォルトの名無しさん :2009/05/06(水) 20:53:45
xnaで聞いた方がいいのか? あっちいってくる
721 :
718 :2009/05/06(水) 21:06:42
テクスチャを指定した範囲でラッピングしたりできますか?
なぜ719がXAudio2の話題をスレ違いだと思ったのか聞きたい。
724 :
718 :2009/05/07(木) 03:14:07
まだDirectX5とか触ってる人なんじゃないかな。
xaudioというライブラリがあるからそっちと勘違いでもしたのかね まずありえないがな
メタセコイヤで出力したX形式のファイルを自分なりの形式に変換したいのですが わからないところがあるので質問します。上部8ポリゴン・下部8ポリゴン・側面16ポリゴンの円柱を作りました。 Mesh { 34; 0.00000;3.04100;0.00000;, : 0.00000;-3.04100;-0.24500;; 32; 3;0,1,2;, : 3;16,31,14;; } MeshNormals { 18; 0.000000;1.000000;0.000000;, : -0.603748;0.000000;-0.797175;; 32; 3;0,0,0;, : 3;5,17,16;; } MeshTextureCoords { 34; 0.062500;0.000000;, : 1.000000;1.000000;; } 頂点と法線データについては最初の数値が各頂点のデータで 後の数値がその組み合わせ(三角形なので3個1セット)なのはわかるんですが なんで32ポリゴンしかないのに34個の頂点データがあるんでしょうか?
>>726 Triangle Fanだと中心に1個必要だからその分じゃないの
UV座標の差異で34個になってると思われ
>>726 側面部分は海苔巻きの海苔のようにポリゴンを張っていると思うが、
巻き始めと巻き終わりの部分は頂点位置は同じでもテクスチャ座標が違う。
開始位置のテクスチャ座標が0で、終了位置は1になっているかと。
テクスチャラッピングという機能を使えば、終了位置のテクスチャ座標を
0にできるが、普通はそんな設定は使わない。
アニメーションとかする気が無いなら直接mqoを読んだほうが何かと便利かもしれない
advancetimeが使い辛い件 settime化出来ないの?
732 :
デフォルトの名無しさん :2009/05/07(木) 21:55:29
XAudio2ってもしかして音声入力キャプチャできない?
Xファイルを読み込んだ後、解放するとメモリリークしてしまいますが、原因が分かりません。 D3DXLoadMeshFromX( strXFile, D3DXMESH_SYSTEMMEM, pD3DDevice, NULL, &m_pMtrlBuff, NULL, &m_MtrlNumTotal, &m_pMesh ); ↓コンパイラのエラーメッセージ D3DX: MEMORY LEAKS DETECTED: 2 allocations unfreed (3824 bytes) 上記読み込み関数だけをコメントアウトするとリークがなくなるので、これが原因なのは 間違いないと思います。 引数の&m_pMeshのところをNULLにしてもリークしなかったので、m_pMeshが解放しきれていない ようですが、なぜなのかが分かりません・・・ 読み込むXファイルはメタセコイアで出力したものです。 試しに書籍のCD-ROMに収録されているXファイルモデルも読み込んでみましたが同様でした。 怪しいとしたらどこでしょうか? ご助言、よろしくお願いしますm(_ _)m
SAFE_RELEASE( m_pMtrlBuff ); SAFE_RELEASE( m_pMesh ); の両方を常にやる
735 :
デフォルトの名無しさん :2009/05/07(木) 22:07:19
Xファイルに自信が無いならSDKに入ってるトラとかでやってみれば? とりあえず第2引数をD3DXMESH_MANAGEDにしたい
736 :
733 :2009/05/07(木) 22:09:01
>>734 あー!直りましたー!
助かりましたー!
ほんとうにありがとうございましたぁ! !。゜(゜´∀`゜)゜。
>>735 ありがとうございます!
MANAGEDにします!
737 :
733 :2009/05/07(木) 22:26:59
>>735 MANAGEDにしたらfpsが300から1300に跳ね上がりました (;゚д゚)
ご助言ありがとうございました!
(これからは引数のことをよく調べてから使うようにします・・・)
738 :
726 :2009/05/07(木) 23:34:57
どうやらUVによる差異のようでした。 32ポリゴン普通に描画してみたら不具合もなく大丈夫でした。 ありがとうございます。
すいません質問です。 シェーダーを使って描画をしているんですが .oファイルがいつのまにか生成されるんですが こちらは.fxのコンパイル後のデータなんでしょうか? こちらを使って描画する方法などありましたらご教授お願いします。 ググってみても.oファイルが見当たりません。
nVIDIAシャドウことPCFの存在を知ったのですが、具体的にどうやって適用するんでしょうか? そのようなHLSL命令があるのでしょうか??
nVidiaのNVSDKの中にサンプルあるだろ。ダウンロードしてまずは読め。
742 :
740 :2009/05/08(金) 21:28:55
743 :
739 :2009/05/09(土) 04:25:46
自己解決しましたありがとうございました。
pDevice->CreateTexture( 256, 256, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8B8G8R8, D3DPOOL_DEFAULT, &pTexture, NULL ); こんな感じでテクスチャを生成すると失敗してしまい、戻り値を調べるとD3DERR_INVALIDCALLでした 試しにD3DXCreateTextureから生成するとうまくいったんですが、これはどこか間違っていますか?
レンダーターゲットでD3DFMT_A8B8G8R8が使えるハードはあまりないと思うけど D3DFMT_A8R8G8B8の間違いでは?
>>745 ありがとうございます!動きました!!
フォーマットをMSDNのところからコピペしたので
間違って選んでしまってました
>>746 ちゃんと使えるフォーマットを調べて初期化するようにしないと環境ごとに動いたり動かなかったり面倒だぞ。
いわゆる残像エフェクトを実装しようと以下のようにしているのですがうまくいきません カウント++ 今回描画分シーン描画済みテクスチャA ↓ if(カウント==奇数) 空きテクスチャBにAをコピー→空きテクスチャCをBにアルファ50%で描画→Bをバックバッファに描画 else 空きテクスチャCにAをコピー→空きテクスチャBをCにアルファ50%で描画→Cをバックバッファに描画 これで残像が残ると思ったのですがどうもAの内容がそのまま描画されてしまいます 残像エフェクト用空きテクスチャB,Cはクリアはしていません どこが間違っているのでしょうか?
レンダリングターゲットとしてテクスチャAとBを用意 (カウント奇数) テクスチャAに今回の描画をする テクスチャBには前回の描画が残ってる テックスチャAにBをα50%で重ねて描画する←(Aが今回の最終描画で次回に流用する) テクスチャAの内容をバックバッファに描画 (偶数) テクスチャBに今回の描画をする テクスチャAには前回の描画が残ってる テックスチャBにAをα50%で重ねて描画する←(Bが今回の最終描画で次回に流用する) テクスチャBの内容をバックバッファに描画 以下繰り返し
デバイスロストの処理で質問です なぜかResetが失敗して、デバッグしてみると戻り値が -2005530516という意味不明の値になっています Resetを呼ぶ前にリソースは解放していて、TestCooperativeLevelもD3DERR_DEVICENOTRESETを返しています
>>750 まずやることは、DirectX Error LookupというツールでValueに-2005530516を入れて
Decimalを選択してから[Look Up]を押す。
話はそれからだ。
>>751 D3DERR_INVALIDCALLでした
メソッドの呼び出しが無効っていうのはどういう意味ですか?
パラメータは初期化のときに使ったやつと同じものを使っています
>>752 ・リソースの類は、一切作らずReset()した場合
それでも失敗しますか?
・↓こうしても失敗しますか?
D3DPRESENT_PARAMETERS d3dpp;
IDirect3DSwapChain9Ptr pDefaultSwapChain;
pD3DDevice->GetSwapChain( 0, &pDefaultSwapChain );
pDefaultSwapChain->GetPresentParameters( &d3dpp );
pD3DDevice->Reset( &d3dpp );
>>753 フォントやシェーダーのようなOnLostDeviceとか用意されてるやつとD3DPOOL_MANAGEDに設定したリソースだけなら大丈夫なんですが
D3DPOOL_DEFAULTに設定したテクスチャがあるときに失敗してしまいました
テクスチャの解放の辺りが原因みたいです
普通にRelease()で解放するのではだめなんでしょうか?
スワップチェーンのほうはよく分からないけど変わりませんでした
>>754 IDirect3DDevice9::SetTexture()でセットされているままとか。
セットされていると参照カウント+1されているので、
Relese()しても解放されません。
>>755 そうだったんですか!
やっと原因が分かりました!ありがとうございます!!!
DirectX SDKのヘルプにある インデックス付き頂点ブレンディングのサポートの判定の コードを試してみたら、IndexedMatrixMaxSizeが0になっています・・。 RADEON HD 4350なので、ハードウェアで インデックス付き頂点ブレンディングができると思ったんですが・・。 最近のビデオカードはみんなサポートしているんじゃないんでしょうか? D3DCAPS9 d3dCaps; m_pD3DDevice->GetDeviceCaps( &d3dCaps ); IndexedMatrixMaxSize = d3dCaps.MaxVertexBlendMatrixIndex; 頂点しぇーだーを使うにしても、どうやって大量の行列を渡すんでしょうか? 数十個近くも変数使えるんでしょうか・・
それは過去の遺物。市場のゲームでは使われない機能だから退化した。
VS1_1でも70〜80個は格納できるよ。 格納できなければ格納できる最小までメッシュの方を分割する。面倒くさそうでしょ。そう面倒なの。
FP16バッファは非常に大きな範囲の値を表現できるとのことですが、 実際、レンダーターゲットとしてそれに書き込むときは0.0〜1.0に正規化しないといけないんですよね? HLSLではフォーマットによらず0.0〜1.0で扱うけど、その0.0〜1.0の分解能が違う、という解釈でイイんでしょうか??
いや、正規化しなくていいよ。 ふつーに2.0とか入れても通る。 実際に画面に表示するバッファでなければ何入れようと自由。
762 :
760 :2009/05/11(月) 07:27:28
>>761 なるほど。
そうすると、LDRで表現できるレンジと現実世界の光の強さの比が約1:40億なので、
最終のLDR出力を0.0〜1.0として、HDR時は0.0〜4.0×10^9で描画し、その範囲の中から
幅1.0分くらいが抽出されるようにトーンマッピングする方針ですね。
ありがとうございました。
>>762 ストップ。 4.0×10^9は余裕でFP16の範囲外。
FP16は指数部に5ビットしか用いてないから、10^4がせいぜい。
FP32を使ってくれ。
0.0〜1.0にスケーリングされるのは レンダターゲットが整数バッファだった場合? signed型なら、-1.0〜+1.0 unsigned型なら、0.0〜+1.0 real型なら、そのままなんだっけ? ここら辺どうもよくわかってないんだよなぁ
765 :
760 :2009/05/11(月) 19:30:38
>>763 そうでしたか(汗)
失礼しました・・・
しかし、まじめに物理的なライティングをしようとしても、HDRテクスチャ素材自体が調達しにくいので、
手に入るものでそれらしく見せるように調整することになりそうです。
766 :
デフォルトの名無しさん :2009/05/12(火) 10:02:19
http://www.dotup.org/uploda/www.dotup.org21559.jpg HLSLでテクスチャに一度描画し、Z値の変化の大きい場所を黒く塗りつぶしたテクスチャと重ねて描画しなおす方法で輪郭線を描いているんですが、スキンメッシュ(tiny)を表示するとうまくいきません。
上の画像のように細い線が何本も出てしまいます(左だと背中から左腕にかけて、右の画像はおでこ付近)
どうしてこうなるんでしょう?
ソースはSDKのサンプルにそのまま.fx内でZ値も出力するように付け足しただけです。
>>766 Z値を可視化すると、問題の部分はどうなってる?
768 :
757 :2009/05/12(火) 22:27:52
>>758-759 頂点シェーダー使わないといけないんですか・・。面倒そうです。
インデックス付頂点ブレンディングの
シェーダーのプログラムのサンプルってどこにあるんでしょう?
自分で書いてみましたがうまくいきません。
float4x4 matViewProjection;
float4x4 matWorld[256];
struct VS_INPUT
{
float4 Position : POSITION;
float3 Normal : NORMAL;
float3 BlendWeight : BLENDWEIGHT;
uint4 matrixIndex : BLENDINDICES;
};
struct VS_OUTPUT {...}
VS_OUTPUT Default_DirectX_Effect_Pass_0_Vertex_Shader_vs_main( VS_INPUT Input )
{
VS_OUTPUT Output;
float fLastBlendWeight = 1 - dot(Input.BlendWeight, 1);
Output.Position =
mul( Input.Position, matWorld[Input.matrixIndex.x]) * Input.BlendWeight.x +
mul( Input.Position, matWorld[Input.matrixIndex.y]) * Input.BlendWeight.y +
mul( Input.Position, matWorld[Input.matrixIndex.z]) * Input.BlendWeight.z +
mul( Input.Position, matWorld[Input.matrixIndex.w]) * fLastBlendWeight;
return( Output );
}
>>768 float4x4 matWorld[256];
まずシェーダーの固定レジスタが256本しかないから余裕でオーバーしてる。
float4[256]がVS3.0の限界数。
worldMatrixはfloat4x3にして レジスタを節約しよう
ちゃんとメッシュごと必要なボーンだけ渡せよ なんで1メッシュまるごとぶち込むソース書くヤツ多いんだマジで
>>771 言葉の意味はよくわからんが
とにかく凄い自信だ
float4x3にしても1回の描画で使えるMAX値はだいたい[80] でもこれだけで240/256を使っちゃうから現実的じゃない。 色々なエフェクトとかでレジスタ使うことを考えると [60]くらいを上限にして180/256って所だろう。 当然1メッシュでこれ以上のボーンを使っている場合に描画できなくなるから 事前にボーンの本数の上限にあわせてメッシュを分割しておく必要がある、と。
メッシュごと 1メッシュまるごと 同じじゃないのか
>>774 ちがうだろ
256も使うなんてどう考えてもおかしいだろ
ぶち込んだメッシュが影響するボーンの本数が256ってことだろ?
本当にそんなモデル作ったならそのデザイナクビでいいと思う
ちゃんとプログラム組めば
1つのメッシュに影響するボーンの数なんて5か6でも多いぐらいだろ
どうでもいいけどメッシュごとじゃなく分割したメッシュごとなら意味は通るな なんで質問スレに書き込んだのかは謎だが
某業務用御用達ライブラリもこんな感じになってて融通効かないから 「ホントにプロなの?」ってメールで暴言吐いたらちゃんと直してくれたなw
>>775 1メッシュに6本とか人体モデルもだせねぇw
今だったら頂点テクスチャでやるのがデフォ? 俺のPC古いから出来ない テラうらやましす
>>778 はぁ?
膝曲げてもフトモモとふくらはぎぐれーだろ影響あるの?
妙にリアルに仕上げるデザイナがいてもその周辺使うぐらいだろ?
だからお前、1メッシュで人体全部ぶち込むからそーゆー妙な制限生まれるんだろ?
関係あるところだけきっちりわけて渡せよw
ブログでやれ
>>780 そういうアプローチは、今まで有効じゃなかったが
今後はどうなるかねぇ
ララビーとか、メッシュブツ切りにしてもボトルネックに
ならなそう
なんとなく
てか ワンスキンで作らずにパーツごとにメッシュを分けて作れば 一つのモデルでも分割して描画することができるだろ 一つのXファイルの中にMeshは一つじゃないといけない理由なんてないぞ
>>270 がいつの間にか消えとる
誰か持ってない?
>>780 お前勘違いしてるだろ・・・。
1頂点に対する影響ボーンの数の話じゃなくて
メッシュ全体に対するボーン数の話だぞ・・・。
いまどきの頂点シェーダーならアホみたいにデータの最適化して分割して
描画なんてするよりまとめて書いた方が圧倒的に早いのは常識だぞ。
>>782 ララビーつっても実用的になるまで3世代くらいかかるんじゃねぇ?
仕様見ててもあれでGTX285とかHD4870以上の速度が出るとはおもえねぇ。
そりゃコア数ふやせば早くなりますなんて説明されても消費電力は無視かよって感じ。
>>783 1つにするメリットはCPUの負荷を軽減できるから。
描画数がクリティカルにCPUの足を引っ張るからどこも躍起になって描画数を減らす工夫してるんだよ。
786 :
766 :2009/05/13(水) 09:52:22
788 :
766 :2009/05/13(水) 11:20:34
よく見たら自分(1つのメッシュ内)に対しての輪郭が出てない。輪郭をつけるZ値差を小さくしても出ない。 なんでだろう?
>>788 単純に精度が足りてないとか
Z値を書き込んでるテクスチャのフォーマットは何?
D3DFMT_R32F?
あと書き込んでるZ値ってZ値そのまま?
W成分で割ってる?
791 :
766 :2009/05/13(水) 13:42:44
>>789 D3DFMT_A8R8G8B8からD3DFMT_R32Fに変えたらいけたサンクス!
ちなみにZ値はWで割ってる
792 :
718 :2009/05/13(水) 13:49:07
DrawPrimitiveUpでビルボード描画すると右辺と下辺が消えちゃいます。 これ多分モデルを描画するときのポリゴンの重なりを考慮してだとおもうんだけど、 ビルボードをアルファブレンドしたいときはどうすればいいんですか?
793 :
766 :2009/05/13(水) 13:57:56
794 :
766 :2009/05/13(水) 14:21:07
とりあえず、深度値は射影変換済みのじゃなく View空間のにしたらどうかね? 深度は0〜1の範囲に収まらないので、適当に閾値を調整して
VIEW空間? とりあえずわかったことは ・tinyのテクスチャが一面に張り付いてるのはスキンメッシュクラスでデバイスからテクスチャをセットしていたため ・背景を白にすると輪郭線が現れない場所が出るのは、Z値テクスチャに淡すぎて書き込まれていて背景との境に大きなZ値差を検出できなかったため
>>796 w(view空間のz)で割る射影空間だと、z方向が非線形にマップされるから
アンタの言う’Z値の変化の大きい場所’の検出が一様には出来ないと思われる。
そこが間違ってると想像。だから一様に検出が容易なView空間ベースで処理したら、
ということ。
>・背景を白にすると輪郭線が現れない場所が出るのは、Z値テクスチャに淡すぎて書き込まれていて背景との境に大きなZ値差を検出できなかったため
これがそう
798 :
デフォルトの名無しさん :2009/05/13(水) 16:32:34
VisualStudio2005、DirectXを利用して 1.aviを再生途中からフェードアウト、フェードアウトし始めと同時にtgaがフェードイン、 2.しばらくしたらtgaがフェードアウト、フェードアウトし始めと同時に別aviがフェードイン、 この1と2の動作の繰り返しするソフトを作りたい aviを再生、tgaファイルを表示する所まではできたのですが、 レイヤーの制御とフェード・キーチャンネルの制御の仕方が分かりません。 aviの終わり40フレーム手前からフェードアウト(tgaはフェードイン)し始めて、tgaに乗り替わりたいのですが どうやったら出来るのでしょうか? 再生にはDirectX.AudioVideoPlaybackのVideoクラスを使っていますが、これでは出来ないのでしょうか?
>>785 はぁ?
それじゃバンプかけるところとバンプ+環境マップあるところと
適用できねーじゃん
マテリアルチェンジする必要がある時点でボコボコシェーダー代わるんだから
今更ワンスキンなんてこだわってんじゃねぇよ
髪の毛だってシェーダ別だぞ
服もパーツごとにシェーダ違うし(アップになったときは)
もう速度なんて完全に捨てたぜ
汎用性重視
モデリングソフトと連携してることのが大事
こんだけふんだんに使っても全然速度大丈夫だし
確か以前にも質問関係なくいきなり語りだすやついたよな
803 :
792 :2009/05/13(水) 19:53:39
ssうp
805 :
792 :2009/05/13(水) 20:19:40
ttp://uproda.2ch-library.com/127928Qmt/lib127928.png 左が元画像(40x40)で右がDrawPrimitiveUp後です死にたい
描画処理↓
int x2 = x + texWidth - 0;
int y2 = y + texHeight - 0;
SETVERTEX(v[0], x, y, 0.0f, 1.0f, 0xffffffff, 0.0f, 0.0f);
SETVERTEX(v[1], x2, y, 0.0f, 1.0f, 0xffffffff, 1.0f, 0.0f);
SETVERTEX(v[2], x, y2, 0.0f, 1.0f, 0xffffffff, 0.0f, 1.0f);
SETVERTEX(v[3], x2, y2, 0.0f, 1.0f, 0xffffffff, 1.0f, 1.0f);
device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
device->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
device->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
device->SetTexture(0, texture);
device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
device->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1);
hr = device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, v, sizeof(D3DVERTEX));
807 :
792 :2009/05/13(水) 20:27:14
>>806 サンクス試してみる!
過去レス読まない俺を罵ってください
809 :
792 :2009/05/13(水) 21:20:32
>>808 愛してる
ttp://uproda.2ch-library.com/127951kK2/lib127951.png 若干よくなったけど後一歩なのか、うちのグラボ(PX8800GT)が悪いのか・・
device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT); // New
device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT); // New
device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); // New
device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP); // New
device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP); // New
device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
device->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
device->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
テクセル不一致は考慮した?
811 :
792 :2009/05/13(水) 22:02:08
812 :
792 :2009/05/13(水) 22:42:44
ttp://uproda.2ch-library.com/127984Kos/lib127984.png 解決しました。助言してくれた方(達)ほんとサンクス。
参考になるかもしれんので、俺がひっかかったところ列挙しときます。
・サンプラーステートのフィルタ系パラメータをPOINTにする
⇒device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
⇒device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);
⇒device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
⇒device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
⇒device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
・クライアントウィンドウとバックバッファのサイズが違った
⇒AdjustWindowRectでサイズ計算したらちゃんとなってるか確認する
・CreateTextureFromFileExのフィルタ系パラメータをDEFAULTにしてた
⇒Filter → D3DX_FILTER_POINTにする
⇒MipFilter → D3DX_FILTER_NONEにする
・2のべき乗じゃないテクスチャーは使わない(前回までは40x40のテクスチャでした。今回32x32)
以上連投失礼いたしました
813 :
792 :2009/05/13(水) 22:45:07
もう一個忘れてた ・プリミティブの4頂点はそれぞれ-0.5しておく ⇒テクセルの不一致対策 以上です
表はいいけどひっくりがえすと0.5ずらしたヤツってさらにずれてね?
815 :
デフォルトの名無しさん :2009/05/14(木) 00:05:55
問題文、選択肢、解答を順に表示させるプログラムを作りたいんですが、 どのように作ったらいいか悩んでます。 キーを押すごとに変わるようにしたいんですが・・・ いい案をください。 初心者で申しわけありません
printf("問題"); getchar(); printf("選択肢"); getchar(); printf("解答"); getchar(); ん?DirectX と何の関係があるの?
Direct3Dで表示したいってことじゃね?
先は長いな
819 :
792 :2009/05/14(木) 01:12:12
>>814 まじかwwwww
これから反転や回転を組み込もうと思ってたのにどうしよう
回転ヤバス
反転や回転してからずらせよ
ためしてないけどDX9ではこうなんじゃないの float u_offset = 0.5f / texWidth; float v_offset = 0.5f / texHeight; SETVERTEX(v[0], x, y, 0.0f, 1.0f, 0xffffffff, 0.0f + u_offset, 0.0f + v_offset); SETVERTEX(v[1], x2, y, 0.0f, 1.0f, 0xffffffff, 1.0f + u_offset, 0.0f + v_offset); SETVERTEX(v[2], x, y2, 0.0f, 1.0f, 0xffffffff, 0.0f + u_offset, 1.0f + v_offset); SETVERTEX(v[3], x2, y2, 0.0f, 1.0f, 0xffffffff, 1.0f + u_offset, 1.0f + v_offset);
DirectSoundCreate8 -> CreateSoundBuffer -> Lock -> Unlock -> Play でサウンドを再生するとき、 元々ステレオなサウンドをモノラルで再生したりステレオで再生したり、 切り替えるにはどうすればよいですか? WAVEFORMATEX の nChannels は元のファイルがモノラルかステレオかに依存しますよね?
>>822 WAVデータのほうをいじればいいんじゃないの
16ビットwavなら(L + R) / 2にしてLとRに同じデータ送る
リニアPCMのデータ部って、8bit+8ibt ステレオなら 1Byte L 1Byte R 1Byte L 1Byte R ... みたいに並んでますか?
Direct3Dで、テクスチャを生成するとき、 D3DXCreateTextureFromFileInMemoryEx系だとMipFilterを指定できるわけだが、 他のAPIでは同じフラグが見当たらないような気がする。 テクスチャが拡大・縮小される際の挙動をある程度こちらで指定したいんだけど、 いい方法はないだろうか。 SetRenderState()などで変えられるんだろうか?
>>827 SetSamplerStateで
D3DSAMP_MIPFILTER
D3DSAMP_MINFILTER
D3DSAMP_MAGFILTER
あたり
>>828 ありがとう。さっそくそれを試してみることにするよ。
830 :
デフォルトの名無しさん :2009/05/15(金) 11:47:33
D3DXSpriteってシェーダーで出力できる?
831 :
デフォルトの名無しさん :2009/05/15(金) 12:54:40
VC++2008EEとDXSDK(おそらく最新版?)とEasy Link Library(某サイトより頂きました) を使用しているのですがビルドを実行した所、 >fatal error C1083: include ファイルを開けません。'dsound.h': No such file or directory というエラーが出てきました。 過去レスを参考にしてIncludeファイル内にdsound.hを探してみたのですが見当たりませんでした。 DXSDKの古いバージョンをインストールし直せばいいのでしょうか? C言語、プログラムの知識は授業の一貫でテンプレに沿ってシューティングゲームを作った程度ですので 特に環境面?(VCの初期設定等)はあまり詳しくありません。
ちゃんんとVisualStudioの設定で DirectXSDKのインクルードファイルとライブラリファイルへの パスを設定したのかい?
833 :
831 :2009/05/15(金) 13:28:37
>>833 なにその中途半端なパスは
それは$(WindowsSdkDir)じゃないのか
普通にインストールしたら
C:\Program Files\Microsoft DirectX SDK (November 2008)\Include
C:\Program Files\Microsoft DirectX SDK (November 2008)\Lib\x86
になるよ
835 :
831 :2009/05/15(金) 14:13:23
836 :
766 :2009/05/15(金) 14:15:14
打開した 作られてたバックバッファテクスチャ・Z値テクスチャがnの2乗だったから画面に合わせて縦横比を調節しなければならないというオチだった
837 :
デフォルトの名無しさん :2009/05/15(金) 14:16:17
ご指摘の通り・・・?
>>835 エクスプローラで本当にその場所にdsound.hがあるか確認してみて。
ちゃんと確認した?
あるわけねーだろww
840 :
831 :2009/05/15(金) 15:24:14
Microsoft DirectX SDKを勘違いしていたみたいです、申し訳ありません。 >fatal error C1083: include ファイルを開けません。'dsound.h': No such file or directory のエラーは無事解決しました。 dsound.hの存在も確認しました。 今度は >error C2664: 'CreateMutexW' : 3 番目の引数を 'char [2048]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照) のようなエラーが58個出てきました。 エラーログをクリックしたところel.hを参照したのですが、el.hが古い型なので対応してないという事なのでしょうか?
プロジェクトのプロパティを開いて 全般の設定項目の中の文字セットを 「Unicode文字セットを使用する」を 「マルチバイト文字セットを使用する」に変更する てゆうか、すでにDirectX以前の問題だらけじゃね?
まあ実際初心者はdirectX以前につまずくからしょうがない 俺も最初そうだったし
843 :
831 :2009/05/15(金) 15:39:17
>>841 >error C2664: 'CreateMutexW' : 3 番目の引数を 'char [2048]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
のエラーは解決できました、ありがとうございます。
やはり私のような者には向いていないようですので諦めようと思いますレスありがとうございました。
まぁ、elはDirectX6時代の産物だから 上記の変更以外にいろいろ追加したり たりないlibファイルとか引っ張ってこないといけなかったりするから 初心者には逆に辛いかもね 素直に初心者サイトで勉強するか 現在もサポートされてる簡易ライブラリを探した方がよさそう
つーか余計なことしようと思わなければミューテックスなんて使わないと思うんだが
別にミューテックス使おうとしたから出たエラーじゃなくて el.hをインクルードした時点で出るエラーだからしゃーないんじゃない? すでに未公開だからうろ覚えだけどEasyLinkLibraryって 5万行近いel.hという一つのファイルににすべてが書き込まれた ラッパー関数群だからこの中から必要なものだけを取り出すなんて初心者には無理でしょ
しかし、この程度であきらめてしまうとは情けない
流石にあの物量はやばいだろ
849 :
デフォルトの名無しさん :2009/05/16(土) 19:42:22
どなたかDirectSoundに詳しい人いますか?
850 :
757 :2009/05/16(土) 22:30:02
いろいろあって書くの遅くなりました・・すいません シェーダー以前の問題があるようなんです。シェーダー未適用の状態で 一切表示されなかったんですが、それが駄目なのかもしれません。 頂点位置の後にブレンドの重みと行列インデックスを置くというルール、無視できないんでしょうか? 何をしようかとしているというと、Irrlichtという3Dエンジンに ハードウェアスキニングを実装しようとしています。それで新たに構造体S3DVertexWeightを作ろうとしました。 初めはIrrlichtに元からある構造体S3DVertexの派生クラスとして作ろうとしたんですが、 そうすると頂点位置の後にブレンドの重みと行列インデックスを置くことが出来ません。 かといって派生させないで作ろうとすると、基底クラスにキャストしたりしている部分があるため 落ちたりなどいろいろ問題がおきます・・。
851 :
757 :2009/05/16(土) 22:32:53
1つしかマテリアルが無いならボーンで メッシュを分割するのは簡単そうですが 複数マテリアルがあると難しそうです・・。
>>850 よくDirect3Dの基本も分かってない状態で、そんな面倒なことに手を出そうとするなぁ。
各成分の順番も自由だし、1つの構造体である必要すらない。
データ数さえ揃っていれば、成分ごとに別のバッファに分けてもいい。
>>849 音出したいなら素直にXAudio2使っとけ
854 :
757 :2009/05/16(土) 23:50:28
>>852 もしかして
D3DVERTEXELEMENT9の方を使うんでしょうか?こっちは順番の制限が無い?
(今までFVFを使っていました。IrrlichtのコードがFVF使っているので・・)
移行するのが大変そうですがやってみます。
MMORPGのような広大な地形をどのように扱ったらいいかが書かれている書籍やWebサイトを ご存知でしょうか? 移動範囲すべてを一気にロードしたらポリゴン数がすごいことになると思いますし、 平地でポリゴン数は少なくできても、テクスチャの解像度が問題になると思います。 このあたりをどう処理するのかが知りたいです。 もちろん、いろいろなアプローチの仕方はあるでしょうけど、何か基本となる考え方、方針、 実現例を知ることができればうれしいです。 よろしくお願いします。 m(_ _)m
手っ取り早い方法。 普通にマップをモデルデータとして作る。 ツールで特定の範囲単位に切断する。 切断したブロック単位でロードや表示をする。 テクスチャの解像度とかはまったく別の話。 1枚のテクスチャを真上から貼るわけじゃないし。
HLSLを使うと D3DXMatrixIdentity(&matWorld); D3DXMatrixScaling(&matScale,Size,Size,Size); D3DXMatrixMultiply(&matWorld,&matWorld,&matScale); pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld ); で拡大縮小できなくなりますが どうすればいいのですか?
DrawPrimitiveの手前で pd3dDevice->SetVertexShader(NULL); でok
859 :
デフォルトの名無しさん :2009/05/17(日) 14:30:19
>>857 音出したいんじゃなくてキャプチャして再生したい
860 :
デフォルトの名無しさん :2009/05/17(日) 14:31:46
俺はXBOX360やゲイツ関係が大嫌いなんです
なぜここでそんな話を?
JAVAでOpenGL使えばいいよ
864 :
857 :2009/05/17(日) 16:30:27
シェーダー使いながら拡大縮小するにはどうすれば? 頂点シェーダーでやるの?
866 :
857 :2009/05/17(日) 18:20:16
HLSL使う場合は移動とか回転も頂点シェーダー? どこかに解説ないかな?
867 :
855 :2009/05/17(日) 18:33:05
>>856 ありがとうございます。
分割して、あとはワールド座標系の位置に応じて適宜マップモデルをロードする形式で
いこうと思います。
テクスチャについてもう少しお聞きしたいです。
>1枚のテクスチャを真上から貼るわけじゃないし。
そうだと思ってました(汗)
10km四方のマップなら10km四方分のテクスチャが要ると思ったのですが、違うのでしょうか?
土や草、岩肌をそれぞれ単独え表現したテクスチャを組み合わせて貼り付けるようなカタチで
テクスチャ容量を削減しながらもそれらしく見えるようにするのでしょうか??
ttp://image.blog.livedoor.jp/oreno/imgs/6/5/652b59d0.jpg コンバット系のゲームを見ると、非常に広範囲を表現した大量のテクスチャを持っていそうに
見えるのですが・・・
木とは明らかに別のテクスチャだろう。 そんな広大な範囲のマップをテクスチャ1枚で解像度が足りない。 ならテクスチャを増やすしかないのは当然だと思うが。
MMORPGとフライトシューは地形における方法論が全然違うだろ
870 :
855 :2009/05/17(日) 21:50:42
失礼しました^^;
High Dynamic Range レンダリングについて、物理的な観点で解説した書籍をご存知ないでしょうか? 有名なGame Programming GemsやGPU Gems、あるいはShaderX等お持ちの方、それらには 掲載されていないでしょうか?
フライトシミュレーターなんて遠くからきれいに見えればいいから テクスチャをそこまで細かく作る必要はないな。 エスコン4の地形は4096のテクスチャ張ってるだけだったっけ? まぁあれはPS2時代だからああいう方法だったんだろうけど。
ポリゴンが描画されなくて困っています
頂点バッファとインデックスバッファを持ち、初期化、描画、解放を行うクラスがあって
そのクラスを派生させて平面の生成と描画を行うクラスを作り、それを使って描画させてみたんですが、何も表示されません
http://monoganac2.sakura.ne.jp/src/milktea25467.txt クラスの部分のソースです
Plane plane;って感じで定義して、初期化の部分でplane.Create( 1, 1, pd3dDevice );こんな感じで生成して
plane.Draw( pd3dDevice );これで描画させたいんです
>>873 sizeof(vertices)、sizeof(&index)で返ってくる値がおそらく想定されたものではない
と流し読みをしてレスしてみる
>>874 解決しました!ありがとうございます!!
876 :
855 :2009/05/19(火) 00:56:15
>>872 ありがとうございます!
参考になります!
球へのテクスチャマッピングで d3dDevice->SetRenderState(D3DRS_WRAP0, D3DWRAPCOORD_0); でテクスチャラッピングに成功したのですが、テクスチャの大きさが2の累乗でない時に端の方がおかしくなります。 また、テクスチャの一部を球に貼り付けることも出来ません。どうにかならないでしょうか?
質問です。 DirectSoundで音を再生するクラスを作りました。 この時点で音がなったので満足したので次に音量を調整できるようにしたいのですが 音量の調節ができません。 bool CSound::Load(char *name, long vol){ //音楽読み込み LPDIRECTSOUNDBUFFER8 p; //音読み込み自作関数 p = CreateSoundObj(name,DSBCAPS_CTRLVOLUME,GUID_NULL); if(p == NULL){ return false; } else{ //コレクションに追加 p->SetVolume(vol); this->SoundCollect.push_back(p); } return true; } CreateSoundObj内ではFlagにきちんとセットしてるはずですが 音の大きさが変化しません、なんででしょうか?
HRESULT ret = p->SetVolume(vol); とやって、retの値がどんなエラー値になっているか調べろ
880 :
878 :2009/05/19(火) 04:25:48
今確認しました所retの返り値はS_OKでした。
881 :
878 :2009/05/19(火) 04:32:32
すいません改めて全てのサウンドをチェックしたら ボリュームに0以外をセットするとE_INVALIDARGが返ってきました。 調べてみたところ構造体のdwSizeを初期化しないとそうなる可能性が多いとの事ですが どうやら初期化はしてあったみたいです DSBUFFERDESC dsbdesc; ZeroMemory(&dsbdesc,sizeof(DSBUFFERDESC)); //0クリア dsbdesc.dwSize = sizeof(DSBUFFERDESC); //構造体のサイズ
ジョイスティックで入力した方向にモデルを向かせて 移動させるにはどうすればいいでしょうか?
>>882 何がしてぇんだよ
入力した方向にキャラ向けりゃいいじゃん
ケーブルを挿しわすれていただけでした^^;
885 :
882 :2009/05/19(火) 07:02:59
>>883 現在のキャラの向いている方向から、入力された方向への回転をどうすれば良いでしょうか?
現在の向いている方向へのベクトルと、向きたい方向へのベクトルが
一致するまでRotationするとかでしょうか?
>>878 古めのSDKを入手して、DirectSoundのサンプルを眺めてみたら?
DirectSoundはcreateしてSoundBufferつけて書き込んだだけじゃ音はならないよ。
>>885 そりゃもう算数の話だ。
DirectX関係ねぇ。
XAudio2でサウンドのエンジンを実装してみたが、簡単に作れるようにできてるんだなー。 ストリームのスレッドの存在もほとんど意識する必要ないし。 コールバック中でSourceVoiceの破棄がかけられないところくらいか。 ところで、DirectSoundとXAudio2ってPCにかかる負荷ってどれくらい違うんだろう。 XPとVistaで変わってくると思うんだけど。
ID3DXFont で描画するときに、座標変換の行列を適用させる方法ってありませんか? ID3DFont::SetTransform() みたいなのがほしいんですけど....
その辺はオレも知りたいな。 明らかにD3DXSprite系は通常の空間座標変換を無視して描画してる。 まあたぶんrhw使って直に書いてるんだろうけど。
pd3dDevice->SetTextureと g_pEffect->SetTextureって何が違うのですか? 今、blenderでuvマッピングしたtgaファイルの指定の入ってるxファイルの物体を g_pMesh->DrawSubset( 0 )で表示させたいのですが物体すら表示されません、どうしてでしょうか?
上は描画デバイスにテクスチャをセットしてる 下はシェーダーにテクスチャのデータ渡してるだけ 質問内容から推測すると、まだシェーダーを扱うレベルに達していないみたいだから 普通にpd3dDeviceの方にしとけ
ありがとうございます シェーダは難しそうだから飛ばしてたのですが、勉強したほうが良いですか? 何か必然性を感じなかったのですが
感じてないならまだ触らなくていいよ
あーわかんね g_pEffect->SetTexturだとuvテクスチャは張れないわけ? いろいろ書き直すの超面倒くせえ
897 :
デフォルトの名無しさん :2009/05/19(火) 14:10:11
>>877 まずは板ポリを作ってそれを正面から眺めながら考えればいいんじゃね?
ヒント: テクスチャー座標
テクスチャが二の累乗でない場合は内部で自動的に二の累乗に拡張される 拡張された所に何が入るかは知らないけどそれが見えてる 二の累乗に自前で事前に拡大しとけ
>>899 ありがとうございます。
テクスチャのフィルターをD3DX_FILTER_LINEARにしたら、希望通りの動作になりましたが、これは、どの環境でも同じく動くのでしょうか?
>>897 >テクスチャ ラッピングに [0.0, 1.0] の範囲外のテクスチャ座標が含まれないようにすること。
>このような座標が含まれている場合の結果は不定である。
ヘルプにもこうあるから、
>また、テクスチャの一部を球に貼り付けることも出来ません。
これはちょっと出来そうに無いな。
プリサンプルシェーダとかあればまた別なんだが。
素直にテクスチャを作り直すとか。
>>901 はちょっと違うか
まあ、[0.0, 1.0]以外を想定した作りになっていないってことで
>>901 球用に新しくテクスチャを作ることにします。ありがとうございます。
UVで作った通りにテクスチャが張り付かないんだがなんで?
PAやSPFの低い値のものをお使い下さい
そういうのじゃないんだよな〜 blenderで作った物体をサンプルのチュートリアルの虎の奴でやったらうまく張り付かないっていう 2個ビューア持ってるんだけど1個は暗くて見えなくて、1個では完璧っていう
日本語でおk
もう見てやるからソースをモデルファイル出せよ
blenderでuvマッピング済みのxファイルとtgaファイルを作った 2つ持ってるxファイルビューアのうち一つではちゃんとテクスチャの貼られた作った通りの物体が表示される しかしもう一つでは物体が真っ暗になって表示されない サンプルのチュートリアルのタイガーの部分に移植したら色はついてるが思ったとおりの座標で貼られてない なんで?
∩_ 〈〈〈 ヽ 〈⊃ } /ニYニヽ | | /( ゚ )( ゚ )ヽ ! ! /::::⌒`´⌒::::\ | / | ,-)___(-,| / <これっていうwwwwwwwwwwwwwwwwwwwwww 、 |-┬-| / / _ `ー'´ / (___) /
>>900 D3DX_FILTER_LINEAR は、D3Dが有効なら必ずサポートされていることになっている。
が、2の累乗ではないサイズのテクスチャが取り扱えるかどうかは環境依存。
動的に作られるテクスチャの場合、GetDeviceCapsで予め調べて、サポートされて
いなければ2の累乗で作成する。なおテクスチャの一辺の長さも環境依存なので調べてから使え。
>>900 すまん嘘書いた。
>>912 必ずサポートされているのは、_POINTだった。
でも、DX9が出て以降登場したカードに、_LINEARがサポートされてないのは見たことない。
>>909 とりあえず、Normalベクトルが全部0だよ。
こいつを無視するようにしたら、自前のビューワでは
ちゃんと表示できたよ。
しかしNormalを全削除しても
SDK付属のビューアでは真っ黒表示だな。
これはよくわからん。
915 :
デフォルトの名無しさん :2009/05/19(火) 19:31:12
ちょっと知恵を貸してください。やろうとしていることは
>>611 です。
SDKのサンプルにキャプチャサンプル(キャプチャしてwaveファイルに書き込む)なるものが入っていてそれを改造しています。
キャプチャバッファに音声データ部分が&pbCaptureData、&pbCaptureData2の2種類あって、&pbCaptureData部分だけに音声データが収納されているようなのです。
(&pbCaptureData2を削ってもちゃんとwaveファイルが作成されていた。&pbCaptureData2はバッファより大きい場合のために用意されている?)
&pbCaptureDataを再生バッファに送っても先頭部分にしか書き込まれておらず、再生バッファ周期でブツブツ途切れています。
再生バッファの新しい書き込み位置は古い&pbCaptureDataのすぐ後になるはずですがどうしてこうなるんでしょうか。
DXUTは使わないほうが良いの?
便利だと思えば使えばいい 不要だと思えば使わなければいい
むしろ不便さがよく言われてる様に思うのですが… 使ってない方が評判が良い様な気もするし
だって横にツールウィンドウだしたほうがどうやっても楽だもん
え?DXUTって何かGUIだっけ?の様な物なの?
DXUTが隠蔽してる部分をいじりたいからDXUTは使わんなぁ
>>915 再生バッファのロック開始位置が常に0なんだから先頭部分にしか書き込まれないんじゃ?
924 :
デフォルトの名無しさん :2009/05/19(火) 22:25:56
>>923 キャプチャ---------------------------------------------
○○○○○○◎◎◎◎◎◎△△△△△▲▲▲
白抜き:すでに読み込んだデータ
三角黒:未読
◎:ロックされたデータ
この◎◎◎◎◎◎を再生バッファにコピーして
再生バッファ---------------------------------------------
◎◎◎◎◎◎△△△△▲▲▲▲▲
◎:ロックしたデータ
◎◎◎◎◎◎△△△△:用意したバッファ
こうやって書き込んだら次のロック開始位置は自動的に
◎◎◎◎◎◎△△△△▲▲▲▲▲
↑ここ
になるんじゃないの?
478 :名前は開発中のものです。 :sage :2009/05/19(火) 11:19:18 ID:4UcrHdRs
DXUTとういのが難しいと聞いたのですが
DXUTはどういうメリットがあるのですか?
479 :名前は開発中のものです。 :sage :2009/05/19(火) 12:47:11 ID:dNq8QNpp
ウインドウの生成やそれに伴うメッセージ処理、DirectXの初期化など
面倒くさいところを引き受けてくれる
これすら難しいならs
480 :名前は開発中のものです。 :sage :2009/05/19(火) 12:56:35 ID:4UcrHdRs
つまり面倒さが
DXUTにそういう処理を引き受けさせるための処理>ウインドウの生成(ryのための定番処理
だから嫌われてるの?今DXUTで作ってるんだが…
481 :名前は開発中のものです。 :sage :2009/05/19(火) 14:05:59 ID:vLQKBLqv
>>480 『 誰に 』 嫌われてるの?
482 :名前は開発中のものです。 :sage :2009/05/19(火) 14:12:04 ID:4UcrHdRs
>>481 2ちゃんねらーに悪口言われてカワイソス
483 :名前は開発中のものです。 :sage :2009/05/19(火) 14:34:46 ID:yVfOUj6/
何事もなかったことにして次行った方が良さそうだね
>>890 pSprite->Begin( D3DXSPRITE_ALPHABLEND | D3DXSPRITE_OBJECTSPACE );
pSprite->SetTransform( &mWorld );
pFont->DrawText( pSprite, str, -1, &rc, DT_NOCLIP, col );
フォントのDrawTextの最初の引数にスプライトのポインタを指定すると
スプライトのSetTransformでセットしたワールド変換で文字表示されます。
スプライトのBeginにD3DXSPRITE_OBJECTSPACEを指定すると3D空間表示に
なります。
928 :
デフォルトの名無しさん :2009/05/19(火) 23:26:08
>>926 再生バッファ->SetCurrentPosition();でオフセットするのかな?
ロック開始位置はLock()関数の第一引数だぞ
930 :
デフォルトの名無しさん :2009/05/20(水) 00:36:47
おkおk 再生バッファ->GetCurrentPosition( &point, 0 ); if ( point > 前回のロック長); でもいいよね?
話が読めんが一応注意しとくと GetCurrentPosition()で取得できるのはバッファ上の再生カーソルの位置のチョイ後ろ その上かなりアバウトな値吐いてくるぞ
932 :
デフォルトの名無しさん :2009/05/20(水) 00:59:53
そうだろうね 途切れ途切れがなおらない上にマイク入力から0.数秒のラグが付くようになった
D3DXMatrixScaling(&matScale,Size,Size,Size); D3DXMatrixMultiply(&matWorld,&matWorld,&matScale); m = matWorld * matView * matProj; m_pEffect->SetMatrix( m_hmWVP, &m ); シェーダーの時のサイズ変更はこれでいいんだね?
スプライトをテクスチャに書くにはどうすればいいの?
>>933 間違いではないが、意図してるのはこっちじゃないか
D3DXMatrixMultiply(&matWorld,&matScale,&matWorld);
IDirectXFile::CreateEnumObject()に XfileのパスとしてUnicode文字列を渡すと失敗する。 もしかして、日本語のパスってサポートしてない?
937 :
933 :2009/05/20(水) 02:06:05
D3DXMatrixMultiply(&matWorld,&matScale,&matWorld); D3DXMatrixMultiply(&matWorld,&matWorld,&matScale); どっちも同じ結果になるけど?
>>937 まあそうかもな。
例えば、SizeをXYZ軸で分けたときとか、
matWorldに平行移動成分が入ってるとき
違いが出る。
939 :
915 :2009/05/20(水) 05:19:22
だんだん良くなってきたけど新しい問題が出てきた マイクで音を拾う→再生→再生した音をキャプチャが拾う→再生・・・・(永久ループ) ってなってバッファ分の音がだんだん大きくなって耳とPCを壊すところだった・・・
フィードバックエフェクタがただで実装できて良かったじゃん
シェーダー使ってるときのスプライトとか2D描画はどうやるの? 板ポリ作って自前でやるの?
DirectXにスプライトなど無い。
// pMatrix を使って文字列を描画 // pDev にはあらかじめ単位行列を SetTransform してあるので、 // pDev 行列にさらに pSprite の行列がかかったとしても、最終的な変換行列は pMatrix に一致するはず RECT rect = {0, 0, 0, 0}; D3DXCreateSprite(pDev, &pSprite); pSprite->Begin(pSprite, D3DXSPRITE_ALPHABLEND); pSprite->SetTransform(pSprite, pMatrix); pFont->DrawText(pSprite, s, -1, &rect, DT_NOCLIP, WHITE); pSprite->End(pSprite); pSprite->Release(pSprite); // 上記と同じ pMatrix を使って四角形を描画 v[0].pos = D3DXVECTOR3(0, 0, 0); v[1].pos = D3DXVECTOR3(8, 0, 0); v[2].pos = D3DXVECTOR3(0, 8, 0); v[3].pos = D3DXVECTOR3(8, 8, 0); pDev->SetTransform(D3DTS_WORLD, pMatrix); pDev->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, v, sizeof(VERTEX)); てやると、あきらかに別々の場所に表示されるんだけど、どうして 表示位置が一致しないの???
pSpriteのメソッドの引数にpSprite渡すとか マジでそんな担当者殴りたい仕様になってるの? 俺ならそんな関数作ったやつ関数修正するまで殴るのやめないけど
>>944 Cから呼ぶときはthisポインタを第1引数に渡す。
よく分からんのが、943の前半はC形式で、後半がC++形式なとこ。
あと、pMatrixもよく分からんな。普通はそんな使い方しないと思うが。
ごめん pSprite->End(); pSprite->Release(); のまちがい。手元のプログラムは全部Cだから、 pSprite->lpVtbl->End(pSprite) とか書いてあるんだけど C++のほうがシンプルで見やすいかと思って変換しながらスレに書き込んでた。 それよりも pMatrix の使い方の違和感についてkwsk
>>946 余計まぎらわしいよ
余計なことすんな
そのまま貼り付けろ
pSprite->SetTransform(pSprite, pMatrix); pFont->DrawText(pSprite, s, -1, &rect, DT_NOCLIP, WHITE); v[0].pos = D3DXVECTOR3(0, 0, 0); v[1].pos = D3DXVECTOR3(8, 0, 0); v[2].pos = D3DXVECTOR3(0, 8, 0); v[3].pos = D3DXVECTOR3(8, 8, 0); pDev->SetTransform(D3DTS_WORLD, pMatrix); なんかこれあやしいよ ソース間違ってるからさらにあやしい なにが見やすいだバーカ 動かねぇんじゃ意味ねーんだよバーカ
そもそもSpriteってワールド座標用なのか? サンプル見る限りどう考えてもスクリーン座標用に見えるけど? 必要な変換わかってるか? ワールド変換 → ビュー変換 → 射影変換 → ビューポート変換 だぞ スプライトがSetTransformの影響を受けないとしたら 上記変換が必要になる っていっても上記情報はすでにそろっているはずなので 順番に変換していけばいいだけ
うん? ワールド変換 → ビュー変換 → 射影変換 → ビューポート変換 の各行列はすでに Device に SetTransform でセットされているとして、 それを GetTransform で取得しながら積を求めて最終的な行列を求め、 それを Sprite::SetTransform に渡す必要があるってこと?
>>950 >Sprite::SetTransform
それ動いてる?
DrawPrimitive前のSetTransformの仕様と Sprite::SetTransformってそもそも同じなの?
あやしくね〜? 仮にスクリーン座標とワールド座標の書き分けをこのスプライトクラスでやろうと思ったら どうやればいいの? っていうか酷くあいまいじゃない? これは酷いウンコクラスであると予想 やっぱり ワールド変換 → ビュー変換 → 射影変換 → ビューポート変換 必要なんじゃないかなぁ・・・
下手にいじって混乱させてしまったみたいなので、手元で動かしてるテストコードそのままコピペします -- ID3DXSprite *pSprite; D3DXMATRIX *pWorld, proj, view, m1, m2; RECT rect = {0, 0, 0, 0}; MyVERTEX v[4]; /* 行列の準備 */ pWorld = ID3DXMatrixStack_GetTop(g_dev->matstack); IDirect3DDevice9_GetTransform(g_dev->device, D3DTS_PROJECTION, &proj); IDirect3DDevice9_GetTransform(g_dev->device, D3DTS_VIEW, &view); /* ポリゴンを描いてみるテスト(画面の中心に出る) */ MyVertex_InitArrayEx(v, 4, MyCOLOR_WHITE, 0); v[0].pos = MyVector3i(0, 0, 0); v[1].pos = MyVector3i(8, 0, 0); v[2].pos = MyVector3i(0, 8, 0); v[3].pos = MyVector3i(8, 8, 0); IDirect3DDevice9_SetTransform(g_dev->device, D3DTS_WORLD, pWorld); IDirect3DDevice9_DrawPrimitiveUP(g_dev->device, D3DPT_TRIANGLESTRIP, 2, v, sizeof(MyVERTEX)); -- 次に続く
つづき -- /* 文字描画テスト */ D3DXMatrixMultiply(&m1, pWorld, &view); D3DXMatrixMultiply(&m2, &m1, &proj); D3DXCreateSprite(g_dev->device, &pSprite); pSprite->lpVtbl->Begin(pSprite, D3DXSPRITE_ALPHABLEND); pSprite->lpVtbl->SetTransform(pSprite, &m2); ID3DXFont_DrawTextA(g_dev->font, pSprite, "HELLO", -1, &rect, DT_NOCLIP, g_dev->color); pSprite->lpVtbl->End(pSprite); pSprite->lpVtbl->Release(pSprite); 補足: MyVector3i() は D3DXVECTOR3() と同じ MyVertex_InitArrayEx は MyVERTEX の配列を初期化する関数
で、上記のようにするとポリゴンは画面中心に出ますが、文字は見えません。 pSprite->lpVtbl->SetTransform に渡す行列を m1 にすると、文字は左上に出ます。 ポリゴンと同じ場所に文字列を描画というのが目的なんですけど、 うまくいきません。
>>955 それだと今度ビューポート変換なくねぇ?
とりあえずヘルプの仕様どおりにワールド座標から突っ込んでみたら?
ちなみにヘルプには スプライトの元のワールド空間からのトランスフォームを格納する D3DXMATRIX へのポインターです。 このトランスフォームを使用して、スプライトのスケーリング、回転、またはトランスフォームを行います。 とかいってるけどビュー変換 → 射影変換 → ビューポート変換にはなにもいってねぇ 余計まぎらわしい 殴りたいなこのクラス作ったやつ っていうかここまで苦労するならもう使わないほうがよくねぇw なにかメリットあるの?これ?w
何も考えずに座標指定したらそのままスクリーン座標になるわけだ。 考えやすいじゃないか。 実際、自作の3Dレンダラーと組み合わせるとき、デバッグ情報を画面に表示させるのが楽だったぞ。
>>959 ふざけんなよw
だってこの仕様じゃDrawPrimitive使ったほうが楽じゃねぇかよ(笑)
なにこれ?ふざけてるの?
クラス作ったヤツ「このクラスは必要ありません」って言えよw
>>960 2D描画の世界はそういうものだ。
自分の世界だけで全て語れるというものではない。
>>955 スプライトのBeginにD3DXSPRITE_OBJECTSPACEを指定すれは、
スプライトのSetTransformに渡す行列がワールド変換行列として扱われる。
pSprite->lpVtbl->Begin( pSprite, D3DXSPRITE_ALPHABLEND | D3DXSPRITE_OBJECTSPACE );
>962 追記、SetTransformにはワールド変換行列そのものを渡す pSprite->lpVtbl->Begin( pSprite, D3DXSPRITE_ALPHABLEND | D3DXSPRITE_OBJECTSPACE ); pSprite->lpVtbl->SetTransform( pSprite, pWorld );
964 :
デフォルトの名無しさん :2009/05/21(木) 12:53:54
あ、そーゆー仕様なんだ(笑) わかりずらいなぁ なんでSetTransformの仕様を俺仕様にしたんだろ? 気持ち悪い人が作ってそうだよね
D3DXSPRITEだぞ D3DX あとはわかるな
D3DXはなあ Spriteにしても、サンプルひとつでもあればわかるんだが。
DirectXって結構いいかげんだよね
969 :
955 :2009/05/21(木) 15:17:13
どうもありがとう、おかげで意図した座標に表示することができました。 ところで、ビューポートの行列を取得する関数ってないんですね。 GetViewport で取得した情報を元に自分で行列を作ったんですが、 もしかしてどこかに直接行列を取得する関数がありますか?
DirectXにスプライトなどないと何度言わせる?
頭悪そう
そういうのがカッコイイとか思ってるんじゃない?
行列使ってスケール、回転、移動と掛け合わせたまではいいんですが なんか一個ずつズレてるんだけど原因わかりますか? 地形、飛行機と描画すると地形に設定したはずの行列が飛行機に適用されます それ以降、オブジェクトを増やしても全部一個ずつズレます なんとかして下さい
原因も何も描画した後にSetTransformしてるだけでは?
こういう人って現場に入ってからも 「DirectXにスプライトなどない(キリッ)」っとか言っちゃうのかな プッ
なにこの状況・・・
正しい用語を使えない人間は、現場でも役には立たない。 俺用語を使っている奴は勉強不足の上、指摘すると直すどころか逆ギレする。
役立たずが逆切れしたの?
正しい用語って言われてもなー Direct3Dも広義には持ってると言えるし 狭義には持ってないとも言えるし
いつもの使えないクズが逆切れしただけだろ。 放置放置。
DirectX総合スレ (Part9) 494 :名前は開発中のものです。 :sage :2009/05/22(金) 14:12:09 ID:WlLdGHRw 正しい用語を使っても相手に伝わらなければ無意味だけどな 勝てないと分かって姉妹スレに逃げた奴
ワロタwwwwww
Xファイルを読み込むとして やっぱり動作を軽くするにはテクスチャとかを削るのが一番なの?
ここまで全部俺の自演
そもそも「スプライト」の定義すらあいまいなのに有無を論じるのは無駄
そもそも正しいスプライトの定義って何なの? おしえてエロい人
主にテレビゲームで用いられる、画面上のキャラクタ(人物・物品等)など小さな絵を高速に表示するための技術的な仕組み 炭酸飲料
簡単に言うと "ハードウェア上で"2Dグラフィックを合成して出力する映像技術 ただコンシューマー畑では長い間 大きく分けて、BG(背景)とスプライト(キャラクタ)の二つのレイヤーを合成して ゲームを作るという概念が一般的であり 現在もニンテンドーDSなどの携帯機でも現役の技術であるために ハードの進化に伴い プレイステーション以降のポリゴンによる2D表現 いわゆる疑似スプライトが一般的になってきた現在でも 2Dによるキャラクタ描画を特に区別することなく「スプライト」という場合が多い スプライトが無いと言ってる派は 「ソフトウェアスプライトは厳密にはスプライトじゃねぇ」 それと叩いてるのは 「こまけぇことはどうでもいいんだよ!」 ということだと思われる
西洋にいる伝説上の小人、妖精、子鬼。
>>989 「ソフトウェアスプライトは厳密にはスプライトじゃねぇ」
→ 頭が固い
「こまけぇことはどうでもいいんだよ!」
→ 現実派
こんなとこかね。
初心者だが、スプライトってのはサンタとソリを分けて合成する技術 と3D画面に2Dの板を入れるみたいな感じだと思ってた
ID3DXSprite != スプライト っていうだけ。
>>989 ソフトウエアスプライトはスプライトだろ。
問題は仮想的にでも背景とキャラクタを別レイヤで扱う機能を、
包括的に持っているかどうか。
だから
>「ソフトウェアスプライトは厳密にはスプライトじゃねぇ」
こんなことを事例に挙げてしまっている時点で、
頭が硬いという問題ではなく、
>>989 自体がただの馬鹿。
こまけぇことはどうでもいいんだよ!
もういいから埋めろよ
背景とキャラクタを別レイヤで扱う機能がスプライトじゃないけどな
梅
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。