【C++】 DirectX初心者質問スレ Part41 【C】
■ このスレッドは過去ログ倉庫に格納されています
回答する人も、質問する人も必ず読んでください
これらに当てはまる人のための質問スレです。
1.C/C++は多少理解している。
2.最近DirectXを始めたばかり
3.SDKを見ても、Googleで検索しても、いまいち理解できない人
4.余計な雑談は不要ですよ
【 回答してくださる方 】
・ できるだけ優しく質問に答えてあげてください。
・ 優しく教えるのが嫌でしたら、解決するためのヒントだけでも結構です。
「ググれ」「SDK見れ」以外の回答でおながいします。
・ 神ですら理解不能な質問は無視して下さい。
【 質問する方 】
・ どんな事で躓いているのか明確にしよう。
・ 長くならないなら躓いている部分のコードを晒してみれ。
・ 解決した場合、お礼を言うのは当然だが、何をどうしたら解決したかを明確に書こう。
・ 回答して貰ったら、出来るだけお礼もしよう。
前
【C++】 DirectX初心者質問スレ Part40 【C】(c)2ch.net
https://mevius.5ch.net/test/read.cgi/tech/1474782237/
>>2リンク NOTE: As of 29 Mar 2019, SharpDX is no longer being under development or maintenance
終わってしまった DX11勉強中で定数バッファの扱いがよくわからないので教えて欲しいです
これは別々に複数個用意しておいて、シェーダと同様にその都度セットし直すものなのでしょうか?
ネットに落ちてるサンプルを色々と見ているのですが、カメラ行列だけを入れている物もあれば、併せて材質色やライティング用のパラメータを入れている物もあって混乱しています 必要なものをその都度送ればいいよ
セットしたシェーダが変わらない上に定数バッファの内容も変わらないなら送り直す必要は無いはず
変えたいときに送る >>312
回答ありがとうございます
土日の内に最低限の描画パイプラインを用意しておきたかったので助かります vs2019ほんとに軽くなってて驚いたんだけど
ここ数年中の人らは何やってんだってレベル この板にはMSを持ち上げる記事が多いな。
まるでMS社員が書いているかのようだ。 >>317
初心者スレなどにふらりと現れてスレとは無関係の稚拙な演説を垂れ流し
「MSには潰れて欲しい」などと呪詛を吐いて去っていく怨霊みたいな輩はよく見かける 【高感度が高い会社】
https://toyokeizai.net/articles/-/273471
1位セブンイレブン、2位トヨタ、3位無印良品、4位イオン、5位ニトリ、
27位ソニー、35位任天堂、
71位アップル ***
167位タカラトミー、169位セガ、
181位マイクロソフト ***
194位バンダイナムコゲームス、
197位コナミ、234位スクウェア・エニックス、251位カプコン、293位レベルファイブ 39位、東急ハンズ
40位、アマゾンジャパン ***
41位、楽天
42位、セイコー
43位、雪印メグミルク
44位、Google ***
45位、伊藤園 トヨタ>SONY>任天堂>amazon>楽天>セイコー>Google>アップル>
タカラトミー>セガ>マイクロソフト>バンダイナムコゲームス>
コナミ>スクウェア・エニックス>カプコン 感度が高いことを高感度という
高感度が高いとか危険が危ないとか
変な言葉遣いやめれ 実は漢字が間違っていただけで、「高感度」ではなくて、正しくは、
「好感度が高い会社」 すみませんつかぬことをお聞きしますが、
テクスチャをピクセル毎に分解して自由に動かしたいんです。
要はピクセル数分の?ゾリューションをもった板ポリに一ピクセルづつ
テキスチャを割り当てればいいんじゃないかと思ってるんですが、
shader内で書く際にどういった書き方をすればいいかどなたかご指南ただけませんか。
あと考え方が間違ってたら指摘して頂けると助かります。 何がしたいかわからんけどポイントスプライト使ってみるとか >>328
テクスチャは一枚です。
>>329
要はテクスチャを一ピクセル毎に分解して、それをパーティクル状に自由に動かしたいのです。
その前段階として、板ポリにテクスチャのピクセルを一つ一つ割り当てたいのです。 別に1ピクセルだろうが板ポリにUV座標していする一般的なスプライトと同じ実装で良いと思うが ポインスプライト実装でできました。
有難うございました! 行列計算ってのがよくわからないんですが、簡単にどういうことをするのか教えてください
((0,0,0)(0,0,0)(0,0,0))
こういう行列があったとしたら
vector3(10,10,10) += gyouretsu[1]
などとすることで、2番目の列にvector3が代入されるかと思います
これってなんの意味があるんですか?
3dにおいてどういうシチュエーションで必要7日イメージがワキません
godot使用です >>333
> 代入されるかと思います
されない
> なんの意味があるんですか?
自分からなんの意味もないコードを見せておいて何言ってんだ?
ここはDirectXスレだ
他のスレをあたれ
どのスレが適切かは自分で考えろ ブレンドステートオブジェクトのRenderTagetって
RenderTarget[0]以外使うにはどうすればいいですか。 すみません
よく考えたらいらなさそうなのでやっぱりいいです。
時間を取らせてしまったのなら申し訳ありません。 PIX for Windowsを使ってみたのですが、以下のようなエラーが出てしまいました。
・・・・
Frame 000001 ........POST: <S_OK><this=0x04f731e0> IDXGISwapChain::GetBuffer(0, IID_ID3D11Texture2D, 0x005EF60C)
Frame 000001 ........PRE: <this=0x04f2de08>ID3D10Texture2D::Map(6223320, Unknown D3D10_MAP, 6223436, 0xCCCCCCCC)
D3D11 CORRUPTION: ID3D10Texture2D::Map: Fourth parameter is corrupt or NULL. [ MISCELLANEOUS CORRUPTION #16: CORRUPTED_PARAMETER4]
An unhandled exception occurred.
Closing Run File
どうすれば改善できますか。
GetBufferのあたりはこんな感じです。
HRESULT hr;
// スワップ・チェインから最初のバック・バッファを取得する
ID3D11Texture2D* pBackBuffer; //バッファのアクセスに使うインターフェイス
hr = pSwapChain->GetBuffer(
0, // バック・バッファの番号
__uuidof(ID3D11Texture2D), // バッファにアクセスするインターフェイス
(LPVOID*)&pBackBuffer); // バッファを受け取る変数 ちなみに
ID3D10Texture2D::Mapを呼び出した覚えはないです
GetBufferなら使いました。 >>340
回答ありがとうございます。
ID3D10Texture2D::Mapの4つ目の引数がおかしいとエラーで出てきているのはわかるのですが、
引数が4つのMap関数が見当たらないのですが
引数が5つの奴ならあります。
HRESULT hr;
D3D11_MAPPED_SUBRESOURCE MappedResource;
hr = pImmediateContext->Map(
pCBuffer[ID], // マップするリソース
0, // サブリソースのインデックス番号
D3D11_MAP_WRITE_DISCARD, // 書き込みアクセス
0, //
&MappedResource); // データの書き込み先ポインタ
↑の内部でID3D10Texture2D::Mapが呼び出されていたりするのでしょうか。 しょーもないゲームを自分で作って周りに見せて喜んでるだけなので
バージョン8を使い続けてるけどヤバイ?急に動かなくなることある? >>343 今んとこはWin10でも元気に動いてる。マイクロソフトも非推奨? DirectX8だとSDKも8のSDKで作ってるの?あとVisual Studioのバージョンは?
まあVC6+DirectX SDKの7で作ったやつがソース変更ナシかほぼナシで
VS2008+DX11でビルドできた覚えがあるから大して意味のある質問ではないかもしれないけど パーティクルトレイルってやっぱ見てるだけでかっけーってなるんですけど、
実装するにはどういう考え方たしたらいいですか? >>347
有難う
ただパーティクルシステムを基にUnityの機能じゃなくてジオメトリシェーダかなんかで
プログラマブルにやりたいんです。
環境はvvvv、windows10 >実装するにはどういう考え方
が描いてあるから貼った >>344
もう11以降使ってない奴はマイクロソフトとかじゃなくAMDとか普通にバグあっても
直さない宣言してるからな 12でそれなりの描画が実装できたけど、やはり複雑。
ルートシグネチャ、シェーダ、ディスクリプタで器を決めて、頂点、索引、定数、テクスチャをGPUにロード。
ディスクリプタにテクスチャ、定数を入力にbind、描画ターゲットと深度ステンシルを出力にbind。
頂点と索引、シェーダを専用スロットに繋いで、コマンドリストに描画命令をいれる。
リストはあロケータから取り出して、 コマンドキューに入れる。
コマンドキューにシグナルいれて、フェンスで完了を確認する。
コマンドキューはスレッドに一つづつのインスタンスを持たせて、コマンドリストはコマンドキューに複数突っ込んでもよいが、複数のコマンドキューに容れてはならない。
描画ターゲットと深度ステンシルは、たんなるメモリだが、テクスチャとして扱うので、参照保護のためにアクセス前にはバリアを遷移させて状態を明示的に制御する。
マルチレイヤの合成、オフラインサーフェスへの描画、スワップチェインから取り出したバックバッファへの描画、present。
一枚書くだけでもしんどいな 字形は字形でFT使っているから、プロセッサメモリにレンダリングしてGPU上のテクスチャと宣言したメモリをマップしてアップロード。
それをパイプラインで扱うからテクスチャを参照する頂点バッファにテクスチャマップさせたポリゴンを容れる。
ウィンドウ処理(2d処理)を3dで扱うためひUV座標も手前で計算。
欲を出して、ウィジェットのパーツを1メッシュで扱えるようにして、1ウィジェットをジオメトリ扱いで管理し始めたら
吐きそうほどの複雑な実装になりました。
行数で30万ステップぐらいか?
セミコロンは、そろそろ100万いけそう それだけの苦労をして得られるパフォーマンスは、
DX11に比べて如何ほどなのだろうか・・・? 一概には言えない。
よく言われる通り、コマンドキューとコマンドリストを複数持って並列に実行させられるから、GPUを無駄なく使うようにしやすい。
200の入力を3回するには、600の計算量となるが、それをシーケンシャルにやれば600時間単位係り、それを並列に計算できるなら3並列で200時間単位にまで落とせるかも知れない。
描画バス、遅延レンダリング(深度バッファシャドウ)なんかは前段の計算が完了する要件があるから並列できない。
ジオメトリやメッシュを描画する部分が適用しやすい。
つまりフレームレートに影響するのは、ポリゴン数と描画ターゲットの解像度。APIセットが計算性能に与える影響は大きくない。
APIセットは、ドライバとハードウェア設計を楽にした上で、オープン規格でプログラムをコーディングしやすくするもの。
12の良いところは、GPUを直接触るような気持ちよさだと思う oggファイルをSlimDXのXAudio2で演奏しようとして、Ogg Vorbisを使って見たのですが、
ov_readで取得したchar *bufferをMultimedia::WaveStreamに入れこむ方法がわかりません
かなりスレ違いな質問だと思いましたが、適当なスレが見つからなかったので >>355
なにも考えずに、そのまま複写する。
オッグぽルヴィスから取り出した時点でPCMチャンクになるはず。
気にするべきはチャネル数、量子化ビット数、サンプリングレート、フレーム(チャンクのデータ量、バイト数)を合わせること。
なお、詰まりやすいのは、サンプリングレート。
単純にデバイスが対応していれば良いが、非対応なら自力でリサンプリングする必要。
基本は、デバイスが対応しているサンプリングレートのデータをなんからのコンバータで変換した音源を用意する。
ちなオーディオプレーヤーなんかを書く場合は、入力音源のサンプリングレートを絞ると使えないツールになるから、リサンプリングが必須。
リサンプリング機能は、インストールされたCODECに依存するが、ウィンドウず標準のコーデックは使いにくい。
商用ゲームがセガ?のAMのファームを使うのは、このあたりに関係してんのかも。
ちらうら WaveStreamを作成するときにヘッダー情報を入れてないだけでした。すんません
SlimDXのサンプルコードでは、AudioBufferにWaveStreamをそのまま入れているけど、ヘッダー情報を除いたStreamが正解ですよね?
ov_readで取得したデータでMemoryStreamを作成してAudioBufferに入れたら演奏できました おま環
前半のような勘違いをしてる知能だと後半でも勘違いしてる可能性大 >>357
音が出たならそれでいいかと。
チャンクのゴミはコーデックのハイパスフィルターで除去される。
ストリームにヘッダー情報が来るようなAPIはないと思う。
サンプルがファイル処理をやってんだと思う。 DirectX11でレンダーターゲット(画面全体)にシェーダを適用する方法を教えていただけませんでしょうか
板ポリゴンにシェーダを適用する方法は分かるのですが…
画面全体にピクセルシェーダを使って「GLSL Sandbox」のようなことがしたいです
ググったのですが、そういうサイトを見つけられませんでした >>360
・シェーダで一切行列を使わない
・射影座標(-1〜+1)の範囲で頂点座標を指定して頂点配列を作る
要点はこの二つ
細かい点は
・ビューポートはウィンドウサイズに合わせる
・描画ターゲットはスワップチェインから取り出す
・深度ステンシルは取り敢えず忘れる
・固定機能ステートはすべてデフォルト値でつくり、コンテキストに設定する
・シェーダーは、とりあえずバーテックスとピクセルのみ(中身はパススルー。入力頂点要素複写だけにする)
あとD3D11デバイスだったかコンテキストとスワップチェインを同時につくるAPIがあるから、ネットサンプルを参考にせず、そっちを使う。 描画するまでに最低限やることリスト
・デバイス、コンテキスト、スワップチェインを作る
・スワップチェインから描画ターゲットを作る
・コンテキストに固定機能ステート(ラスタライズ、ブレンド)を設定
・コンテキストにシェーダー(バーテックスとピクセル)を設定
描画ループ(最適化なし))
・コンテキストに入力頂点配列レイアウトをつける
・コンテキストに入力プリミティブを指定する
・入力する頂点配列に適したdrawを呼ぶ
・スワップチェインにフロントとバックバッファを切り替えるようにつたえる(present)
必須なのは、このあたり。
やっちゃダメなこと
・神に祈るな >>361
ありがとうございます!
おっしゃるとおりVertexBufferで-1.0〜1.0の範囲の4頂点を作って、VertexShaderで行列を使わずにそのままinput→outputするだけでいけました
数時間悩んでたのですがスッキリしました
基礎が全然分かってないことに気づきました
ありがとうございました >>363
おめめ!
そこがわかれば、射影行列、ビュー行列、ワールド行列と芋づる式に理解できる。
射影行列は、行列で指定した範囲の8つの角をそのデバイス座標空間に納めるように座標変換する計算を指す。
その-1から+1の範囲の外におかれた頂点はラスタライズされなくなる。(ピクセルシェーダーに送られない) (チラ裏)
VulkanとDirect3D12の両方でオフラインサーフェースへのレンダリングとレイヤ合成しての描画は実装できるようなったけど、
UnityやUnrealで使われているスクリプトやデータ構造を使ったレンダリングパスの可変実装ってのは、
必須なんだな、ってシミジミと感じる。
・平面に描画するパス(1:n)
・立体を描画するパス(1:n)
・立体に影を付けるシャドウマップ用の計算目的のパス(1:n)
・字形をプロセッサで描画したテクスチャをGPUに流し込むパス(1:n)
・ウィンドウ(をウィジェット単位に)描画するパス(n:n)
・上記を合成してスワップチェインに描画するパス(n:n)
今まで描画パスは全部個別にC++で書いていたが、
動的に「描画ターゲット」「シェーダ」「ブレンディングに代表される固定機能ステート」をスクリプトや外部データ参照で実装できるようにしないと
映像的な演出を工夫する際のコード実装でコード量が爆発しそう。
ウィンドウ処理は、描画ターゲットを複数枚要求し、立体の描画は描画ターゲットが一枚でもいいが、複数のジオメトリとポリゴン集合別のブレンディングパラメータを欲する。
やっぱりUnityは、よく出来ている。 XAudioでモノラル音声のパン制御について質問です。
以下のページを参考にしているのですが、
https://docs.microsoft.com/en-us/windows/win32/xaudio2/how-to--pan-a-sound
IXAudio2MasteringVoice::GetChannelMask 関数が
無いようなのですが、どうすればいいでしょうか?
SDKはWindowsXPでも動かしたいので
DirecctX SDK(June 2010) を使用しています。 >>369
そのSDKのXAudio2(2.7)ではサポートしてない機能だから無理じゃないかな
IXAudio2MasteringVoice::GetChannelMask
Platform Requirements
Windows 10 (XAudio2.9); Windows 8, Windows Phone 8 (XAudio 2.8) このバージョンではサポートしてない機能でしたか
代わりの手段があれば知りたかったのですが
ありがとうございます >>371
どうしてもやりたければ自力でパンを考慮したステレオデータに変換からXAudio2に渡す
完全な興味本位だけど、XPは何に使ってるの? イメージとしては、モノラルからステレオへの変換は、モノラルデータの開始位置に差をつけて、右チャネルデータとして扱い、後ろに詰め物を入れる。
パンは出力したい左右の比率に合わせてPCMデータに比率を掛ける。
これで行けそうな気はする。
チャネルを分離する部分なんかはキチンと実測して試行錯誤しないと、ステレオじゃなくエコーに聴こえるか、モノラルのままに聴こえそう。 ありがとうございます
どのチャネルが左右のスピーカーのどちらなのかを知る手段がないと厳しそうに思えました WindowsXPは古いゲームをプレイするのに使っています 第三科学研究所のDPPケーブルがUSBよりも入力遅延が小さいのと
マルチタップが使えるので気に入ってます 「DirectX9必携」という本が良いと聞き
DL版をカートに入れてPayPalで支払いしたんですが
お店からなんの音沙汰もありません
手続き間違えたんでしょうか?
ノースブレインコンピュータのペイパル店です それ結構アレな筆者がひとりでやってる会社だから
音沙汰ないならペイパル通さないと埒が明かないかもしれない dx9は、環境を整えるのが苦労するような。
プログマブルシェーダーはよいもの。
固定機能シェーダーは難解。 >dx9は、環境を整えるのが苦労する
昔はともかく今は全然苦労しない
っていうか最近のVS(VC)入れたら勝手に入る 固定使わなければいいだけね
初学者には難易度逆な気もするが 初学ならウニかアンリ。
レンダリングパスをプログマブルにスクリプトに出来るのは、かなりいい。
最近、自作プログラムでディスクリプタとコマンドリストを工夫したが、12とバルカンはかなり面白い。
ディスクリプタが最適化の要とかかれたウェブページを見かけるが、コマンドリストもかなりいい。
専門用語チックな単語を使うけど、モデルデータ単位でコマンドリストを作ることが出来るのは11の特殊な実装と12とバルカンだけだと思う。
「コマンドリストへの命令詰め込みを描画パスの外側に追いやることができる」
簡単な実装で試してみたが、目に見える効果があった。 ちなみにこのアイデアは、バルカンチュートリアルの受け売り。
あれのサンプルがしれっと実装していた。 (どうせ使わん知見)
ディスクリプタとは?
→ テクスチャと定数バッファに対する入力アセンブラに位置付くメカニズム
入力アセンブ ちらうら。VRMというものがある。
ファイルフォーマットは、glTFを拡張したもので比較的に統一されたボーンデータを含めて人形モデルを扱える。
おおこれは!と思って調べてみた。
メッシュデータを覗いて無かったことにした。
データ交換にはよいけど、これをランタイムでロードする気にはならない。
終わり。興味がありそうな規格なので書いてみた。 VRMというよりglTFのデータ構造がランタイムで使うには不適切てのは、
GPUに流し込む頂点配列は、予め流し込んで扱いやすく整理しておかないと、ロード時に頂点構造をいちいちフェッチ、整理(積み替え)が必要になるということ。
GPUメモリをマップしたアドレスにストレージからダイレクトに流し込むことが最効率となる。
つまりそういうこと。
こんぐらいは説明なしで理解出来ているのが殆どだろう。 >>396
反射鏡面に歪みがないなら、当然焦点はないだろ。 描画パイプラインが新しくなるんだね。
増幅シェーダとメッシュシェーダに変化する。
増幅がIAからテッセレータあたりまでをカバーし、メッシュシェーダが評価シェーダからジオメトリシェーダをカバー。
そのあとはラスタライザに繋がり、ピクセル補完なんかに続く。
増幅シェーダに与える頂点バッファ索引バッファを複数一気に与えることが可能っぽいから、
ほとんど計算シェーダになって、シェーダが意識して頂点を参照するような気がする AIがプログラム描くようになって
中で何やってるか人間に判らないレベルになると
みんな気がするしか言えなくなる気がする >>403
まあ、答えを書く義務なんてないからね。
キチンと読まんと頭の中身がおばちゃんになっちゃうよ。 ■ このスレッドは過去ログ倉庫に格納されています