1 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 22:06:29 ] ※回答する人も、質問する人も必ず読んでください これらに当てはまる人のための質問スレです。 1.C/C++は多少理解している。 2.最近DirectXを始めたばかり 3.SDKを見ても、Googleで検索しても、いまいち理解できない人 4.余計な雑談は不要ですよ 【 回答してくださる方 】 ・ できるだけ優しく質問に答えてあげてください。 ・ 優しく教えるのが嫌でしたら、解決するためのヒントだけでも結構です。 「ググれ」「SDK見れ」以外の回答でおながいします。 ・ 神ですら理解不能な質問は無視して下さい。 【 質問する方 】 ・ どんな事で躓いているのか明確にしよう。 ・ 長くならないなら躓いている部分のコードを晒してみれ。 ・ 解決した場合、お礼を言うのは当然だが、何をどうしたら解決したかを明確に書こう。 ・ 回答して貰ったら、出来るだけお礼もしよう。 【C++】 DirectX初心者質問スレ Part23 【C】 pc12.2ch.net/test/read.cgi/tech/1242977486/
41 名前:デフォルトの名無しさん [2009/06/25(木) 13:11:04 ] ウィンドウを一色で塗りつぶすことって出来ますか?
42 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 13:18:28 ] >>40 ミップマップの生成はD3DX_DEFAULTで、拡大も縮小もLINARです。 テクスチャ外しても再現しました。 視野角ではなくカメラからの距離(遠くなり、小さく描画されている時の方が遅い)でも、再現しました。 それと、パーティクルの生成数を10倍にしたところ、「大きく映っているほうが遅い」という常識的な結果になりました。 つまりまとめますと 「描画量が少ないと、小さく映っているほうが遅い時がある」 って感じですね。 これだとロジックのどこかにバグがあるかと思われるかもしれませんが、本当にカメラ位置しか変えずにコンパイルしています。 描画量が少ないと。といっても、毎フレーム100個ほどのポイントスプライトを描画しているんですけどね。 500個にしたら逆転しました。(小さく映っているほうが速くなりました)
43 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 14:35:03 ] インスタンス処理について質問があります サンプルのInstancingなのですが、技法3、定数のインスタンス化の処理はあまり意味ないように思えるのですが これって効果あるのでしょうか? for( int nRemainingBoxes = 0; nRemainingBoxes < g_NumBoxes; nRemainingBoxes++ ) { // set the box Instancing array V( g_pEffect->SetVector( g_HandleBoxInstance_Position, &g_vBoxInstance_Position[nRemainingBoxes] ) ); V( g_pEffect->SetVector( g_HandleBoxInstance_Color, (D3DXVECTOR4*)&g_vBoxInstance_Color[nRemainingBoxes] ) ); // The effect interface queues up the changes and performs them // with the CommitChanges call. You do not need to call CommitChanges if // you are not setting any parameters between the BeginPass and EndPass. V( g_pEffect->CommitChanges() ); V( pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 0, 4 * 6, 0, 6 * 2 ) ); }
44 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 15:19:18 ] >>43 サンプルをみたが、1(HWInstancing)以外は あまり意味はないな。 1の比較対象として、用意しているに過ぎない。 特に3は、普通に描画してるだけだな。
45 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 15:39:45 ] ありがとうございます。 2だとDrawPriitiveを減らせる効果はあるぐらいですかね 同じモデルを複数回描画するのを効率化したいのですが、 ハードウェアインスタンスを使えたら使う、使えなければ普通に描画するしかないということでしょうか?
46 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 15:54:08 ] 2だか忘れたけど、同じモデルデータを大量に複製して 頂点にID持たせてつなげてビデオメモリに転送しとく奴だっけ? 板ポリゴン大量に扱いたいけどハードウェアインスタンス使えないって時に結構使えて気もするが
47 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 16:01:07 ] >>46 2はそうだね。 無駄重複が大量にあるのは、 キモイな。 1は、メッシュx1、DrawPrimitive x1 2は、メッシュxN、DrawPrimitive x1 3は、メッシュx1、DrawPrimitive xN 4は、メッシュx1、DrawPrimitive xN かな。
48 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 16:10:09 ] >>45 そうだね。HWのそれ以外 DPを減らす方法は無いと思う。(D3D9) ただ、サンプルの2はボックスの頂点データを そのまま大量に複製しているように見えるが、 座標データを定数や頂点テクスチャに移せるなら、 頂点バッファは純粋にインデックスのみって構成も 可能だよね。 これがいけるんならサンプル2も、対象に入りそうだな。
49 名前:デフォルトの名無しさん [2009/06/25(木) 17:06:01 ] 初歩的な質問で申し訳ありません。 C言語が必要になり、根っからの文系人間が「Cの絵本」という本でもってプログラミングに挑戦しています。 if文のところで、 #include <stdio.h> main() { int s = 65; printf("あなたの点数は%d点です。\n", s); if(s < 70) { printf("平均点まであと%d点。\n", 70-s); printf("がんばりましょう!\n"); } else { printf("よくできました!\n"); } } という文を作りました。 ここから月数に応じてコメントを表示するプログラム(1月ならばwinter、3月ならspringといった具合に)を作りたいのですが、どのように変化を加えればよいのでしょうか? 月は1月〜12月までなので、13月以上と1月未満の数値を打ち込んだ場合はerrorと表示させたいです。 よろしくお願いします。
50 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 17:09:52 ] 凄くすれ違いです・・
51 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 18:05:34 ] SetRenderTargetで描くのと UpdateSurfaceでコピーするのは どっちが速いですか?
52 名前:デフォルトの名無しさん [2009/06/25(木) 19:11:09 ] 頂点バッファ作成で躓いてますorz struct VERTEX { float x,y,z; DWORD color; enum{ FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE }; }; IDirect3DVertexBuffer9* pvb = NULL; Graphics->GetDevice()->CreateVertexBuffer( sizeof(VERTEX)*3, D3DUSAGE_DYNAMIC, VERTEX::FVF, D3DPOOL_MANAGED, &pvb, NULL ); ってやってるんですがCreateVertexBufferを呼んでもpvbがNULLのままで・・・ エラーではD3DERR_INVALIDCALLが返ってきてます. MSDNみると メソッドの呼び出しが無効である。 たとえば、メソッドのパラメータに無効な値が設定されている場合などである。 とあるのですがおかしいところも見当たらない気がします. どこか他で不具合出てるのでしょうか・・・. 思い当たる節がないので困ってます
53 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 19:21:20 ] インデックスバッファや頂点バッファは D3DPOOL_MANAGEDをD3DUSAGE_DYNAMICでは作れなったかったきが気がする D3DPOOL_DEFAULTが推奨
54 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 19:27:29 ] 動的なバッファにする必要がないなら D3DPOOL_MANAGEDのままで使用方法に0を指定するのも有
55 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 21:22:56 ] 髪の毛みたいなソフトボディ?のアニメーションもキーフレームアニメーションでできるのですか?
56 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 21:52:41 ] スキニングを探してるのか?
57 名前:52 mailto:sage [2009/06/25(木) 21:54:53 ] ご協力ありがとうございました. CreateVertexBuffer解決しました. Usageを0にしたのと D3DPRESENT_PARAMETERS構造体の AutoDepthStencilFormatをD3DFMT_D24FS8にしていたのを D3DFMT_D24S8に変更でいけました.
58 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 22:29:41 ] DirectInputについて質問です。 秒間60回入力を拾っても、描画の垂直同期待ちとかで 一瞬予定通りに拾えない時間帯があると思います。 (ペイントソフトを作ってマウスで線を描くと、線が切れる部分が出る) 自分はマルチスレッドで入力を回収し、バッファにためておくことで解決しようと 考案中なのですが、みなさんが他に良い方法を使用していたら、教えてください
59 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 22:32:43 ] DirectInputでマウスさんさとゃでめよん
60 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 00:06:10 ] >>58 変なことやらないほうがよくね? 仮に1フレームで押してる・押してないと2つの状態がとれたときにそれはどっちが優先なの? たまに押した状態がくっついてるような変なアプリみるけど それって小細工のたまものだと思うw
61 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 00:11:20 ] IDirectInputDevice8::GetDeviceDataで 入力履歴の配列が得られる。 これで何時押されて、何時離されたか 判断出来る。
62 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 01:22:24 ] それってパッドの入力履歴とれる?
63 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 08:58:01 ] >>58 入力はスレッドでやり、スレッド優先度を高くしておく。 ただしそのままだとそいつが処理を食ってしまうので、きちんとWaitEventやらで沈黙することが大事。
64 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 19:04:47 ] 普通のメッシュファイルは表示できるんだけど、 テクスチャとかマテリアルでアルファ値が設定されていないものを 任意のアルファ値で半透明に表示する方法はないですか?
65 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 19:07:38 ] そういうシェーダを書く。 マジで。 固定シェーダ(笑)でもできるけど、面倒この上ないよ
66 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 19:10:32 ] なんか質問するごとにシェーダでやれと言われまくるんだよなー そろそろ勉強したほうがいいのかな どこから勉強すりゃいいのかよくわからんのだが
67 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 19:10:40 ] D3DTA_TFACTORを使えば簡単だけど シェーダーでやった方がいいな
68 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 19:12:48 ] SetTextureStageState( D3DTSS_CONSTANT, 任意色 ); SetTextureStageState( D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 ); SetTextureStageState( D3DTSS_ALPHAARG1, D3DTA_CONSTANT ); 別に面倒ってほどでもないなあ
69 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 19:14:39 ] >>66 エフェクトからやれ。 エフェクトファイルは必須だから。
70 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 19:19:25 ] スプライトをSetRenderTargetの咲に描くにはどうしますか?
71 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 20:24:01 ] >>66 はぁ? ていうか今日はじめて今日できる ウンコする時間も考慮すると後3〜4時間? 余裕過ぎる そんな程度
72 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 21:27:55 ] >>66 気持はわかるが、マジでシェーダオンリーにしたほうがいい。 本気で。 俺も固定シェーダにこだわってゲームつくってたけど、プログラマブルシェーダに移行したら天国だった。
73 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 21:39:47 ] HLSLがC言語だとすると、固定シェーダーは得体の知れないアセンブラ
74 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 22:17:20 ] シェーダーの勉強のとっかかりになるところでいいところない? いきなり高度なことやってるページばかりしかなくてこまる
75 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 22:19:11 ] ×固定シェーダ ○固定機能 間違った用語を平気で使い続ける馬鹿って何なの?
76 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 23:03:47 ] たぶん、プログラマブルなシェーダに対しての、プログラマブルじゃない固定という意図では?
77 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 23:24:27 ] まぁ将来シェーダーいじるようなゲームプログラマーになりたいとかじゃなけりゃ 好きなもんを好きなように使っておけとしか言えないが。
78 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 23:31:04 ] アホが68件程度しか発見できないのがせめてもの救い www.google.co.jp/search?q=%22%8C%C5%92%E8%83V%83F%81[%83_%22
79 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 23:36:47 ] まあでも固定機能パイプラインを示す 適当な言葉がないのも事実。 固定シェーダでいいんじゃないの。
80 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 23:39:21 ] 固定機能パイプラインで良いんじゃ
81 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 00:39:43 ] 定食
82 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 01:02:27 ] 内部を考えると固定のシェーダーとも言えなくもないがw
83 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 02:46:10 ] 通じりゃいいだろ こだわるところじゃない
84 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 02:49:13 ] DirectX11では 「演算シェーダ」「ハルシェーダ」「ドメインシェーダ」の 三つのプログラマブルシェーダと テッセレーションを行うための「固定機能シェーダ」が新設されるそうな もう紛らわしいから固定機能パイプラインは無かった子にして良いよ
85 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 07:12:24 ] もう固定機能パイプラインをちゃんと言うしかないな
86 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 08:20:06 ] 固定機能パイプラインが無くなる事で 良書が増えるといいねぇ
87 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 12:36:05 ] directxライブラリと標準ライブラリを同時に使うことってできないんでしょうか?
88 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 12:40:39 ] 勝手に使えよ。
89 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 12:44:25 ] 多分同じ変数や関数が複数回使われてるみたいなエラー出たんだろ
90 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 13:00:26 ] DirectXつかっててそんなの出るか・・・?
91 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 19:52:46 ] maxとminがdefineされてるから、 std::maxとstd::minと衝突するってやつか? NO_MINMAXでぐぐればいけた気がする。
92 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 21:09:13 ] 同じMS製品でそんなの出るとか不良品じゃねーか
93 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 22:03:18 ] もともとmaxとかminとか定義してたライブラリありまくるぜ vectorとか標準ライブラリ作った人なんでこんな名前にしたんだと思った std::〜っていちいち書くぐらいしかないのかな?
94 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 22:32:35 ] いちいち書いたほうがいい STLだけ差し替えたりするし。
95 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 23:46:05 ] SYSPROCはどこに書けばいいの?
96 名前:デフォルトの名無しさん mailto:sage [2009/06/29(月) 12:42:29 ] >>93 DirectXのmin maxはマクロだから、std::つけてもエラーが出る。
97 名前:デフォルトの名無しさん mailto:sage [2009/06/29(月) 16:29:55 ] rad0 が #define されてるのが地味にトラップ。
98 名前:デフォルトの名無しさん mailto:sage [2009/06/29(月) 23:07:23 ] DirectInput8のGetDeviceStateメソッドでジョイパッドの入力を生で受け取り コード側でそれを、否定・論理積を使ってトリガ情報に加工して使おうとしています。 当該処理はDLLに放り込みました。 それを、Win32コンソールアプリケーションをドライバにしてforループでガンガン回しながら テスト実行してみたところ、ベタ入力もトリガ入力も正しく取れるのですが、 本番環境のWin32アプリケーションに組み込んでみたところ、 トリガ入力がベタ同然の振る舞いをするようになってしまいました。 理屈の上では、メインループでどれだけの時間がかかろうと、かかるまいと、 GetDeviceStateが押された瞬間にキーが押しっぱなしでさえあれば トリガとしてのふるまいをしてくれるはず・・・と期待しているのですが、どうにもなりません。 これって、いわゆる「直接入力における取りこぼし」ってやつなんでしょうか・・・
99 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 01:46:34 ] 外人「OH〜ユーアーサムラーイCOOL!」 農民「ノー…アイ アム ア ファーマー…」 外人「オウマイゴー アイムソーリー ユーアープアー」
100 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 03:09:45 ] >>98 実を言うとそこまで深く突っ込んで調べたことが無い。 そのテスト版のプログラムもし公開できるものなら見てみたいよ
101 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 19:24:25 ] DLLにした時点でどこのキーとってるのか俺にはわからないけど メインの処理のキー入力を勝手にとってくるもんなの?そーゆーのって?
102 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 19:30:02 ] 法線とライトの内積を求めてその値で境界の範囲を決めるトゥーンシェードで Sio29さんのCelsView見たく境界の色をあいまいにするのってどうやってやるんですか?
103 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 19:34:53 ] >>102 本人に聞いてこいよ
104 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 19:38:42 ] >>102 参照するトゥーンマップの段階の変わり目をグラデーションにするだけ
105 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 19:41:18 ] >>103 つっこみありがとう Sio29さん独特の技術なら聞いてこようと思います やりたい事がわかりやすいように例を挙げただけだったんですが
106 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 19:43:30 ] >>104 それじゃなんねーと思うぜ 法線は段階的に角度がついてるわけじゃねーし
107 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 19:43:40 ] >>104 ありがとうございます 色の決定にトゥーンマップを使用していないのでつまづいています
108 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 19:53:43 ] >>106 なんで? 頂点シェーダでマップの参照位置を計算してピクセルシェーダにわたして 実際の色参照をピクセルシェーダでやれば問題ないんだけど
109 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 19:57:30 ] >>107 トゥーンマップを使わないでどうやってるの? いちいち内積の値でifで条件分けして陰つけてるの?
110 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 20:02:58 ] >>108 関係なくね? 例えば立方体の辺にグラデ入れたいとしてその方法で何かつくの?
111 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 20:07:34 ] VS上の法線などのベクトルは、 PSには線形補間されて渡される。
112 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 20:12:47 ] >>110 はライティングの仕組みを全く理解してないと思われ そんなこと言ったら普通のグローシェーディングもできないことになる
113 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 20:12:51 ] >>111 だから頭の中でそれでグラデがつくか考えてみろっての
114 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 20:14:52 ] >>112 だからその仕組みとこの仕組みがリンクしてねぇって俺は主張してるわけだよ
115 名前:102 mailto:sage [2009/06/30(火) 20:23:13 ] >>109 そうです、ifで条件つけてやってます マテリアルごとにトーンマップを用意するのが面倒なので
116 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 20:30:46 ] >>114 VSの計算結果で頂点Aが黒で頂点Bか白としましょう PSで頂点AとBの中間地点のピクセルを描画するときは 線形補間された灰色という値が入ってきますよね? だから通常のライティングが成立してるのはわかりますよね? VSで頂点Aのマップの参照位置を(u,v)=(0,0) Bの参照位置を(u,v)=(1,0)としましょう PSでAとBのちょうどまんなかのピクセル描画時には 線形補完された(u,v)=(0.5,0)という値が入ってきます この値をつかってマップの色をサンプリングすればOKなのですよ
117 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 22:35:53 ] >>116 そこまで来てねぇよw 法線の値でグラデかけたマップから値とりにいくところで うまくいかねぇと思うぜ
118 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 23:37:11 ] customUI使うには何をincludeすればいいでしょうか。 ソース分割とかやったことなくてさっぱりわかりません。 bccDeveloper使ってやっています。
119 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 23:52:15 ] >>117 www.arakin.dyndns.org/glsl_cartoon.php ここが比較的わかりやすいから、見てみれば。 そこのテクスチャの色は2色、輪郭を含めて3色だが、 その3色の境界にグラデをかければ、最終的な 出力画像にもグラデが掛かるだろ。
120 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 23:55:02 ] >>118 CustomUIの中のCoreとOptionalプロジェクトを インポートして使う。 VCならそのままだが、bccDeveloperはシラね。
121 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 00:00:58 ] >>119 かかんねぇよ よく考えろよ
122 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 00:12:20 ] げちょげちょすっげキタネェのができるぞ トゥーンマップ(?)でうまくいくのって2〜3色ぐらいでグラデなしの ときだけのような希ガス 綺麗にならないのはグラデがかかってほしいところでちょうど 法線(内積?)が段階的にかわってくれるとは限らないってところがポイントだと思う つまり、内積→マップの値の変換でうまくいかない
123 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 00:50:19 ] 境界って輪郭線じゃなくてシェーディングの部分でしょ? だったら実際のところトーンマップの中間をグラデにしてるだけだと思うが>CelView きたねぇところはきたねぇし
124 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 01:54:32 ] >>123 境界の認識はあってるよ 実はCelView見てないけど だったら高解像度になるにつれ余計なことしないほうがいいな ようはシェーディングの境界をぼかしたいわけじゃなくて シェーディングの境界がジャギってんのが気に入らないんだろ?
125 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 11:42:26 ] プログラマブルシェーダについて質問です。 bool型定数を使った静的分岐をやろうとしました。 ttp://msdn.microsoft.com/ja-jp/library/bb944006(VS.85).aspx >静的分岐では、ブール型のシェーダー定数に基づいてシェーダー コード ブロックのオン/オフを切り替えることができます。 >これは、現在レンダリングされているオブジェクトの種類に基づいて >コード パスを有効または無効にできる便利な方法です。 >描画呼び出しの間では、どの機能を現在のシェーダーでサポートするかを決定し、 >その動作に必要なブール フラグを設定できます。 >ブール定数で無効にされたステートメントは、シェーダー実行中にスキップされます。 下記のようにやってみたのですが、 fcx.exeでコンパイルしたものを覗いたところ、cmp命令が使われてしまっていました。 それでは分岐による負荷がかかってしまいますよね。 分岐負荷がかからないコードブロック単位での静的分岐とは、どうやるのでしょうか? bool UseTexture; float4 PS(VS_OUTPUT In) : COLOR { if (UseTexture) { In.Color *= tex2D(DecaleSamp, In.TexDecale); } return In.Color; }
126 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 14:57:45 ] #ifdef #else #endif
127 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 18:58:43 ] >>125 静的に決定させる為には、 静的に決定出来なきゃ駄目だよね。 >>125 のコードだと、「bool UseTexture」は いつ何時変わる可能性があるので、コンパイラは 決め撃ちすることは出来ない。 方法としては、>>126 のプリプロセッサ以外に、 @「static const UseTexture = true;」にする。 Aシェーダの引数で受け取り、passで分岐する。 float4 PS(VS_OUTPUT In, uniform bool UseTexture ) : COLOR { if (UseTexture) { In.Color *= tex2D(DecaleSamp, In.TexDecale); } return In.Color; } technique T { pass P0{ pixelShader = compile PIXELSHADER_TARGET PS( false );} pass P1{ pixelShader = compile PIXELSHADER_TARGET PS( true );} } いづれも、最適化とプリシェーダはONにしておくこと。
128 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 20:01:27 ] >>126-127 アドバイスありがとうございます。 静的分岐とは言え、さすがにON/OFFのチェンジはしたいので >>126 や、>>127 の@というわけにはいきません。 ひとまず、>>127 のAではうまくいきました。 そこで再質問なのですが、グローバル定数は、uniformとして扱われるMSの説明に書いてある上、 1回の描画命令の間では不変ですよね? グローバル定数ではダメなのでしょうか?(ダメだったから>>125 はダメだったわけですが…) 正直引数のuniformでやる方法ですと、 pass P0{ pixelShader = compile PIXELSHADER_TARGET PS( false );} pass P1{ pixelShader = compile PIXELSHADER_TARGET PS( true );} このようにtrueの場合とfalseの場合をいちいち定義しなければならず、 組み合わせが多い場合(ライトON/OFF、影ON/OFFなどなど)に組み合わせ爆発が厄介そうです。 uniform int の場合はintの取りうる範囲が多すぎるため、 PS(0) PS(1) のように定義しなければならないのはわかるのですが、 MSの説明を見る限り「bool型のシェーダ定数は特別扱いだよ」みたいに読めるのですが、 bool型を使うことによる利点のようなものは何かないのでしょうか? MSの説明を見て
129 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 20:38:08 ] >>128 >1回の描画命令の間では不変ですよね? シェーダの生存期間は、コンパイルによって exe(的なもの)として生成されてから、破棄されるまでの間です。 描画命令間ではありません。 定数が静的であるとは、生成から破棄の間静的であることです。 描画命令の間不変としたいなら、描画毎のコンパイルが必要。 >組み合わせが多い場合(ライトON/OFF、影ON/OFFなどなど)に組み合わせ爆発が厄介そうです。 そうです。これはD3D9世代の欠点でもあります。 これを補う為に、フラグメントシェーダやデファードレンダリングなどがあったりします。 DX11では動的リンクが加わるそうなんで、ちょっとはマシになるかも。
130 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 22:30:38 ] DX11でシェーダの連結ができるって大騒ぎしてるけどさ なんかDX9のフラグメントリンカーの存在忘れたような大騒ぎがよな 無かったことにされてるのか?? 情報もえらく少ないし。
131 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 22:35:50 ] シェーダ爆発なんて騒ぐのはキレイなエンジン作りたいやつだけで 普通は運用でどうにでもなるだろ。
132 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 23:20:36 ] >>130 wlog.flatlib.jp/item/1219 wlog.flatlib.jp/item/1230 このブログがわかりやすいが、DynamicShaderLinkageは 動的リンクというよりは、サブルーチンコールに近いものらしい。 イメージとしては、動的にShaderの部品を組み上げて 1つのShaderを作るのがフラグメントリンカならば、 とりあえず全てがつまったmain()プログラム的なShaderを1つ作って、 動的に個々の分岐を決定出来るのがDynamicShaderLinkageということになる。 これが良くなったかどうかわからんが、より普通になった感じだな。
133 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 23:24:51 ] >>130 フラグメントリンカを使ってる人は 今現在、世界で4人、 商用・非商用プログラムで使われてる例はゼロらしいよ。
134 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 01:10:26 ] 現状のPC構成だと殆どのケースでネックになるのがCPUだから GPUで多少分岐したところで全体の速度に大差はないからな。 多少のシェーダー負荷は承知の上でまとめちまうほうが管理が楽。
135 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 01:39:03 ] DirectSound で再生しながら、 横軸に周波数、縦軸に音量を表すようなグラフを リアルタイムで描きたいです。 とりあえずWAVを再生するところはできてるんですけど、 そのようなグラフを描くにはどうすればいいですか?
136 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 01:48:55 ] すれ違いじゃねっかな。 再生できてるならそのデータをそのまま解析すればいい。 どういう風なデータ構造になってるか分からないって質問は論外。
137 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 01:49:57 ] spectrum analyzer source code でググったら。
138 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 14:05:54 ] フルスクリーン描画をしているときに画面中にダイアログを表示するのってどうやるの? フルスクリーン描画しているウィンドウがフォーカスを失うと device->Present()が失敗してしまう問題と、 フルスクリーン描画をかけるとほかのウィンドウが表示されてても 描画内容が上書きされてしまう問題とがあるわけだけど。
139 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 18:24:20 ] 深度バッファシャドウについて質問です。 完全な影になる部分は、RGBA(0.5f, 0.5f ,0.5f, 1.0f)であるとします。 普通の理屈通り使うと、ライトから見て裏面になる部分は、深度バッファシャドウ的に影であると判定されますよね。 でも、ライトから見て裏面になる部分は、すでに頂点シェーダ上でCOLOR0の値が半減しているはずです。 ピクセルシェーダでの判定にひっかかったからといって、さらに半減してしまうと、影が濃すぎることになりますよね。 これは、頂点シェーダでは影による表面色の補正をかけず「影の濃さ」を計算してピクセルシェーダに渡し、 深度バッファシャドウとライティングのシャドウを先に計算し、最後に表面色に反映。としなければならないのでしょうか?
140 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 19:52:52 ] 影と陰ね これは同じ物理現象だよね たしか
141 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 19:57:29 ] シャドウマップのサンプルがあるんだからそれ見ればいいだろ 三項演算子使ってるから