トップページ⇒tech
1001コメント284KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/09/30(木) 21:45:21
※回答する人も、質問する人も必ず読んでください

これらに当てはまる人のための質問スレです。
1.C/C++は多少理解している。
2.最近DirectXを始めたばかり
3.SDKを見ても、Googleで検索しても、いまいち理解できない人
4.余計な雑談は不要ですよ

【 回答してくださる方 】
・ できるだけ優しく質問に答えてあげてください。
・ 優しく教えるのが嫌でしたら、解決するためのヒントだけでも結構です。
 「ググれ」「SDK見れ」以外の回答でおながいします。
・ 神ですら理解不能な質問は無視して下さい。

【 質問する方 】
・ どんな事で躓いているのか明確にしよう。
・ 長くならないなら躓いている部分のコードを晒してみれ。
・ 解決した場合、お礼を言うのは当然だが、何をどうしたら解決したかを明確に書こう。
・ 回答して貰ったら、出来るだけお礼もしよう。

前スレ
【C++】 DirectX初心者質問スレ Part30 【C】
http://hibari.2ch.net/test/read.cgi/tech/1278214135/
0360デフォルトの名無しさん2010/10/11(月) 21:03:41
まずは試せ。
その結果に疑問があるのならそれを聞けばいい。
0361デフォルトの名無しさん2010/10/11(月) 21:06:42
ごめんなしゃい
0362デフォルトの名無しさん2010/10/11(月) 21:17:43
シーンによると思うけどね
0363デフォルトの名無しさん2010/10/11(月) 22:50:34
>>359
行列を作るのはCPU
適用するのはGPU
頂点トランスフォームは、GPUがその能力を発揮出来る
数少ない機会だからな、やらせなきゃ損
0364デフォルトの名無しさん2010/10/11(月) 22:57:16
カリカリに描画命令数の最適化をしない限り
CPU時間は余りまくりなんだからどっちにやらせてもトータルは変わらんよ
0365デフォルトの名無しさん2010/10/11(月) 22:59:44
>>363みたいな間違った認識をするから自分で試すべき何だろうね。

まず頂点シェーダをGPUでやらないビデオカードがあるのが一点。
GPUとCPUの性能バランスが悪ければ、CPUにやらせた方がパフォーマンスが高いことがあるのが二点。

つまり速いかどうかは環境依存。
0366デフォルトの名無しさん2010/10/11(月) 23:15:49
>>365
で、レアケース持ち出して
「いろんなパターンがあるからわかりません」が
正しい認識だって?
笑える
0367デフォルトの名無しさん2010/10/11(月) 23:17:31
確かにそこら中に存在するIntelのオンボードがレアケースだと言う認識は笑える。
0368デフォルトの名無しさん2010/10/11(月) 23:31:49
DrawPrimitiveを連発してるようなアプリなら普通にCPUにやらせた方が速いんじゃね?
0369デフォルトの名無しさん2010/10/12(火) 06:39:41
まあ、そっからの議論は実測値が予想と違うときのみすればいい話であって
いま、色々考えてみるのははっきりいって無駄

信じられるのは実測値のみ

この考え方は徹底しておかないといつまでも無駄なことをしたり
おかしな発言を繰り返したりと現場を混乱させるばかりでちっとも開発は進まないとかいう状況になる
0370デフォルトの名無しさん2010/10/12(火) 08:54:44
Directxで何も描画しないのに、FPSが62ぐらいしかでないんだが、
内部で60ぐらいに制御するようにコード組まれてるの?

本当にbeginsceneとendsceneぐらいしかしてないんだが。
0371デフォルトの名無しさん2010/10/12(火) 08:56:48
VSYNC
0372デフォルトの名無しさん2010/10/12(火) 09:03:19
D3DPRESENT_INTERVAL_ONE
D3DPRESENT_INTERVAL_IMMEDIATE
0373デフォルトの名無しさん2010/10/12(火) 09:18:54
ありがとうございます!
oneにすると自動的にリフレッシュレートを超えないように制限されてしまうんですね!

環境に依存しないで、FPSを制御するにはIMMEDIATEを指定して、
自分でFPS制御を行わないとぴったり60FPSにはならないんですね!

めんどくさかったらONEに設定すれば、勝手にリフレッシュレートぐらいの
FPSに制御してくれるというわけですね。

でも環境によって、FPSが変わるとゲームにならないので、前者の方法が良いですね!
知らなかったら、環境によってFPSが変化してしまうところでした。
本当にありがとうございました!
0374デフォルトの名無しさん2010/10/12(火) 10:50:04
DIRECTXってなんで座標指定するときにFLOAT型なんでしょう?

画面に描画されるときの最小単位はピクセルなんですよね?
0375デフォルトの名無しさん2010/10/12(火) 10:59:13
ドットバイドットで表示するなんてめったに無いわけで
0376デフォルトの名無しさん2010/10/12(火) 11:17:07
シェーダープログラムのコンパイル済みファイルをエクセルで全パターン自動生成することを思いついた
0377デフォルトの名無しさん2010/10/12(火) 11:24:54
>>371
>DIRECTXってなんで座標指定するときにFLOAT型なんでしょう?
そもそもそんな規則はない
0378デフォルトの名無しさん2010/10/12(火) 12:00:42
たとえば(1.5F,1.5F)のところに描画しても、切捨てられて
(1,1)のところに描画されるんですよね?

考え方自体破綻してますか?
0379デフォルトの名無しさん2010/10/12(火) 12:01:40
破綻している。
0380デフォルトの名無しさん2010/10/12(火) 12:11:59
そもそもDirectXとDirect3Dは同義ではないので、
>DIRECTXってなんで座標指定するときにFLOAT型なんでしょう?
は意味不明。
Direct3Dのことだったとしても整数型の入力はサポートされているし、
Direct3D10以降なら整数値のハードウエアサポートもある。
またラスター化されるときにどうなるかも設定次第。
0381デフォルトの名無しさん2010/10/12(火) 15:01:36
もしかしてシェーダーで、行列をセットするとき
beginPass,Endpassの間でセットしても反映されない?
0382デフォルトの名無しさん2010/10/12(火) 15:19:41
>>381

>ID3DXEffect::BeginPass/ID3DXEffect::EndPass 対応ペア内部にある Effect::Setx メソッドのいずれかを使用して、
>アプリケーションがエフェクト ステートを変化させる場合、アプリケーションは ID3DXEffect::CommitChanges を呼び出して、
>ステート変化のあるデバイスに更新を設定する必要があります。
>ステート変化が ID3DXEffect::BeginPass および ID3DXEffect::EndPass 対応ペア内で発生していない場合、
>ID3DXEffect::CommitChanges を呼び出す必要はありません。
0383デフォルトの名無しさん2010/10/12(火) 15:21:03
>>382
ありがとう!
0384デフォルトの名無しさん2010/10/12(火) 17:58:27
ID3DXSPRITEでやってたときは画像の範囲していの描画はうまくできていたんですが、
シェーダーを使ったときの範囲指定描画の方法がわかりません。

頂点バッファを毎回いじればできそうですが、いじりたくないです。
いじらずにやる方法ないですか。
0385デフォルトの名無しさん2010/10/12(火) 18:23:01
画像範囲指定とは、たとえばキャラ画像が8枚で一セットになった画像とかを
ちょっとずつ分割して描画したいってことです。
0386デフォルトの名無しさん2010/10/12(火) 18:27:19
シェーダでuvを好きなように調整しろ
0387デフォルトの名無しさん2010/10/12(火) 18:29:37
頂点バッファに全て書き込んどいて読み出し位置をずらすことで切りかえるか
サイズが一定ならシェーダーにどれだけずらすか送るだけ
0388デフォルトの名無しさん2010/10/12(火) 18:42:07
ありがとうございます。参考にさせていただきます。
0389デフォルトの名無しさん2010/10/12(火) 21:31:59
>>378
描画される位置は一緒でも、参照されるテクスチャ座標が変わる。
0390デフォルトの名無しさん2010/10/12(火) 22:17:30
シェーダ万能すぎない?
なんか有るぞこれは
0391デフォルトの名無しさん2010/10/12(火) 22:23:10
馬鹿にはそう見えるんだろうな。
0392デフォルトの名無しさん2010/10/12(火) 22:28:25
>>387
頂点バッファに全て書き込んどく方法はやめます。
サイズは等間隔の画像になります。
どれだけずらすかを送ってその後どうするんですか?

そもそも、頂点シェーダは書けるんですけど、どういった順序で計算されてるのかわからないんです。
例えば頂点が4つあったとしたら、頂点シェーダの関数は4回実行されてるんですか?
一回ごとに渡される頂点が違うってことですか。
その辺が詳しく解説されてるサイトがあれば教えていただきたいです><
0393デフォルトの名無しさん2010/10/12(火) 23:09:17
>>392
四隅が等しくずれるんだから順番なんて関係ない

頂点バッファには1つ分のuvを書き込んでおく
プログラム側からuvをどれくらいずらすかシェーダーに送る
シェーダーでずらす
OK?

.cpp
ID3DXEffect::SetVector ( "tex_offset", &D3DXVECTOR4(0.5f, 0.5f, 0.0f, 0.0f) ) ;


.fx
float2 tex_offset
void VertexShader(
in float4 inPos : POSITION,
in float4 inTexture : TEXCOORD0,

out float4 outPos : POSITION,
out float4 outTexture : TEXCOORD0)

outPos = mul(inPos, WorldViewProj);

outTexture = inTexture+tex_offset;// ←ずらす
}
0394デフォルトの名無しさん2010/10/12(火) 23:17:23
>例えば頂点が4つあったとしたら、頂点シェーダの関数は4回実行されてるんですか?

その認識で正しい
0395デフォルトの名無しさん2010/10/12(火) 23:37:10
静的な頂点バッファに書き込むとどうなるんですか?
0396デフォルトの名無しさん2010/10/12(火) 23:38:45
パフォーマンスが落ちる
0397デフォルトの名無しさん2010/10/12(火) 23:47:04
て言うかシェーダってなんなんですか
0398デフォルトの名無しさん2010/10/12(火) 23:49:16
>>397
http://ja.wikipedia.org/wiki/%E3%82%B7%E3%82%A7%E3%83%BC%E3%83%80
0399デフォルトの名無しさん2010/10/13(水) 00:06:43
>>396
どうもありがとう
0400デフォルトの名無しさん2010/10/13(水) 00:10:41
>>398
要するに描写の前にフィルタをかませてなんかいろいろ効果を出すってことか
まるで目の前にフィルムがあるかのような
0401デフォルトの名無しさん2010/10/13(水) 02:48:55
そういう使い方もあるがそれだけじゃない
0402デフォルトの名無しさん2010/10/13(水) 03:00:40
>>393
なるほど!
その手がありましたか!
すごい嬉しいです!ありがとうございました!
0403デフォルトの名無しさん2010/10/13(水) 06:40:18
でもさ、俺も同じことやってるけど
物理的にはDrawPrimitiveUPなんかと似たようなもんだよねw
って思うんだけど違うの?
0404デフォルトの名無しさん2010/10/13(水) 08:25:04
>>403
は?じゃあ具体的に説明してみろ
0405デフォルトの名無しさん2010/10/13(水) 16:32:36
シェーダーを設定しなおすと前に設定していたシェーダー定数の値はクリアされてしまうのでしょうか?
0406デフォルトの名無しさん2010/10/13(水) 16:39:46
>>405
テストコードかけばいっぱつじゃない?
まあ環境依存のことを考えれば未初期化で使うなんてことは考えないはず。
0407デフォルトの名無しさん2010/10/13(水) 16:56:08
>>406
簡単なテストでしてみました。レジスタには同じ値が入っているみたいです。
0408デフォルトの名無しさん2010/10/13(水) 17:55:21
>>404
1フレ当たりにグラボに送る情報量がさほど変わらないじゃん

例えばこんな風にまるで意味がない感じにしても頂点バッファに触らないってのはそれだけでメリットあるんかな?
ってことが言いたいわけよ
.cpp
ID3DXEffect::SetArray的な何か(名前忘れたw) ( "pos", pos4) ;//頂点4つ分
ID3DXEffect::SetVector ( "tex_offset", &D3DXVECTOR4(0.5f, 0.5f, 0.0f, 0.0f) ) ;

.fx
float4 pos[4];
float2 tex_offset;
void VertexShader(
in float4 inTexture : TEXCOORD0,
in int inIndex

out float4 outPos : POSITION,
out float4 outTexture : TEXCOORD0)

outPos = pos[inIndex];
outTexture = inTexture+tex_offset;
}
0409デフォルトの名無しさん2010/10/13(水) 18:23:27
何が言いたいのかまるで伝わってこない
0410デフォルトの名無しさん2010/10/13(水) 18:47:13
>>409
だから>>408の例って頂点バッファ自体が無意味じゃん
0411デフォルトの名無しさん2010/10/13(水) 18:57:25
頂点に座標を含むかどうかの違い?
0412デフォルトの名無しさん2010/10/13(水) 19:02:26
>>411
いや、SetVectorなどの関数から描画に必要なデータをすべて渡している状態(でも頂点バッファにはアクセスせず)
DrawPrimitiveUPで描画するのとどっちが速いの?的な話

この2つとも1フレ当たりにグラボに渡すデータ量はほとんど変わらないよね?
大して変わらないことしてるのか、大きな差があるのか?ってとこ
0413デフォルトの名無しさん2010/10/13(水) 19:17:11
何か勘違いしてるみたいだがグラボに送る情報量とか関係ない
頂点バッファは一度のDrawprimitiveで数千ポリを同時に描画するときに真価を発揮する
そもそも1矩形を1回のDrawprimitiveで描くような仕様ならUP系とコスト的には大差ない

UP系は使ってもいいけど使うときは
1000〜2000ポリくらいをバッファに溜め込んで一度のDrawprimitiveUPで描画したほうが効率は良い
それ以上になるとシステムメモリからの頂点情報の転送がボトルネックになって
頂点バッファを使った時ほどのパフォーマンスが出せなくなる
0414デフォルトの名無しさん2010/10/13(水) 19:41:01
ちょっとまってください。
DrawPrimitiveで数千ポリを一気に描画する方法があるんですか!?

メッシュとかの話じゃなくて?
0415デフォルトの名無しさん2010/10/13(水) 19:55:54
すいません。
まちがえました。。。
0416デフォルトの名無しさん2010/10/13(水) 20:19:16
いえ、間違えてません。↑は別人です
0417デフォルトの名無しさん2010/10/13(水) 20:31:16
ネタなのかマジボケなのか判断に困る
0418デフォルトの名無しさん2010/10/13(水) 21:02:08
そこらへんの詳しい情報ってデベロッパーにしか公開されないんですか?
0419デフォルトの名無しさん2010/10/13(水) 21:05:12
>>418バカは死ね
0420デフォルトの名無しさん2010/10/13(水) 21:21:24
バカだからって死ねって言うのは差別につながると思うんです
そもそもバカというのは基準が決まっていないじゃないですか
何が出来なかったらバカなんですか?それじゃあまだ何も出来ない幼児赤子はバカなんですか?
0421デフォルトの名無しさん2010/10/13(水) 21:21:43
>>419
お前みたいなクズこそ死ね
0422デフォルトの名無しさん2010/10/13(水) 21:29:22
ここは初心者スレです
0423デフォルトの名無しさん2010/10/13(水) 21:33:37
なんで死ねといわれなきゃいけないの?
0424デフォルトの名無しさん2010/10/13(水) 21:33:45
まずは>>414がポリゴンとメッシュをどう認識しているのか確認するのが先だろう。
0425デフォルトの名無しさん2010/10/13(水) 21:46:28
ポリゴンはいくつかの頂点で作られたオブジェクト

メッシュは頂点データのかたまり。

これぐらしかわかりません。ごめんなさい。
0426デフォルトの名無しさん2010/10/13(水) 21:47:36
ということで間違った認識をしていることが確定したので、
まずはポリゴンがなんなのかを調べるところから始めろ。
0427デフォルトの名無しさん2010/10/13(水) 21:54:26
本当にどーやって勉強してるんですか?皆さん。

独学っすか?学校の授業とかですか?
0428デフォルトの名無しさん2010/10/13(水) 21:56:49
まずはチュートリアルをやれ
0429デフォルトの名無しさん2010/10/13(水) 22:17:54
ググったらいくらでも出てくるだろうが。
そんなことだからバカとか言われるんじゃね
0430デフォルトの名無しさん2010/10/13(水) 22:34:38
いや、情報少ないよ
仕方ないよ
0431デフォルトの名無しさん2010/10/13(水) 22:40:21
2DでdirectX9使うの完璧になったけど
3Dが全く分からなくて手を着けられない。
シェーダの仕組みもさっぱり分からない。
次に進む為のお勧めの書籍はありませんか?
0432デフォルトの名無しさん2010/10/13(水) 22:41:37
自分で完璧とか言ってしまう人はちょっと
0433デフォルトの名無しさん2010/10/13(水) 22:48:41
完璧なのにシェーダが分からないってどういうことだろう?
04344312010/10/13(水) 23:13:58
シェーダって3Dを表示する時使う奴じゃないんですか?
0435デフォルトの名無しさん2010/10/13(水) 23:19:22
理解できてないという意味では完璧だな。
入門書買って1からやりなおせ。
0436デフォルトの名無しさん2010/10/14(木) 00:39:09
こういう場合に分かる奴、出きる奴は何でソースファイルとかアップしないの?
俺も分からないから知りたいんだけど何を信じていいのか分からん。
0437デフォルトの名無しさん2010/10/14(木) 00:43:44
何のソースが欲しいんだよ?
0438デフォルトの名無しさん2010/10/14(木) 00:44:14
ここは初心者質問スレです。

お願いですので、やさしくしてくださいよ。
0439デフォルトの名無しさん2010/10/14(木) 00:45:46
シェーダーを使ったパーティクル形エフェクトのソースをお願いします。

バージョンはvs,psとも3_0でお願いします。
0440デフォルトの名無しさん2010/10/14(木) 01:02:47
>>439
前スレにあったぞ
0441デフォルトの名無しさん2010/10/14(木) 01:18:17
3Dが分からないってことはチュートリアルとか全然やってないのか?
ドキュメントとか全然読んでないのか?
0442デフォルトの名無しさん2010/10/14(木) 04:12:39
3Dまったくわからないとかいってるヤツに何のソースを出すんだよ。
初心者以前の問題
0443デフォルトの名無しさん2010/10/14(木) 07:47:46
「UP系は本当に遅いのか?」計測してみたよ
結果から言うとだいたいヘルプに書いてあるのと同じ感じ

DrawIndexedPrimitive、DrawIndexedPrimitiveUPで
それぞれ20000ポリを1〜10000回に分けて描画
DrawIndexedPrimitiveの方は
静的頂点バッファ(Lock無し)
動的頂点バッファ(描画と同じ回数だけLock)の両方計測

静的頂点バッファをロックするのはお話にならないのでやってません
以下結果


20000ポリ(40000頂点)×1回
静的VB:890fps
動的VB:790fps
DrawUP:710fps

2000ポリ(4000頂点)×10回
静的VB:880fps
動的VB:780fps
DrawUP:700fps

1000ポリ(2000頂点)×20回
静的VB:870fps
動的VB:760fps
DrawUP:690fps


このあたりはほとんど変化なし
やはり1000〜2000ポリを1回で描画するのが効率がよさげ
0444デフォルトの名無しさん2010/10/14(木) 07:51:56
続き

200ポリ(400頂点)×100回
静的VB:830fps
動的VB:680fps
DrawUP:650fps

100ポリ(200頂点)×200回
静的VB:760fps
動的VB:590fps
DrawUP:590fps

20ポリ(40頂点)×1000回
静的VB:470fps
動的VB:300fps
DrawUP:340fps

4ポリ(8頂点)×5000回
静的VB:165fps
動的VB: 85fps
DrawUP:120fps

2ポリ(4頂点)×10000回
静的VB: 90fps
動的VB: 45fps
DrawUP: 65fps

動的頂点バッファを200回LockしたあたりでUP系と並び、それ以上で逆転

1000回ほど描画命令を発行すると最高速の半分以下までパフォーマンスが落ちる
それ以上はお察し
0445デフォルトの名無しさん2010/10/14(木) 08:00:03
UPとの差はまぁこんなものだろうか?

計測に使ったチップはGeForce 9600M GT(モバイル用チップ)なので
ちゃんとしたビデオカードでやればもうちょい差は開くかも?
暇な人は試して見てね


計測に使用したソース
ttp://www5b.biglobe.ne.jp/~mya_a/dx/SimpleSample2.zip
0446デフォルトの名無しさん2010/10/14(木) 08:01:15
なんだよ。結局DrawPrimitive数千ポリゴン描画できるって言ってたのは嘘かよ

Draw[Indexed]Primitiveじゃねえかよ。













ありがとう。
0447デフォルトの名無しさん2010/10/14(木) 08:18:43
>>446
何をどう勘違いしたのか分からんが
頂点数が増えるだけでDrawPrimitiveでも当然出来るぞ
0448デフォルトの名無しさん2010/10/14(木) 08:33:23
今日夜中に質問しまくるから、よろしく。

見捨てないでください。お願いします。
0449デフォルトの名無しさん2010/10/14(木) 08:58:27
>>445
DrawPrimitiveを連投してポリゴンをたくさん描画するより、
一回のDrawPrimitiveでたくさんのポリゴンを描画したほうが断然速いんですね。

今まで2ポリをオブジェクトの数だけDrawPrimitiveを連投してたわ。

勉強になった。ありがとう。
0450デフォルトの名無しさん2010/10/14(木) 09:27:42
ビデオメモリへの転送量は少ない方が速い。
API呼び出し回数は少ない方が速い。
おっぱいは小さく方が美しい。
基本です。
0451デフォルトの名無しさん2010/10/14(木) 09:41:28
なんかめんどくさい事を言ってる奴がいるので
>>445をプリプロセッサで
DrawPrimitiveとDrawIndexPrimitiveを切り替えられるようにしたものと差し替えた

後、補足して置くとこの計測値は低CPU負荷の状態で
D3DPRESENT_INTERVAL_IMMEDIATEでぶん回してるだけなので
一見、描画命令1回と10000回の間に10倍のパフォーマンスの違いが有るように見えるけど
例えば当たり判定やAI処理などでCPUに高負荷をかけると
1回の方はその分がガッツリFPSに影響が出るのに対し
10000回の方はGPUのブロック時間の間にCPUが仕事できるのであまりFPSに影響は出ません
つまり、パフォーマンスは差は縮まります

上の方で描画命令が多い場合はCPUで計算させてもかわらねーよ、と言われてるのはこのせいです
それでもなるべくまとめて描画した方が圧倒的に速いですが

その辺の詳しい理屈はこのあたりを読むとわかるかも?
ttp://www.atmarkit.co.jp/fdotnet/directxworld/directxworld01/directxworld01_03.html
0452デフォルトの名無しさん2010/10/14(木) 09:47:11
高速に大量に描きたいならインスタンシングとかも勉強しとけよ
0453デフォルトの名無しさん2010/10/14(木) 09:49:09
>>451
心から感謝いたします。
さっき生意気なこといってすみませんでした。
本気で勉強いたします。
0454デフォルトの名無しさん2010/10/14(木) 17:04:11
レンダーステートの切り替えとか定数パラメータのセットって重いんですか?
0455デフォルトの名無しさん2010/10/14(木) 17:05:51
ダミー設定を用意して実際に測定してみるといいよ。
0456デフォルトの名無しさん2010/10/14(木) 17:27:44
最近のチップは以前と比べると格段に負荷は軽くなったけど

>ステート変更をできるだけ減らし、残ったステート変更をグループ化する。

とMSDNにはある
0457デフォルトの名無しさん2010/10/14(木) 17:53:55
誰がUPが遅いなんて話してたの?
変なことやったシェーダとUPとの比較の話だったんでしょ?
0458デフォルトの名無しさん2010/10/14(木) 17:55:15
>>457
お前はちゃんと勉強した方が良い
0459デフォルトの名無しさん2010/10/14(木) 18:10:36
>>458
お前は日本語の文章を読む練習からしろ
■ このスレッドは過去ログ倉庫に格納されています