【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 リンク レス頂きまして、ありがとうございます。 >これを書いてる場所が可笑しい 場所ですか・・・、これは 便宜上隣り合ってるだけで、実際の記述とは異なります。(´・ω・`) RELEASE(&lpTexture[j]); じゃね? 知らんけど 自己解決しました。 レスポンスをくださった方々ありがとうございました。 機会がありましたらまたよろぴくぴくぴくです(´・ω・`) 解決法は画像データ(pngデータ)のサイズを半分にしました。 ディファードレンダリングについて質問です。 directx11でディファードレンダリングを勉強中なのですが、 最終描画でカラー情報と法線情報をうまく取得できません。 以下の画像のようにテクスチャ一枚一枚に描画されるような感じになってしまいます 左上がカラーと法線、下が結果です http://iup.2ch-library.com/i/i1926984-1533963662.png http://iup.2ch-library.com/i/i1926983-1533963662.png そのまま取得するだけではだめなのでしょうか? >>101 参照するメッシュがスクリーンじゃなくて、立方体になってるじゃん >>101 最後は立方体じゃなくて1枚の板ポリを描画する >>102 >>103 上手くいきました!! ありがとうございます Direct3D12で描画ループを描けた記念のカキコ。 Direct3D12は、かなりVulkan(Mantle?)の影響を受けているけれど、 11以上に描画パイプラインが理解しやすく、GPUをイメージしやすくなっていていいね。 もう11には帰れない。 11に帰りたくない。 そこで12を普及に当たって、躓き易い箇所を整理、共有しておきたい。 箇条書きで。 <Descriptor Heap、Descriptor Table、Root Signature、そしてCBV,RTV,DSV,SRVの関係> 1.Descriptor Heapとは? CPUとGPUを結びつけるCPUポインタとGPUポインタの集合。 GPUポインタは、リソースを示し、CPUポインタはハンドルを指す 又、一つのエントリが11でいう「ビュー(RTV、DSV、SRV、CBV)」 2. Descriptor Tableとは? シェーダリソース。 3.Root Signatureとは? シェーダにリソースを入力するデータの構造定義。 レジスタとのバインディング情報 機械翻訳だと「ルート署名」とか翻訳されるが、罠なのでスルー推奨。 決して、ルート証明書で署名したASN.1符号データなんかじゃない。 ヘッダを指して「シグネチャ」と呼ぶ、そういう慣習から来るワード QA. シェーダリソースの構造、レジスタとのバインディングって、どう決まるの? Root Signatureのパラメータテーブルに登録する「Descriptor Table」で規定する構造で決定される。 ここだけ理解すれば、D3D12の入門で吐きそうになることは軽減できると思う。 次の難関は、nodeTypeとTextureロードだけど、ここは頑張れ。 テクスチャロードは、明示的に命令リストを介してGPUに配列を正規化するように命令を飛ばすことをプログラムするだけの話。 nodeTypeは、マルチGPUでの処理を制御するための情報。 D3D12はD3D11がやってくれてたことを自前でやるだけだから凡その場合どうでもええが DXRが目的の場合はいよいよ避けて通れなくなりそうだからなあ どうせまた複雑過ぎるとか 世論が騒いで 易しくなった13が出るだろ それまでワイは手を出さんで つーかそれまでにガンとかで 死んでそう いや、簡単は11、複雑は12と住み分けることになってる。 どこで質問していいか判らなかったので質問させて下さい。 LOGFONT の lfPitchAndFamily の FIXED_PITCH と同等の判定を FreeType2 で行いたいのですが、face_flags を FT_FACE_FLAG_FIXED_SIZES と FT_FACE_FLAG_FIXED_WIDTH で判定しても、 どちらも FIXED_PITCH と違う判定が返されてるのです。 何か方法はありませんでしょうか? int* str; int *str; ポインタなんだけど、2つの書き方の違いって何? >>112 固定ピッチにしたいなら、固定ピッチに対応したフォントに限られる。 MSpゴシック、游ゴシックなんかを与えても固定にはならない。(と、思う) 恐らく、NotoSansMonoというキーワードが妥協案におすすめ。 字形の描画(レンダリング)で言えば、アンチエイリアス(輪郭のギザ付きを中間色で誤魔化す)もFTはやってくれるから、自前でピッチを固定したり、間隔を整えようとすると苦労する。 数学というよりも心理、グラフィックスデザインの領域に近いのかもしれない。 ついでに言うとDirectWriteは字形のパス(この場合、頂点配列に近い)を出力できる。 >>113 前者は int* str, hoge, fuga; っていうミスをしがち 後者は int *str, hoge, *fuga; で書き分けの意図がはっきりする よって後者をおすすめします >>115 説明下手で済みません。 そういう意味ではなく、Faceに読み込んだフォントが 固定ピッチなのか可変ピッチなのかを判定したいのです。 >>117 理解はできるが、後者は気持ち悪くてできないなぁ(汗) しょうがないから1変数1行ずつ書いてる。 >>118 詳しくは知らないが、恐らく「ない」んじゃなかろうか。 以下、すべて蛇足、憶測。 ウィンドウズほど優しくできていない。 字形のレンダリングに限れば、必要としない判定。 必ず字形毎(文字毎)に設計された間隔を読むから。 あとFTはAndroidで使われているから、そっちほが詳しくのがいるのではないかと。 >>119 気持ち悪いのは int *str, hoge, *fuga; が混ざってるからで 完全に一行ずつに分けなくても int hoge, hage; int *str, *fuga; なら問題ないだろ int* str, hoge, fuga; の意図が int* str, * hoge, * fuga; だとするとこっちの方が気持ち悪い ミニゲームじゃなくて気合入って作られてるDirectX使った出来の良いゲームで 言い方悪いけどパクれるというかお手本になるソースコードって公開されてない?流石に都合良すぎるか 文法、記述ルールは、宗教戦争だけど、 最近流行りのヌルポ排斥運動は、熾烈な勢いがある。 コーティン?だったかは、変数の使い回しを言語レベルで排斥する思想。 ヌルポを排斥するため「仮決め(代入なしの変数宣言)」を許さない。変数の仮決めは穢れている。 初期値から消滅まで、必ず値を持たせるためには、有意な値を引き回せばよい。 結果、グローバル、アクセス自由度の高い変数に流れ、見通しの悪い、誰が更新参照してんだかを特定しにくく(匿名性を高める効果を促進しやすく)なるか、アホみたいに引数を引き回すかコンテキスト構造体を引き回すことになる。 コンテキスト構造体とは、すなわち匿名性の促進と道義。 >>125 ソースコードだけならば、Elonaがソース公開されているんでないかな。 よくしらんけど。もしかしたら作者と直に連絡を取った人だけに渡してるのかもしれん。 最近は、コンシューマでもインディーズとカテゴライズされて地位が出来上がっているから、なかなか巡り会えないと思う。 最近のインディーズゲームは、少しおかしいぐらいに技術力が高いからね。 3Dシューティングで視点がステージや進捗で変わるのがあるが、あれはかなり異常な出来だった。 もはやプロの仕事。 >>126 適当にGitHubとか言ってるんじゃなくてマジであんの?GitHubすごいな どういった風に検索すればいいんですか? >>128 Elonaはもうソース配布してないみたいですね というかElonaってHSPだけどDirectX使ってたのか >>129 DirectX5からの付き合いだが、俺もVulkan移行中ですわ directX12で勉強がてらゲーム作ってたけどAI流行ってたから CS使ってAIの実験してるわ。 とりあえずC++とDirectxあれば何でもできるね >>129 VulkanとD3D12、両方使っているけど、 比較的に12の方が優しいが、どっちも癖がある。 整理されていて、より些細なことまでできる分、一山越えると少しだけVulkanが好きになる。 Vulkanの入力アタッチメントなんかは、避けるべきと思う。 vulkanとd3d12の違いは vulkan ・描画バスの仕組み(このパスは、マルチパスレンダリングのパス) d3d12 ・レイトレができる(らしい) 描画パスの仕組みがないのは、恐らくは後方互換性。 利用するプログラマをつき放さない意味での用語や理解についての互換性が趣旨に感じた。 (そんな言葉はないけど、エクスペリエンスのデノミを避ける、が近い?) Vulkanの描画パスは、吐ける。 ゲーム制作をしてるのですが、 XInputGetState関数でXbox Oneのコントローラーは扱えますか? MSDNでは 『XInput とは、Windows 向け Xbox 360 コントローラーからの入力値を、アプリケーションで受け取れるようにする API 』 と書いていたのですが… https://msdn.microsoft.com/ja-jp/library/bb173045 (v=vs.85).aspx >>138 スチームでの対応状況が参考になるのではないかと。 非対応なら無理。対応しているならいける余地はありそう。 7でPS4コントローラがUSB接続で制御できたことは確認済み。 なお、これはDirectInput8を使った。 検索して探していると『WindowsにはXBoxのコントローラを使用するためにXInputというAPIが用意』とか『Xbox One、Xbox360等のX-input式のコントローラー 』とか等と書いてあるブログが複数発見したので同じ仕組みかな?とは思うのですがMSDNを見ているとXbox360専用と書いていたので >>137 Currentは、もうヤダ。 マルチスレッドレンダリングする上で面倒くさい。 って事だと理解している。 命令のキューと整理されれば、プロセッサと同様なメモリ保護も視野に入るし、 とあるシェーダが別プロセスのテクスチャを読める可能性を排除しやすい。 11までのGPUは、そういうのは皆無だろうし、12にもvulkanにもなさそうだしね。 GPUにスワップメモリ、仮想メモリ空間、スワップで逃がすストレージなんかないのだから。 DirectX9でSetRenderStateを使ってブレンディングする場合 除算ブレンディングはどうやったら良いでしょうか? 加算なら以下で出来ますが。除算がよく判りません。 lpD3DDev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); lpD3DDev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); dstをぜろ。srcを色指定にすればいいだけに見える oc=(tc*dest bc)+(pc*src bc) tc ターゲット色、pc シェーダ出力色 >>147 たぶん載ってない。 >>148 わー!ありがとう!やってみる。 皆さんDirect3d上でのGUIは 何を使っていますか? ウィジェットのことなら自作だな。 良さそうな小さいのが見当たらない。 ゴリゴリと頂点配列を作って動かしている。 字と背景を別々に作るから、かなり複雑で眠い ただのゲーマーだけど聞いていい? いまだDirectX6使ってるゲーム好きで時々やるんだけど 古いバージョンっていつか切り捨てられて動作しなくなったりする? Windows10でも動いてるしこれからもずっと動いてて欲しいんだけど。 directXはCOMテクノロジーがベースだから 古いゲームでも最新ハードの機能が使えるんやで 例えばdx6ゲームでHWTLやテッセレーション 高度なAAや4k解像度適用などなど ま、今は絶賛開発中なのでしばし待て 22世紀中にはリリースされるよ >>154 DirectX云々以外のところで動かなくなる。イースとかもうWidows10では互換モードでも起動すらしない >>155-156 DirectX自体は互換性があって大丈夫ってことかな? それ以外で動かなくなる可能性の心配した方がいいってことか。 DirectXに互換性などはないような。 ただ過去のスタックが残っているだけのこと。 それすらDirect3D9c未満が動くのか?は疑問がある。 ドライバが非対応なんじゃないだろうか。 あと、動画再生時のCODECが非対応で、動画再生できずに堕ちるってのもあるような。 ソフトウェアMIDIもドライバで実現しているのか、Microsoft標準ドライバが実装しているのかも疑問がある。 取り敢えず、過去に買ったWindows 95時代のゲームで動画再生できずに堕ちたゲームは観た事がある。 Windowsは、Windowsのみで機能を実現など出来ていない。 ハードウェアを扱う部分は、メーカーが提供するドライバが核であり、 そこがWindowsの互換性を提供し、メーカーに向けたドライバ要件が担保となっている。 Officeが必要とするドライバ機能がドライバ要件を決定づけていて、 サポート期間中の製品が必要とする部分なら、ドライバも必須となる。 従って、Direct3D関係の機能は、既に9c未満が動く保証はないと思う。 >>159 ドライバの対応次第ってことかな? 現状ではDirectX6や7や8のゲームは普通に動いてるけど メーカーがドライバ対応しなくなった時が終わりってこと? >>161 ここでウダウダ聞いてもなんの担保にもならんぞ 対応しなくなったら終わりではなく更新されないだけ、それで動き続けるかどうかは神の味噌汁 たまたま動かなくなっただけかもしれない、たまたま動いているだけかもしれない 3DゲームはドライバでなくDirect3DのAPIに対してアクセスしているので WindowsでDirect3D(の該当バージョン)が態々削除されない限りは互換性はあるとは言える もちろん削除されなくてもWindowsの更新で内部の挙動が変化してゲームが動かなくなるなんてことはざらにある DWMが変わったタイミングで動かなくなったアプリが増えたっていう意味です >>162 互換性自体は結構あるね。 VBのDirectX用のDLLはもうOSに含まれてないけど自前で用意すれば結構動く。 ただ昔のゲームで使われてたカラーキーがもうダメなハードがあるね。 質問です。 メインスレッドで描画しながら別スレッドでテクスチャを大量に読み込むと 画面がちらつきます。D3DXCreateTextureFromFileを実行した時にちらついてるようです。 ここにコードを書く事が出来ないのでエスパーでおねがいします。 思い当たる原因はありますか?D3DDeviceをスレッドをまたいで参照してたりするからでしょうか? D3DDeviceを マルチスレッドで使う場合 スレッドセーフで作らんとダメだろう そこはちゃんとやってるのか? マルチスレッドモードに設定してないと、Debugモード実行で警告メッセージ出まくらなかったっけ? それが出てたら、出ないようにするとこから。 >>170-172 ありがとうございます。やぱ作り方を不味ってるっぽいっすかね? 言われた事を参考に自分なりに調べてみます。 また何かあったら宜しくお願いします。 ちらつきで疑わしいのは、presentする辺りかな ディスプレイに表示する描画ターゲットを作り込むときに参照しているテクスチャでもあるんでないかと。 というか複数のスレッドからデバイスコンテキストを触ると蹴られたと思う。 それでもちらつきが一時的な症状ならば、テクスチャ関数が中で排他しているからでなかろうか? ところでチラツキって具体的な症状としては、どれなんだろう。 ・一瞬黒か白が入る ・カクカクしたアニメーションになる ・デジタルノイズが入る ・サブリミナルな絵が入る ・何しにきたんだよ?お前のために決まってるだろ!と友貴に言われる >>174 ありがとうございます。 テクスチャ読み込みした瞬間に「・デジタルノイズが入る」といった感じです。 具体的に言うと「ブロックノイズっぽいものが所々に出る」といった感じです。 症状自体はそこまで酷い訳ではないんですが、チラチラするので気になってます。 一回あたりのノイズのサイズは小さいですね。画面がフルHD時で、128x128くらいです。 テクスチャ読み込み中は特に自分ではD3DDeviceの書き換えは行っていなかった(と思う)のですが 一応念のために以下みたいなクラスを作って排他処理を徹底したら直りました! しかも20秒くらいかかってたテクスチャ読み込みが何故か5秒くらいで終わるようになって いいことずくめでw 最高っす。 class CLockObject { protected: CRITICAL_SECTION m_CriticalSection; public: CLockObject(){ InitializeCriticalSection(&m_CriticalSection); } void Lock(void){ EnterCriticalSection(&m_CriticalSection); } void UnLock(void){ LeaveCriticalSection(&m_CriticalSection); } ~CLockObject(){ DeleteCriticalSection(&m_CriticalSection); } }; スレッド1 LockObject.Lock(); 〜 Direct3D描画処理 〜 LockObject.UnLock(); スレッド2 LockObject.Lock(); 〜 テクスチャ読み込み 〜 LockObject.UnLock(); >>175 その症状ならむしろ巧くマルチスレッドに動いてしまっている、疑いもあるような。 読み込みが未完なテクスチャを読み込めば、瞬間的に変な画素を参照するから、それがノイズに映る。 でも考えにくいので、変な描画、予期していない描画が挟まれて映っている。 あと突っ込まれなかったから自分で言うが 友貴はチラチラじゃなく、ちゃらいだろ。 >>177 ありがとうございます。 一応>>176 でノイズ自体は解決して読み込み速度も上がったのですが 描画スレッドと別で読み込みスレッドでテクスチャを読み込んでいる時に 今度は排他処理の影響か描画速度がかなり落ちてしまう症状が出てます。 ただ別スレッドにして排他処理をしっかりやって読み込むと読み込み速度は かなり速くなったので開始時に画面を黒で塗りつぶして一気に読み込む方法をこれでやろうと思ってます。 出来れば描画スレッドの速度が落ちずに読み込めればいいんですがこれでも問題ないかなと。 まとめると以下のような感じですね 1 シングルスレッドで開始時に読み込むと普通に20秒くらいかかる 2 マルチスレッドで排他処理無しで読み込むと描画しながら読み込めるが20秒くらいかかりノイズも発生 3 マルチスレッドで排他処理有りで読み込むと描画速度がかなり遅くなるが5秒ほどで読み込める そもそもそのテクスチャは実行時に毎回読まないといけないものなのか? 176の実装だとマルチに動いていない気がする。 クリティカルセクションは、一つのスレッドが入ったら、離れるまでは他のスレッドが待たされる。 つまり並列に実行していない。 真面目に並列度を高めるならば、テクスチャ毎に排他オブジェクトを持たせて、読み込みが完了していないテクスチャを描画ループのスレッドが触ろうとしたら、そいつをまるごとスキップして描画を続けるとかするべきかも。 ジオメトリなんかの単位でアセットを管理しているならば、読み込み完了前のジオメトリに紐付くテクスチャや頂点は描画をスキップする実装。 あとはオフラインサーフェースへの書き込みなんかの単位でまるごとスキップとかもできるかも。 チラツキを予防して、読み込み終わったアセットを段階的に画面に映したいなら、そういったリソース管理が必要。 でも大抵は、そんなことせず、読み込みが全部終わるまでは黒い画面を見せる実装を選ぶと思う。 GPUコアの限界までテクスチャなんかの読み込みスレッドを並列化することを選びそう。 >>180 ありがとうございます。 なるほど。効率の面ではまだまだ出来る事は色々あるんでしょうね。 ただ複雑になって下手な事して不具合が出ると困るので自分も単純な方法で行こうと思います。 マルチスレッドで読み込むと読み込み速度自体は上がったので排他処理だけしっかりやって あとは画面を塗りつぶしてそこで一気に読み込む方法を今回は採用しようと思います。 d3dのヘルプを読むと マルチスレッドでは イミディエイトコンテキストは使わずに 別途デバイスコンテキストを作って 描画スレッドではそれを使うようにとあるよ 多分必要なのはそういうところと思う D3DXCreateTextureFromFileとか言ってるからDeferred Contextすらない世代のことじゃろ 1809記念 Direct3D12でコマンドキューにシグナルするタイミング 1.ExecuteCommandList() 2.Present() 一回のコールの度にフェンスの数値をインクリメント(=GPUに処理を実行する契機を与える) これを怠ると終了契機にフロントバッファをコマンドキューが掴んでる、との例外が出る。 ギットハブのError on shutdownってタイトルのスレッドにも報告されている。英語 取り敢えず、APIマニュアルでこの旨の事柄を書いたページは見つけられなかった。 ただのシェア ある画像を別に用意したマスク画像の形でリアルタイムでくり抜きたいです(マスク画像のフチのぼかされてる所も再現したい)。 ただしシェーダーは使わずやりたい。ステンシルとかブレンディングでどうにかなりますか? リアルタイムでやりたいのでロックして直接弄るとかは無しでお願いします。 フォトショの例ですがこんな事をリアルタイムでやりたい(くり抜かれた画像の余白の部分はアルファ値で透明になるように) https://helpx.adobe.com/jp/photoshop-elements/kb/cq07050438.html (1)マスクをレンダーターゲットのαに書き込み (2)くり抜き対象画像のブレンディング設定値を工夫して書き込み でいけるかな? >>187 (1)は、アルファチャンネルつきの画像を用意して描画するとして ARGBのうちAだけが反映されるように(2)でうまく合成するという事になりますかね? RenderStateはSRCがDESTALPHAにすると(1)の画像のアルファ値が上手く反映されますね。 ただDESTをどの値にしてもARGBのうちのRGBの部分も反映されてしまってフチが黒くなってしまいます(マスク画像が黒い為)。 ARGBのAだけ反映させるにはどうしたらいいでしょうか。 マスク画像のRGBはオール0(真っ黒)で、Aだけマスクの形となるα値にする。 んで、(1)のときはRGBは加算合成で、AだけSrcをDstにそのまま書き込みってできないかな? >>189 加算合成で黒が見えなくなるのは黒のピクセルのAが0になるからじゃないですかね? RGBはどうやってもなんらかの値を取らないといけないので… ブレンディングでやるのは無理なんでしょうか… >>187 色々やってみたんですが、まずくり抜きたい画像を描画しておき そのあとにマスク画像として用意した全部黒で真ん中だけ丸くアルファ値ゼロの画像を 上から描画して、最後にその合成された画像を加算アルファで描画すると 余計な部分の黒が全部透明になって理想に近い形になりました。 ただ加算されるので真ん中の描画される部分がちょっとピカピカしてしまいますが。 もうちょっと試行錯誤してみます。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる