1read 100read
2011年11月2期プログラム23: 【C++】 DirectX初心者質問スレ Part36 【C】 (194) TOP カテ一覧 スレ一覧 2ch元 削除依頼

【C++】 DirectX初心者質問スレ Part36 【C】


1 :11/10/19 〜 最終レス :11/11/24
回答する人も、質問する人も必ず読んでください
これらに当てはまる人のための質問スレです。
1.C/C++は多少理解している。
2.最近DirectXを始めたばかり
3.SDKを見ても、Googleで検索しても、いまいち理解できない人
4.余計な雑談は不要ですよ
【 回答してくださる方 】
・ できるだけ優しく質問に答えてあげてください。
・ 優しく教えるのが嫌でしたら、解決するためのヒントだけでも結構です。
 「ググれ」「SDK見れ」以外の回答でおながいします。
・ 神ですら理解不能な質問は無視して下さい。
【 質問する方 】
・ どんな事で躓いているのか明確にしよう。
・ 長くならないなら躓いている部分のコードを晒してみれ。
・ 解決した場合、お礼を言うのは当然だが、何をどうしたら解決したかを明確に書こう。
・ 回答して貰ったら、出来るだけお礼もしよう。
現在の最新バージョンはDirectX 11です。
前スレ
【C++】 DirectX初心者質問スレ Part35 【C】
http://hibari.2ch.net/test/read.cgi/tech/1305885376/

2 :
スレ立て感謝です。
現在D3D11とDirect2DとDirectWriteを同時使用するためDXGIって何ぞや・・と勉強中。
DirectWriteサンプルのGabriolaフォントかっこよすぎワロタ。
実際の処理内容以上にすごいことをやっているように見えるw

3 :
DirectX-ゲームグラフィックス-プログラミング-NextCreator-CREATOR
マスタリングDirectXプログラミング
入門者向けだとどっちがいい本?

4 :
>>3
大きい本屋での立ち読みと、
アマゾンレビューを参考に選ぶべき

5 :
DirectX9で2Dのシューティングを作っていて、自機の表示をrhwで行っていますが、
位置を変える度にバーテックスバッファをロックして座標の変更を行うのは非効率だと思い、
違う方法を考えています。DrawPrimitiveUPを使えばロックせずに済みますが、勉強のためと速度のために
DrawPrimitiveを使った方法にしたいと思っています。
ワールド変換などの行列を使うのかと思いましたが、座標変換済み頂点なので出来ないと思いました。
どういった方法がありますか。

6 :
>>5
数回のDrawPrimitiveで一括描画できれば、upでもそうでなくても
2Dシューティングごときパフォーマンス足りなくなることはないだろう

7 :
パフォーマンスに問題は無いだろうと思いますが、
ビデオカードの扱いに慣れたいのでDrawPrimitiveを使いたいです。

8 :
>>4
大きい書店を回ってみましたがどこにもおいてませんでした(T_T)

9 :
>>7
座標変換済みでも、正射影描画でも
一括ロック&書き変え→一気にDrawPrimitiveすればよろし
ちまちまロックは効率よくないが

10 :
>>8
その大きな書店にある分かりやすそうなのを選ぶのはだめなん?
ここで質問するよりアマゾンレビューの方が参考になるとおもうなぁ

11 :
>>10
情報資格試験や読み物や言語の本ばかりでDirectXの本が全然置いてないんです(;_;)

12 :
三角形ストリップ1つに対してロック1回が最小?
幾つかのストリップをまとめて1回のロックでという訳にはいかないのかな?

13 :
>>12,>>9
いくつかのストリップをうまくまとめて一回のバーテックスバッファの書き換えで済ます方法を思いつきました。ありがとうございました。
それでも毎フレーム一回はロックする必要がありそうです。

14 :
>>11
図書館に取り寄せてもらうか、自分に合わないのを覚悟して買って勉強する。

15 :
まずDirectXでなにをやりたいかによるんじゃないか?
タイトルだけみただけだが
上はグラフィックに重点を置いていて
下は全般的なDirectXくさそう。
個人的にはDirectXの入門書だったら
DirectX9 実践プログラミング( 2.0か1.0でいいとおもう )
11とかやるなら話は別だが入門なら9から初めていいとおもうし
その後Direct3D等々の専門書買うのがベストかと

16 :
DirectX臭そう、まで読んだ

17 :
読力なさ杉ワロタ

18 :
DirectX臭そう、だけ読んだ

19 :
だけ読んだ だけ読んだ。

20 :
だけ読んだ だけ読んだ だけは読んだけど結局どこだけ読めばいいんだっけ?

21 :
DirectX臭そう

22 :
てめぇらツボりすぎだろ

23 :
BAKA BAKKARI

24 :
だな

25 :
ふーん

26 :
Direct3DDeviceって何を表してるの?どの単位で作るものなの?
描画先毎?VRAM毎?GPU毎?

27 :
>26
頂点毎

28 :
テクスチャードクアッドをDrawPrimitive()で2D描画しようと考えていますが、
下記のコードで描画されません。ライティングとマテリアルの設定を変えてみても駄目で、頂点情報の指定で根本的に誤解があるのかもしれないので指摘お願いします。
ちなみに、サンプルからのコピペでXファイルを表示させることはできているので、初期化部分は合っていると思います。
STANDARD_VERTEX lm[4];
LPDIRECT3DVERTEXBUFFER9 vb;
LPDIRECT3DTEXTURE9 pTexture;
STANDARD_VERTEX newVERTEX[]={
{-1.f,0.f,0.f,0,0,-1.f,0xffffffff,0.f,0.f},
{1.f,0.f,0.f,0,0,-1.f,0x55ffffff,1.f,0.f},
{-1.f,1.f,0.f,0,0,-1.f,0x55ff44ff,0.f,1.f},
{1.f,1.f,0.f,0,0,-1.f,0xffffffff,1.f,1.f}
};
memcpy(lm,newVERTEX,sizeof(newVERTEX));
MY_VERTEX_RHW *v;
STANDARD_VERTEX *vv;
pDevice->CreateVertexBuffer(sizeof(STANDARD_VERTEX)*4,0,D3DFVF_XYZ| D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_TEX1,D3DPOOL_MANAGED,&vb,NULL);
vb->Lock(0,0,(void **)&vv,0);
memcpy(vv,lm,sizeof(STANDARD_VERTEX)*4);
vb->Unlock();
//ワールド、ビュー、プロジェクション変換省略。
pDevice->SetTexture(0,pTexture);
pDevice->SetStreamSource(0,vb,0,sizeof(STANDARD_VERTEX)*4);
pDevice->SetFVF(D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_TEX1);
pDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);

29 :
追記です。
DirectX9で
struct STANDARD_VERTEX{
float x,y,z;
float nx,ny,nz;
D3DCOLOR colour;
float tu,tv;
};
です。スレ汚し失礼しました。

30 :
>>28
SetStreamSourceの最後の引数のstrideは1つの頂点のサイズじゃね?
つまり*4がいらねぇんじゃないかな?
しばらくDirectXから離れてたから違ってたらごめん。

31 :
回答ありがとうございます。msdnで確認したところ確かに一つ当たりでしたので、*4を外したんですが、
やはりまだ描画されていません。まだ間違っているところがあるみたいです。

32 :
初期化処理って
パラメータセットの配列にゲームを実行可能なパラメータのすべての組み合わせを性能の良い順に詰めて
初期化が成功するまで配列を走査、全部失敗したらエラー通知
みたいな感じでいいの?

33 :
>>29
CULL_MODEどうしてる? XYZRHWだとY+が下でXYZだとY+が上方向とかになって時計回りが上下反転するとかありそうだけど。
xファイルを原点で表示しながら横にそのソースを埋め込んでみたりは?
ライティングも疑うならNORMAL消してやってみるってのもどうか?
SetTextureStageStateも疑いたいからDirectXSDKのTut05_Texturesあたりに埋め込んでみて出るかどうか試してみるとか。
あんま役に立たなくてごめん。
>>32
いいんじゃね?
動く最低条件から調べて後はあればいいなって機能が使えればそっち優先するようにするのでもいいし

34 :
>>33
カリングNONEにしたら描画されました。感動しました。
仰るとおり、上下逆になったので調整が必要ですが。
本当にありがとうございました。

35 :
>>34
解決してよかった。
XYZRHWでシューティング作ってた人だよね?
XYZになったのならついでにXYZB1とかの行列インデックス使って
行列だけで自機や弾の移動とかやるのも面白いかもよ
STRIPだと縮退させない限りつながっちゃうからTRIANGLE_LISTでDrawIndexedPrimitiveになると思うけど
256個までの弾なら一度に描画できるようになる
(頂点ロックの代わりに行列の転送になる)
さらに自分でシェーダー書くなら4x4のfloatでなく2D平面の場合3〜4個のfloatだけでxyと回転(スケール)ができるよ

36 :
DirectXでオブジェクトを1回送っただけで複数のカメラから見た画像を1度にレンダリングできますか?

37 :
送るのは1回でもいいけど一度にレンダリングは無理だなぁ
VertexBuffer使いまわしで何度かViewMatrixだけ回転とかさせてそのたびにDrawPrimitive系でレンダリングになっちまう

38 :
>>26

39 :
>DrawPrimitive系でレンダリング
DrawPrimitiveの時点ではレンダリングなどされないんだが、何の話をしているんだ?

40 :
>>39
発言が下らないよ
どっちにしてもzバッファもめちゃくちゃじゃね

41 :
BackBufferWidth, BackBufferHeight
これはフルスクリーンの時はデバイスがサポートしてる値
ウィンドウなら自由(123などの半端な数でも可)ということでおk?

42 :
イエス

43 :
IDirect3D9に有効なDepthStencilFormatを列挙するメソッドがないとかおかしいだろ
どうやって調べるんだよこれ

44 :
有効なって何よ
IDirect3D9::CheckDepthStencilMatchで駄目なん?

45 :
初歩的な質問かもしれませんがお願いします。
背景に画像を描画する状態で、10〜20ほどの物体を個別に回転させたいのですが、
デバイスやスプライトはその数だけ生成する必要があるのでしょうか。

46 :
>>45
まずはチュートリアルをやれ。

47 :
>>42
あざっす

48 :
>>47
いえいえ

49 :
>>43
documentよめよ

50 :
D3DFMT_D16の決め打ちでおk
だいたいこんな所でコケるしょんぼりシステムで派手なゲームがまともに動くわけない

51 :
さすがにD_16はないわ。
なんもできねー。

52 :
転売用にAmazon自動予約スクリプト使いたいけど、パソコンの台数と、回線の数、どっちが大事?

53 :
>>52
ルールを守るのが大事。

54 :
>>51
でも32だとクソ重くなるな
いまどきのグラボって速いところはクソ速いけど遅いところはちっとも進化してないな
塗りとかいまだにアフォかってほどおもいな

55 :
頂点色じゃなくてマテリアルのディフューズ色を使ってポリゴンを描画させたいのですが
pID3DDevice->SetRenderState(D3DRS_COLORVERTEX, FALSE);
これでは頂点色が使われてしまい
pID3DDevice->SetRenderState(D3DRS_COLORVERTEX, TRUE);
pID3DDevice->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL);
これでもやはり頂点色が使われ、マテリアルの色は全く反映されません
ヘルプを見るとこれらのレンダーステートを設定すれば良いと思ったんですが
私の解釈が間違っているんでしょうか

56 :
ライティング無効にしてるとかじゃないの?
余計なこと考えずに、SDKチュートリアルを4番から真似てりゃできると思うけどね

57 :
表示キャラクタの移動量(dx, dz)から角度を計算したいんですが同じベクトル
または逆方向のベクトルの時にNaNになってしまいます(dxが0だと時々発生)
float angle;
D3DXVECTOR3 v(dx, 0, dz);
D3DXVec3Normalize(&v, &v);
angel = acosf(D3DXVec3Dot(&D3DXVECTOR3(0.0f, 0.0f, -1.0f), &v));
一応無理やり
if (!(ang < 7.0f)) ang = (va.z < 0.0f) ? 0.0f : D3DX_PI;
みたいにして対応してるんですがもっとスマートな方法はないでしょうか?
移動方向にキャラクタを向けたいんです

58 :
if (!(angle < 7.0f)) angle = (v.z < 0.0f) ? 0.0f : D3DX_PI;
でした

59 :
深夜のテンションでレスするとatan2じゃなくてacosfでいいのかな?

60 :
2Dなら単位ベクトルの成分でatan2するだけでおk

61 :
>>59-60
余計な処理もなく1行になりましたw
ありがとうございます

62 :
あ、ていうかノーマライズもいらないか
(x,z)==(0,0)の時だけ注意してatan2(x, z)でいい

63 :
自分で作るdirectxのゲームはフルスクリーン時でも簡単にキャプチャ取ったり
デュアルウィンドウの時はカーソルを隣のウィンドウに行き来したりしたいんですけど
ひょっとしてフルスクリーンで行うのは実は無理でウィンドウバーを消した拡大表示をするしかないですか?

64 :
>>63
ん?・・・

65 :
ひょっとしてウィンドウモードの時って1ピクセルでも描画領域のサイズが変化したらリストアするべきなんですか?

66 :
>>65
バックバッファとウィンドウのサイズが常に一致することが望ましいならね
まあ、リサイズ時のデバイスのリセットを回避したいだけなら
デバイス作成時の既定のスワップチェインは無視して
ウィンドウに追加スワップチェインを割り当てると
リサイズ時は追加スワップチェインを作り直すだけで済むよ
ツール上のレンダリングを想定しててXP捨てていいならD3D11にするのがベストだけどね

67 :
へえ

68 :
>>56
2D描画なのでライティングは無効にしているんですけど、ライティング無効だと頂点色を使うことしかできないんですか?
頂点色を変えるのにいちいち全ての頂点の色変えるのもなあ、と思い、マテリアルのディフューズ色で出来たらと思ったんですが
できないっぽいですね・・・ 素直に全ての頂点色を変えようと思います

69 :
へえ

70 :
>>68
シェーダ使えやハゲ

71 :
>>68
D3DTSS_CONSTANT/D3DTA_CONSTANTあたりで出来るんじゃねえの
使ったこと無いけど

72 :
(´・ω・`)無いけどね

73 :
そんな事するぐらいなら頂点色使うわ

74 :
>>73
頂点色つかうよね

75 :
頂点色を変えるのにいちいち全ての頂点の色変えるのもなあ
って何?

76 :
モデラーに無い機能実装して実機でしか見れない状況作って
仕事増やして自分の居場所を確保するとか涙ぐましいにも程がある

77 :
D3DXCreateTextureで生成したテクスチャに図形ソースのマスク後付けって出来ます?

78 :
ロックしてアルファ値に書き込めばいいじゃねえの

79 :
>>78
なるほど
あざまーす

80 :
遅そうだけど

81 :
>>79
いえいえ

82 :
超初心者なんですが、Managedで勉強少ししたんですが、
C++で勉強した方が後々良いのでしょうか。
ちなみに、C#で正四面体を表示しようと
http://sorceryforce.com/manageddirectx/direct3d_box.html
上記のページを参考にコードを書いたのですがうまくいきません
スレ違いはわかってますが、できれば教えていただきたいです。
private byte[] vertexIndices = new byte[] {
0,1,3,
3,2,1,
1,0,3,
3,2,0
};
vertex = new VertexBuffer(typeof(CustomVertex.PositionColored),
4, device, Usage.None, CustomVertex.PositionColored.Format, Pool.Managed);
using (GraphicsStream data = vertex.Lock(0, 0, LockFlags.None))
{
CustomVertex.PositionColored[] vertices = new CustomVertex.PositionColored[4];
vertices[0] = new CustomVertex.PositionColored(1f, 1f, 1f, Color.Red.ToArgb());
vertices[1] = new CustomVertex.PositionColored(1f, -1f, -1f, Color.Green.ToArgb());
vertices[2] = new CustomVertex.PositionColored(-1f, 1f, -1f, Color.Blue.ToArgb());
vertices[3] = new CustomVertex.PositionColored(-1f, -1f, 1f, Color.Yellow.ToArgb());
data.Write(vertices);
vertex.Unlock();
}
indexBuffer = new IndexBuffer(device, 4 * 3 * 1, Usage.WriteOnly,
Pool.Managed, true);
using (GraphicsStream data = indexBuffer.Lock(0, 0, LockFlags.None))
{
data.Write(vertexIndices);
indexBuffer.Unlock();
}

83 :
なんか名前欄の名前がどっかでコピーしたものを
そのままペーストしてしまったみたいで、気にしないでください。

84 :
Managed Directxとかオワコン
SlimDXかXNA推奨

85 :
XNAは資料とかあるけど、SlimDXはほとんどないよね

86 :
ただのラッパーに必要な資料とは何ぞや

87 :
>>82
パッと見、vertexIndicesがbyte配列なのがまずいんだと思うよ。
short配列にするかint配列にしてsixteenBitIndicesをfalseにしてやってみ。

88 :
頂点ブレンドに関して、線形でやっていたのですが、つぶれに我慢できずデュアルクォータニオンにしてみました。
しかしねじれに関しては中々なのですが、曲げに関しては膨らんでしまうのがどうも・・・。
知人に、今はデュアルクォータニオンより良いブレンド方法があると聞いたのですが、どういうものなんでしょうか?

89 :
>>88
知人に聞け

90 :
知人はモデラーでして、曖昧な上にプログラム的なことはさっぱりなのです
検索しても出てきませんし、知人の勘違いですかねぇ

91 :
>>90
モデリングソフトの話ならメーカー独自のワケわからんのがたくさんある
でも計算式が公開されてるわけではないんだぜ

92 :
曲げに関して膨らんでしまうのはブレンド手法うんぬんよりも
むしろデータの方に問題があるんじゃね。
どんな入力データでも破綻なく描画できる魔法のブレンド手法っつー意味ならないよ。
ところでここは初心者スレな。

93 :
上級者スレなんかあるのか
鬱出し脳スレも昔になりにけり

94 :
C++とDirectxSDKを落として参考書もそろえたのに、1週間経ってもエラーだらけで何も始められていない
何がいけないんだ・・・

95 :
>>94


96 :
誰か上級者スレ立てろよ
俺みたいなスーパーハイレベルプログラマになると
このスレの話題は初歩的すぎて暇つぶしにもならない

97 :
上級車は自己解決できるから、スレなど不要。

98 :
中級者は?

99 :
ハイパーかわいいスーパープログラマなオレも中級以上スレはあればうれしいな
会社でいまだにXP使わされてるやついるから9まででしかプログラムさせてもらえないオレに
テッセレーションとかの話題を見せ付けて癒してくれ

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼