トップページgamedev
1001コメント341KB

Direct 3D

■ このスレッドは過去ログ倉庫に格納されています
0001.01/11/09 17:06ID:wrfy6OtC
Direct Xはあるみたいですが、こちらはD3D専門という事で。
とりあえずDX8以降は初期化が簡単になったり関数が変わったり
結構大幅に変わりましたがその辺も踏まえてお願いします。
0304名前は開発中のものです。03/12/17 21:23ID:kecn54jU
>>301
3Dっつーのもそろそろ限界に来てるな。
技術じゃなくて需要が。
0305名前は開発中のものです。03/12/21 22:32ID:n1iQDmEm
>>303
そういうときだけは表側は描かないで、代わりにステンシルバッファ全部を
インクリメントしちゃって、そのあといつもどおり裏側で抜く。
で、うまくいきそうな気がするけど
0306名前は開発中のものです。03/12/21 22:45ID:oSm5qie6
入るぎりぎりのとこ、つまりステンシルボリュームが
前クリッピング平面にクリッピングされたとこが視界に入るような状況だと(動きが早いと数フレームぐらいしか生じないけど)
そこで見た目がへんになるんだよな…

まぁクレタクは305のほうほうだろうけど
0307名前は開発中のものです。03/12/22 02:44ID:o8QuJx9z
ニアにかかったステンシルはニアのXY平面で反転して描画。するとクリップされたポリだけが描画できるので無問題。
そうそう、反転した面はZ無視でね。

厳密にはこれでも結構問題でるんだけど、取り合えず動きが早いものなら誤魔化せます。
0308名前は開発中のものです。03/12/22 17:52ID:VTzd2bKs
なるほど皆さん凄いな!俺も今日からは丸影を卒業して、ステンシル影にチャレンジ
でも最近は、光源から見て描画したZ値と、視点から見たZ値を比較して影を
描くのが流行みたいね
0309名前は開発中のものです。03/12/22 17:57ID:Q6Mm9LXS
丸影 != ステンシル影
って訳ではないのだが。
シャドウボリュームを端折って、ステンシルで丸影を使う場合もある。
0310名前は開発中のものです。03/12/22 18:13ID:VTzd2bKs
>>309
丸影のテクスチャを描画する代りに、ステンシルの値のみ変えるよう描画し、
画面の描画が全部終わったところで、ステンシルの値が変わっている
ピクセルを影っぽい色をブレンドして塗るってこと?
0311名前は開発中のものです。03/12/22 18:30ID:Q6Mm9LXS
シャドウボリュームが円筒状というだけの話なんだけど。
まともに作ると重いから。
0312名前は開発中のものです。03/12/22 21:00ID:VTzd2bKs
>>311 納得。
0313名前は開発中のものです。03/12/22 22:54ID:yj69sFk7
>>307
5時間考えたけどどーしてもその方法ワカラン・・・

前投影面の少し前でクリッピングするほうほうじゃだめかねぇ、
まぁこの方法自体難しい気がするけど
0314名前は開発中のものです。03/12/23 01:45ID:1vDrzUD8
んーと。説明悪かった。2パスで描画すんのよ。まず、ニアにかかるってケースを検出してね、

1パス目…普通に描画
2パス目・・・Z*-1してZは無視で描画。

すると、2パス目でニアでクリップされた部分が描画されるしょ?これでニアクリップ面は塞がれるって寸法。
でも、解説の為に簡略したけどホントは2パス目はニア平面で反転させないとダメよ。

まー、描画コスト高いけどコレが一番楽。というか、305のやり方の方がよく解らん。無理がある気がする。
0315名前は開発中のものです。03/12/23 01:47ID:1vDrzUD8
DirectX8世代なら4パスか。まぁいいや。オレの予感じゃDOOM3も多分コレ。
0316名前は開発中のものです。03/12/23 02:21ID:VyQpIX7z
>>314>>315
サンクス!
よーやくわかたよ。なるほどね、うまいこと考えるね。プロ?
オレの考えた方法に比べれば
実質ステンシル描画負荷2倍なんて軽いもんだ。
0317名前は開発中のものです。03/12/23 02:54ID:58Qv7PQZ
でもさあ、同人でもプロでもいいから
そういう技術つかった日本のPCゲームないじゃん。
0318名前は開発中のものです。03/12/23 03:08ID:EO+0r1r5
コンシューマであるじゃん。
0319名前は開発中のものです。03/12/23 07:23ID:z5pCXM0M
コンシューマつまんねーからやんないし。
他にはどこで使われてんの?
0320名前は開発中のものです。03/12/23 13:44ID:3A9yt2E/
あげても全部つまんねーで片付けられそう。
コンシューマーはどの辺がつまんないの?
つーかやったことあるの?
0321名前は開発中のものです。03/12/24 02:14ID:fo2vArQT
>>316
いや、それフツーに使われてるテクだと思うよ。少なくとも自分のいるコンシューマ屋じゃ常識ぽいかも。
SONY製の安物ハードだとニアクリップも自前でやらにゃあかんのでそのついでにニアでふさぐけどね。
なんつー前時代的な・・・

コンシューマ屋は昔から失敗作みたいなハードが主流を握る傾向があるので技術があっても表に出しにくい
ってのがあるな。なんだったらサイレントヒル3とかカーマックも舌打ちしそうな出来だから見とくといいよ。
ま、PC版もあるわけだけど。
0322ステンシル大好きな人03/12/30 08:05ID:2wi9wpGv
シャドウボリュームの中に視点が入ってしまう問題は、そんな面倒なこと
しなくても、ZFAILでステンシルを更新する方法を使えば解決するよ。
ただ、逆にファークリップにひっかかる場合に問題になるけど。
あとフィルが、普通の方法よりも厳しい。

車ゲーみたいにある程度視点と光源の位置関係が固定されているなら、
ファークリップの問題はほとんど関係ないかも。
リプレイなんかで上から見下ろすときは、逆にニアの問題が有り得ないから
状況に応じて使い分ければいいかと。
0323名前は開発中のものです。03/12/31 07:55ID:dYmJ5kjK
>>322氏の方法を試してみた
裏面は、D3DRS_STENCILZFAILをD3DSTENCILOP_INCRSATにして描画
表面は、D3DRS_STENCILZFAILをD3DSTENCILOP_DECRSATにして描画
これだけで影に視点が入ってもうまく表示できたよー!
自機に背景の影が落ちるの見てなんか感動した
さて次は、視点からの距離で影にもフォグがかかるようなんとかしたい…
0324名前は開発中のものです。04/01/04 09:26ID:uFzLO2ik
何故ZFAILにする必要があるのかよーわからんけど
飽和減算で裏面を書けば防げるってことかな?
0325名前は開発中のものです。04/01/04 09:27ID:uFzLO2ik
あぁ、ごめん書いた直後に分かった
0326名前は開発中のものです。04/01/04 14:06ID:kQ7jSRJZ
概念を簡単に説明すると
地面を境界にシャドウボリュームを2つに分断して、その断面を暗くすれば
影になるわけだけど、普通の方法は分断されたシャドウボリュームの地面より
上の方を使っている。ZFAILの方法は、地面より下のボリュームを使っている。
どちらを使っても断面の形状は全く一所だから、同じ影ができる。

ただ、ZFAILの方法をセルフシャドウに使おうとすると、ちょっと注意が必要。
0327名前は開発中のものです。04/01/29 12:03ID:aRkiSiXS
ソvidaのフォトショップ用ノーマルマップ作成プラグイン
ttp://developer.nvidia.com/object/nv_texture_tools.html

これの使い方がさっぱりわまかそりん。どこのボタン選択して
も真っ青(法線ベクトルのまま)の画像しか生成されません・・・教えてシェーダー使いの人
032832704/01/29 12:50ID:aRkiSiXS
高さのスケール値を指定したらできました。
ナンチャンの顔から作ったノーマルマップを使ってバンプ表現にチャレンジ・・・
0329名前は開発中のものです。04/01/29 16:20ID:JOflTWGE
何気に素晴らしいネーミングだ
ちんぽりごん

0330名前は開発中のものです。04/01/30 13:37ID:ISbdpqEk
すいませんがどなたか教えていただけませんか?
3Dゲームにおいて爆発などのエフェクトはどういったポリゴンで
表現されているのでしょうか?
0331名前は開発中のものです。04/01/30 15:02ID:+aDGr/Yc
イタポリとか
0332名前は開発中のものです。04/01/30 15:14ID:vd2N2Ux7
漏れもただのビルボードで・・・
0333名前は開発中のものです。04/01/31 08:19ID:IQTlYJOf
小生も不覚ながらビルボード。
ひょっとして >>330 は ビルボード行列の作り方を聞きたかったのか?
033433004/01/31 15:14ID:PYmxYIqC
最近3Dのゲームを作っておりましてエフェクトを作ろうとした時
爆発でどこからみても爆発して見えるのはてっきり爆発用に
頂点データ的なものがあるのかな〜と思いまして、しかしそれだとすごく
疲れる作業だな〜と思い聞かせていただいた所存でございます。
キャラの位置に合わせてポリゴンをビルボードしてるんですかね。
ありがとうございました。
もしよろしければビルボード行列の作り方を教えて戴けませんでしょうか。
0335名前は開発中のものです。04/01/31 16:56ID:WSdg894Q
>>334
sprite.Begin(SpriteFlags.Billboard | SpriteFlags.SortDepthFrontToBack);
とか。

DX9 Summer 2003 Update 用ね
0336名前は開発中のものです。04/01/31 17:24ID:IQTlYJOf
んー私の記憶が正しければ…

matView ビュー行列(あらかじめ作っとく)
matBillboard ビルボード行列

D3DXMatrixInverse( &matInv, NULL, &matView );//行列の逆元
matBillboard = matInv;
matBillboard._41 = 0.0f;//X移動を0
matBillboard._42 = 0.0f;//Y移動を0
matBillboard._43 = 0.0f;//Z移動を0

たしかこれでビルボード行列ですはいー。
0337名前は開発中のものです。04/02/01 13:19ID:u/zDYgLU
メガデモ見てると自分に自信がなくなってくる・・・ 
033833004/02/01 14:16ID:372QHYP7
本当にありがとうございました。
実はもう1つ問題がありまして、もしよろしければ助けて戴けないでしょうか。
334でも述べた通り3Dゲームを作っておりましてアクションゲームなのですが
X,Y,Z 10,6,30 のMAPでブロック(x,y,z=1,1,1)を表示していきたいのですが、
現在頂点データを6個で立法体(1,1,1)でMAPを表示しておりますがそれでは
ポリゴン数が多すぎてFPSがでないので、ブロックの大きさを2,1,1や4,2,3
などの頂点データを打っているのですが数を上げていくと頂点データを
1000以上打たなければいけない計算になります。
この問題に大して打開策がありましたら教えて戴けませんでしょうか。
0339名前は開発中のものです。04/02/01 14:22ID:qGvNFBm3
速度を上げる工夫をする
or
MAPの仕様を変える
0340名前は開発中のものです。04/02/01 14:30ID:w7gnma4r
見えない部分のマップを描かない。
0341名前は開発中のものです。04/02/01 15:44ID:Xi+ahqRK
1つ1つのポリゴンを描画する度、DrawPrimitive系命令を呼んでたりして?
0342名前は開発中のものです。04/02/01 16:21ID:OUnuJC++
>>341
それやってたとしてもそんなに遅くはならないはずだけど。
0343名前は開発中のものです。04/02/01 16:32ID:MUD5wauh
うおっバカ系来た
0344名前は開発中のものです。04/02/01 16:47ID:u/zDYgLU
>>342
IDがC++
0345名前は開発中のものです。04/02/01 20:19ID:zmw0Mii3
Photoshop7.0が10万って高!
安い店ないかな?
0346名前は開発中のものです。04/02/01 20:40ID:u/zDYgLU
スレ違い
034733004/02/02 03:04ID:RyS6mA+O
DrawPrimitive系命令を呼んでたりして?
これやってますね。何か他の方法があるのですか。
0348名前は開発中のものです。04/02/02 05:27ID:Jm+cIG2+
>>345
プログラマならはっきりいってこんなんで十分だぞ。
http://www.amazon.co.jp/exec/obidos/ASIN/B00006JMXI/249-6804501-1889152

>>347
誰のレスに何を聞きたいのか非常にわかりづらいので
もっとわかりやすくなるようにしてくれないですかね?
0349名前は開発中のものです。04/02/02 05:52ID:Jm+cIG2+
>>338
いくつか疑問が・・・。

>X,Y,Z 10,6,30 のMAPでブロック(x,y,z=1,1,1)を表示していきたいのですが、
>現在頂点データを6個で立法体(1,1,1)でMAPを表示しておりますがそれでは
>ポリゴン数が多すぎてFPSがでないので、ブロックの大きさを2,1,1や4,2,3
>などの頂点データを打っているのですが
とありますけど、そもそも謎の多い文章なんですよこの文章は。

まず、X,Y,Z(10,6,30)のマップっていうけど1ブロック辺り12ポリ使ったとしても
10*6*30*12で21600ポリ程度じゃポリ数が原因で速度が落ちることはあんまり無いと思うけど?
しかもこれって全部画面に出した場合であって普通はマップのある部分だけなんでしょ?
はっきりいってポリ数が速度の落ちる原因とは考えにくい。

で、ここでいくつか質問だけど

・クリッピング処理(画面からはみ出た部分を描画しないようにする処理)はちゃんとやってる?
・みえない部分は描画しないようにしてる?(Zバッファを利用して前から描画とかでもいいや)
・実際のゲームの画面で一回の描画で何ブロック描画する必要があるのよ?(マップ全部じゃないでしょ?)
・カリングの設定はしっかりできてる?
・本当に速度の落ちる原因はポリ数だったか調べた?
 (実はこれを調べるのは結構困難。単に描画面積がでかかっただけかもしれないし、
  クリッピング処理が上手く働いていなかったとか・・・。)

あたりは全部やってるの?
0350名前は開発中のものです。04/02/02 06:32ID:HsES/+LZ
>>348
Photoshop Elementsはアルファチャンネル削られてるからゲープロ的にはだめぽだと思う。
DirectDraw世代なら別にかまわないけど。
0351名前は開発中のものです。04/02/02 06:43ID:Rie53uXk
>>330
環境にもよるがDrawPrimitiveをめっさいっぱい呼ぶともっさりするので注意な。

>>336
誰も突っ込まないので(というか突っ込まなくてもいいか?)一応。

matView ビュー行列(あらかじめ作っとく)
matBillboard ビルボード行列

D3DXMatrixTranspose(&matBillboard, &matView);//転置
matBillboard._14 = matBillboard._24 = matBillboard._34 = 0.0f;

この方が早い。逆行列使うのは避けた方がいいでそ?
0352名前は開発中のものです。04/02/02 06:49ID:Rie53uXk
>>350
そこでMS謹製のTextureToolですよ。





('A`)マンドクセ
0353名前は開発中のものです。04/02/02 07:25ID:Jm+cIG2+
>>350
pngで保存すると背景の部分がアルファチャンネル扱いになるけど?
それで十分じゃないの?
0354名前は開発中のものです。04/02/02 07:31ID:Jm+cIG2+
>>351
ビルボードなんてカメラと平行っぽくなってりゃいいんじゃないの?
なんで逆行列や転置が必要なのかわからない。

そのままでいいだろ。

D3DXMATRIX bill = view;

んで、

bill._41 = bill_x;
bill._42 = bill_y;
bill._43 = bill_z;

で完成じゃボケ。
0355名前は開発中のものです。04/02/02 13:50ID:f+P8GJRa
>>354 おぬし男の中の男だな。
0356名前は開発中のものです。04/02/02 20:52ID:qCykuM3X
directXってどういうものですか?
言語ではないと聞いたんで…。
DirectX覚えただけではゲーム作れないんですか?
0357名前は開発中のものです。04/02/02 21:31ID:ruvzNpBE
http://e-words.jp/w/DirectX.html
035835604/02/02 21:38ID:WcP70SUw
>>357
サンクスベリーマッチョ。
0359名前は開発中のものです。04/02/02 23:37ID:qCykuM3X
読んでもやっぱり分からないんですが
DirectXだけ勉強してゲームは作れるんでしょうか?
0360オレー04/02/03 00:26ID:lqBJLK7t
>>359
わかりやすく言うと、DirectXはゲームとかにつかう命令のセットだ!
コントローラーのボタンを読め!とか、ポリゴンを描け!とか命令するとやってくれる。
C++とか他の言語で、その命令を呼んでやるわけだが、そーいうもんだから呼ぶために言語も勉強しろ!!
036128904/02/03 01:28ID:pyweXtof
てことは、C++とかじゃできないことをやってくれるのがDirectXですか。
それとも、C++でもできることを簡単にするように使うのがDirectXですか?
とりあえず言語は覚えてみます。
0362オレー04/02/03 01:38ID:aqfOOcxz
>>361
とりあえず、基本的なとこでいいから、てきとーに言語覚えてからすぐSDKについてるサンプルをビルドしろ!
そんで改造していくと覚えるの速いぞ。マジお勧めなこれ
0363X04/02/03 01:40ID:low7AtO4
どうも330です。330ですというとわかりにくいのでXと呼んで頂ければと思います。
X,Y,Z 10,6,30 のMAPにおいてfor文で回してMAP情報を書き込んだ3次元配列から
データを読み取ってブロック表示しているのですが。
ここで今まで書き込ませて戴きましたが、皆さんとても豊富な知識をお持ちのようで。
そこで大変ご迷惑だとは思いますがE-mailに乗せてあるアドレスで私はメッセンジャーを
使っておりましてもしよろしければ私のプログラムを見てもらいましてアドバイスをいただきたいのですが。
大変ご迷惑な事、ずうずうしい事とは承知しつつもし見て戴ける方が居られましたらお願いいたします。
0364名前は開発中のものです。04/02/03 02:16ID:6qjzgiJc
微妙に変な日本語だな
0365名前は開発中のものです。04/02/03 02:42ID:V33o00bN
ソースうpしる
0366名前は開発中のものです。04/02/03 10:02ID:nvDFyoS5
>>363
わざわざメールでやりとりなんて疲れるから
http://cgi.f6.aaacafe.ne.jp/~pyuav/php/upload.php
うpしる!
0367X04/02/03 11:14ID:q1OWKOSR
//----------ゲーム本体------------------------------------------------------
// DrawMain - 描画メイン
// この関数は1フレームごとに呼び出されます
void DrawMain(){
// バックバッファと Z バッファをクリア
lpD3DDEV->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
// 描画開始
lpD3DDEV->BeginScene();
D3DXMATRIX matWorld,matRotateX,matTrans,matView;
0368X04/02/03 11:14ID:q1OWKOSR
static float PlayX=12,PlayY=10,PlayZ=-8;
static float BectolX=3,BectolY=0,BectolZ=8;
// 視点は (0,0,0) にあり、(0,0,5) の方向を向く
D3DXMatrixLookAtLH(&matView,&D3DXVECTOR3(PlayX,PlayY,PlayZ),&D3DXVECTOR3(BectolX,BectolY,BectolZ),&D3DXVECTOR3(0,1,0));
// プロジェクション行列を設定
D3DXMATRIX matProj;
// 視界 60 度、近くの限界 0.1、遠くの限界 100.0
D3DXMatrixPerspectiveFovLH(&matProj,60.0f * PI / 180.0f,1.0f,0.1f,100.0f);
// 各行列を設定
lpD3DDEV->SetTransform(D3DTS_VIEW,&matView);
lpD3DDEV->SetTransform(D3DTS_PROJECTION,&matProj);
0369名前は開発中のものです。04/02/03 22:31ID:Dj4DkP/N
BectolXワラタ
0370名前は開発中のものです。04/02/03 23:32ID:/6vJImFb
英語力って大事だな
Bectol → Vector
0371オレー04/02/03 23:34ID:VYXMEMW7
このソース途中じゃん。続きは???????
0372名前は開発中のものです。04/02/03 23:53ID:pACG0/A5
D3DXVECTOR3がソースにある以上
英語力の問題でもないような。
途中までだけどなんか根本的に
わかってないような気がする。
0373名前は開発中のものです。04/02/04 00:08ID:8XXIUaLn
>>372
そう?とりあえずここまでのソースは問題なさそうな感じだけど。
細かくはみてないけど。
0374名前は開発中のものです。04/02/04 00:25ID:yUu1C7Gn
>>373
だってベクトルって言葉は知ってるのに
D3DXVECTOR3をベクトルって気付かないまま使ってるのはどうかと思う。
float x 3 使っちゃってるし。

サンプルか何かを見ながら
よくわからないままコーディングしてる気がする。
0375名前は開発中のものです。04/02/04 00:40ID:8XXIUaLn
>>374
いや、さすがにそれだけじゃ判断できないって。
0376名前は開発中のものです。04/02/04 01:22ID:S4gpfpmI
一緒に机並べてる奴がこんなソース書いてきたら、
どんな力を利用してでも自分の周りから遠ざけるけどな。
0377名前は開発中のものです。04/02/04 02:01ID:yUu1C7Gn
>>375
問題ないと思うならメッセンジャーでアドバイスしてあげてよ。
0378名前は開発中のものです。04/02/04 07:36ID:r/i/wFB8
これだけでもstatic floatとか色々と突っ込みたいところいっぱいあるなぁ。
0379X04/02/04 08:32ID:TUjDrKub
void DrawMain(){
lpD3DDEV->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
lpD3DDEV->BeginScene();
D3DXMATRIX matWorld,matRotateX,matTrans,matView;
static float PlayX=12,PlayY=10,PlayZ=-8;
static float BectolX=3,BectolY=0,BectolZ=8;
D3DXMatrixLookAtLH(&matView,&D3DXVECTOR3(PlayX,PlayY,PlayZ),&D3DXVECTOR3(BectolX,BectolY,BectolZ),&D3DXVECTOR3(0,1,0));
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH(&matProj,60.0f * PI / 180.0f,1.0f,0.1f,100.0f);
lpD3DDEV->SetTransform(D3DTS_VIEW,&matView);
lpD3DDEV->SetTransform(D3DTS_PROJECTION,&matProj);

// MAP表示
int X,Y,Z;//各座標ループ用
lpD3DDEV->SetTexture(0,BLOCK01texture);
for(Z=0;Z<2;Z++){
for(Y=0;Y<6;Y++){
for(X=0;X<10;X++){
switch(MAP[Z][Y][X][1]){
case 111:PrintBLOCK(&matTrans,&matWorld,Z,Y,X,0,6);break;
case 211:PrintBLOCK(&matTrans,&matWorld,Z,Y,X,6,12);break;
case 311:PrintBLOCK(&matTrans,&matWorld,Z,Y,X,12,18);break;
case 411:PrintBLOCK(&matTrans,&matWorld,Z,Y,X,18,24);break;
case 511:PrintBLOCK(&matTrans,&matWorld,Z,Y,X,24,30);break;
case 611:PrintBLOCK(&matTrans,&matWorld,Z,Y,X,30,36);break;

}}}
po=1;
FrameCnt();
lpD3DDEV->EndScene();
if (FAILED(lpD3DDEV->Present(NULL,NULL,NULL,NULL))){lpD3DDEV->Reset(¶m);}
}
0380X04/02/04 08:35ID:TUjDrKub
遅くなってすいませんでした。
改行が多くて乗せれないみたいなことがでてしまい時間がかかりました。
皆さんアドバイスお願いいたします。
MAP表示のSelect文のcaseはあともっとあります。
0381名前は開発中のものです。04/02/04 09:12ID:S4gpfpmI
ここまでやっちゃいけない事例のオンパレードなコードも珍しい。
D3Dより先にC言語を勉強するべき
0382名前は開発中のものです。04/02/04 09:43ID:+5PC35hU
#define BLOCK_SIZE_X (1.0f)
#define BLOCK_SIZE_Y (1.0f)
#define BLOCK_SIZE_Z (1.0f)

CUSTOMVERTEX *pcv = (CUSTOMVERTEX *)locked_ptr; // 頂点バッファが望ましい
for(Z=0;Z<2;Z++){
for(Y=0;Y<6;Y++){
for(X=0;X<10;X++){

 if( MAP[Z][Y][X] != 0 ) { // 描画するか否か
  float x = X*BLOCK_SIZE_X;
  float y = Y*BLOCK_SIZE_Y;
  float z = Z*BLOCK_SIZE_Z;
  D3DCOLOR c;
  float tu,tv;

  // 立方体を構成 (カラー、UVは適当に設定)
  (*pcv++) = CUSTOMVERTEX( x, y, z, c, tu,tv );
  (*pcv++) = CUSTOMVERTEX( x, y+BLOCK_SIZE_Y, z, c, tu, tv );
  (*pcv++) = CUSTOMVERTEX( x+BLOCK_SIZE_X, y+BLOCK_SIZE_Y, z, c, tu, tv );
  (*pcv++) = CUSTOMVERTEX( x+BLOCK_SIZE_X, y, z, c, tu, tv );
                     :
                     :
  poly_counter += 1ブロックあたりのポリゴン数;
 }
}}}

DrawPrimitive( QUADLIST, poly_counter );

もしくは1ブロックごとにD3DTS_WORLDを更新してDrawPrimitive系()を複数回呼ぶ。
・・・俺はなにか勘違いしてるんだろうか
0383名前は開発中のものです。04/02/04 14:21ID:fWwu0COO
ソースを圧縮してアップローダーにでも上げてくれれば良いのに
0384名前は開発中のものです。04/02/04 22:39ID:uFnV7/G9
ああ・・・クラクラしてきた。
漏れダメかもしんない。
0385X04/02/05 14:10ID:6C1zUxy0
>ここまでやっちゃいけない事例のオンパレードなコードも珍しい。
どこか教えて戴けないでしょうか。
0386名前は開発中のものです。04/02/05 14:15ID:8EbK+SUS
>>385
switchの事だと思うけど。

あと、PrintBLOCK()の中身の一部を晒しつつ
トリップつけてみてよ
0387X04/02/05 14:40ID:6C1zUxy0
void PrintBLOCK(D3DXMATRIX *matTrans,D3DXMATRIX *matWorld,int MapZ,int MapY,int MapX,int H,int OF){
int HF,W,WF,O;
HF=H+2;W=H+2;WF=H+4;O=H+4;
if(MAP[MapZ][MapY][MapX][0]==1){H++;}
             ・
for( ;H<HF;H++){
D3DXMatrixTranslation(matTrans,MoveX[MapZ][MapY][MapX],MoveY[MapZ][MapY][MapX],MoveZ[MapZ][MapY][MapX]);
*matWorld = *matTrans;
lpD3DDEV->SetTransform(D3DTS_WORLD,matWorld);
lpD3DDEV->SetStreamSource(0,vb[H],0,sizeof(LVERTEX));
lpD3DDEV->DrawPrimitive(D3DPT_TRIANGLEFAN,0,2);
}
for( ;W<WF;W++){
D3DXMatrixTranslation(matTrans,MoveX[MapZ][MapY][MapX],MoveY[MapZ][MapY][MapX],MoveZ[MapZ][MapY][MapX]);
*matWorld = *matTrans;
lpD3DDEV->SetTransform(D3DTS_WORLD,matWorld);
lpD3DDEV->SetStreamSource(0,vb[W],0,sizeof(LVERTEX));
lpD3DDEV->DrawPrimitive(D3DPT_TRIANGLEFAN,0,2);
}
for( ;O<OF;O++){
D3DXMatrixTranslation(matTrans,MoveX[MapZ][MapY][MapX],MoveY[MapZ][MapY][MapX],MoveZ[MapZ][MapY][MapX]);
*matWorld = *matTrans;
lpD3DDEV->SetTransform(D3DTS_WORLD,matWorld);
lpD3DDEV->SetStreamSource(0,vb[O],0,sizeof(LVERTEX));
lpD3DDEV->DrawPrimitive(D3DPT_TRIANGLEFAN,0,2);
}
}
こんな感じです。LPDIRECT3DVERTEXBUFFER9 vb[]がグローバルでvb[1800]確保していてその変数の中に頂点データを格納してます。
379のfor文のZが少しおかしかったです。終了条件は30でした。
if文の・はその数値によって立方体のどの面を表示しないかを設定してます。
0388名前は開発中のものです。04/02/05 15:01ID:8EbK+SUS
なにゆえ頂点バッファが1800も?
1つじゃだめなの?
0389名前は開発中のものです。04/02/05 15:14ID:/vLOTadA
もはやつっこむ所が多すぎてつっこみきれん。
もうネタとしか思えない。
0390名前は開発中のものです。04/02/05 15:18ID:yFFdfEYa
ポリゴン2つ描画するのに、毎度DrawPrimitive使うのはかなり重いんじゃないか?
あと、もし毎フレームごとに頂点バッファ作っているようなら、
背景みたいに変形しないモデルなら、最初に全てのポリゴンを含んだ頂点バッファを
1つ作っておいて、それをDrawPrimitiveで描画したほうが手間がかからないよ。
0391名前は開発中のものです。04/02/05 15:53ID:8EbK+SUS
int flag = MAP[MapZ][MapY][MapX][0];
ブロック[0,0,0]の 常に描画する6ポリゴン
ブロック[0,0,0]の flag!=1の時だけ描画する6ポリゴン
ブロック[1,0,0]の 常に描画する6ポリゴン
ブロック[1,0,0]の flag!=1の時だけ描画する6ポリゴン
ブロック[2,0,0]の 常に描画する6ポリゴン
ブロック[2,0,0]の flag!=1の時だけ描画する6ポリゴン
            :

void DrawMain() {
  lpD3DDEV->SetStreamSource(0,vb,0,sizeof(LVERTEX));
  for(Z=0;Z<2;Z++){
  for(Y=0;Y<6;Y++){
  for(X=0;X<10;X++){
    PrintBLOCK(Z,Y,X);
  }}}
}
void PrintBLOCK( int MapZ, int MapY, int MapX ) {
  D3DXMATRIX matWorld;
  D3DXMatrixTranslation(&matWorld, MoveX[MapZ][MapY][MapX], MoveY[MapZ][MapY][MapX], MoveZ[MapZ][MapY][MapX]);
  lpD3DDEV->SetTransform(D3DTS_WORLD, &matWorld);

  int StartVertex = (((CAP_X * CAP_Y) * MapZ) + (CAP_X + MapY) + MapX) * 12;
  int PrimitiveCount = (MAP[MapZ][MapY][MapX][0]==1)? 6 : 12;
  lpD3DDEV->DrawPrimitive(D3DPT_TRIANGLEFAN, StartVertex, PrimitiveCount);
}
0392名前は開発中のものです。04/02/05 16:14ID:8EbK+SUS
ものすごい勢いで間違えてた・・・

× :
int StartVertex = (((CAP_X * CAP_Y) * MapZ) + (CAP_X + MapY) + MapX) * 12;
lpD3DDEV->DrawPrimitive(D3DPT_TRIANGLEFAN, StartVertex, PrimitiveCount);

○ :
#define TRIANGLE_NUM (12) // 1ブロックを構成するポリゴン数
#define VERTEX_NUM (3)   // 1トライアングルを構成する頂点数
int StartVertex = (((CAP_X * CAP_Y) * MapZ) + (CAP_X * MapY) + MapX) * TRIANGLE_NUM * VERTEX_NUM;
lpD3DDEV->DrawPrimitive(D3DPT_TRIANGLELIST, StartVertex, PrimitiveCount);
0393X04/02/06 09:41ID:0X7fE0LV
1800個用意してるのはブロックの大きさの違う頂点データを格納しているからです。
MAP情報(ブロックの大きさ、表示面FLG)をtxtから読み込んで表示させています。
1ブロック分の頂点データでMAP表示をしたところポリゴン数が多かったので
違う大きさのブロックを用意してポリゴン数を減らそうとしました。
0394X04/02/07 12:19ID:HQxh50cd
頂点バッファは最初に用意しています。
ポリゴン数は500強まで抑えれたのですが全然FPSがでません。
原因として考えられるものを見たのですがわかりません。
たとえばどんなことをすればFPSがでないのでしょうか。
どなたか教えていただけませんでしょうか。
0395名前は開発中のものです。04/02/07 12:23ID:CLQE2Fb+
>>394
だから500ぽっちのポリ数で処理オチなんてするわけないでしょ。
なんでわからんのかねチミ。
原因は別のところにあるのだよ。
0396名前は開発中のものです。04/02/07 12:31ID:cF8RWyca
劣悪な環境なのかもよw
0397名前は開発中のものです。04/02/07 12:36ID:o6RXyTtt
>>394 少しずつ処理を止めていって、どの処理が重いのか検討つけてみなよ。
その上で、
PCやグラボがショボイってことは無い?MSのサンプルはきちんと動く?HELで動かしてない?
初期化の段階で一度、定義取得すればいいような処理を、毎回やってない?
無駄にループ処理が多くない?ループの外に出せる処理をループ内でやってない?
0398名前は開発中のものです。04/02/07 16:09ID:VKCT6fFP
ソースをうpしてくれん事には
どうにも解決できない希ガス
0399X04/02/08 03:00ID:VlGbZ8et
皆さんができるだけレベルの高い人が多くの見れくれる場所はどこですか。
そういった事をしたことがなくて少しびびってます。
0400名前は開発中のものです。04/02/08 03:17ID:FsAxusDH
え?
0401名前は開発中のものです。04/02/08 03:18ID:X73WE+nW
コーディングも変だが日本語も変だな。
0402名前は開発中のものです。04/02/08 03:45ID:jR1jDgu/
翻訳サイトでも使ったのか?
0403名前は開発中のものです。04/02/08 04:30ID:UH78BtVm
貴様どこの星から来た!?
■ このスレッドは過去ログ倉庫に格納されています