【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リンク DirectX11.0で2Dの不思議のダンジョン系ローグライクゲームを作ろうと思うのですが
ヌルヌル快適に動く物を作りたいので、Direct2DとDirect3Dのどちらを使った方が実行速度が速いのか教えてください >>66
>"DirectX11.0で2Dの"
って書いてあるじゃん?オーバーレイだけでやるって事?
スーパーファミコンの疑似3Dがやりたいのでしょうか?
オーバーレイの機能って3D? 速いね。だが、そのハードルは高い。
11.0てことは、7。
つまり2Dでシェーダが使えない。
すると、ビットマップなんかをロードしてやるにしろ、ちょっとしたセピアフィルターなんかも自前、CPU処理とかになる。
つまり2Dでは遅い。 Direct3Dでやってみようと思います
ありがとうございます
>>72
すみませんよく分かりません
普通のドット絵を特別な演出なしでただ表示するだけです >>75
8.1以降だよ。D2Dのシェーダ機能は。 >>77
正確にはPlatform Updateを当てたWin7からだねえ
shader linkingとかWin10じゃないと使えない部分もあるけど 過疎ってるな
やっぱりDirectX/(^o^)\オワタのが原因か スプライトでも座標変換済み頂点の2D板ポリゴンでも、
1MB程のデータサイズの画像(3000×6000ドット等)を2、3枚重ねて描画していると、
終には重ねたい画像が、白いボックスのものが表示、あるいは画像がまったく何も表示されないという
怪奇現象に出会った人いますか?
仕様です
解決策としてZを少しずらす事で対処するのが普通
そういった機能はDirectXにもOpenGLにも既に付いてるよ 答えてくれてありがとうございます。
言い方間違えました(´つω・`)
Zをいじったり、座標をずらしてみたのですが、結果は同じでした。
16GBもメモリを積んでいる、にもかかわらず、
テクスチャーがトータル5MB分ぐらいしか表示されません。
どう足掻いても、メモリ不足になる、これはどうしてもおかしいなと思うんですよ。
いろいろやり方試したけどできないのです、おそらくVRAMが1GBしかないからなのかな〜?
もうOpenGLで行こうかと思いもします。(´つω;`)
利用しているのはVC++2015とDirectX9.0です、初学者には丁度良いものです。
11、10飛ばして12に覚えようかと期待もします。11はやること多すぎでつ。
みんなみたくUnityみたいなのに乗り換えたほうが利口なのだとおもうますがね、
どうしてかDirectXが捨てられない
沢山pngファイルが読み込めるサンプル作ってくれる人いませんか?
簡単なものでよいので壱万円ぐらいなら払いますじょなもし。(´・ω・`)
>>86
まずそっちから上手くいかないコード晒すのが順序ってもんやろ
現状じゃテクスチャ解放忘れてVRAM使い果たしてんじゃね
くらいの予想しかできねえよ なんで自分が判ってないのを環境のせいにするんだろうな CPU i7 6700K 、メモリ16GB、VRAM1GB、Windows764Bit
テクスチャーを作成しています。中でも大きいものは1920*1080ぐらい)
CreateTexture(n〜10枚ぐらい);
lpSprite->Begin(D3DXSPRITE_ALPHABLEND);
UDXDrawSprite(0);z=0.1
UDXDrawSprite(1);z=0.2
UDXDrawSprite(2);z=0.3
(※この中身はDraw()の3連続描画です。完全に重なっています。3つのレイヤーを持ったスプライトをアニメーションさせているところです)
UDXDrawSprite(3);z=0.4
UDXDrawSprite(4);z=0.5
UDXDrawSprite(5);z=0.6
UDXDrawSprite(6);z=0.7 //この3枚目が描出来ません
UDXDrawSprite(7);z=0.8 //この3枚目が描出来ません
UDXDrawSprite(8);z=0.9 //この3枚目が描出来ません
3枚ごとに表示、ここは重なっていません。3キャラクター分、計700KBで9枚のスプライトを表示しています)。
lpSprite->End();
RELEASE()
解放して終了。一般的なコードです。複雑なことはしていません。3×3枚並べてます。つまり3キャラクターが揃ってアニメーションしてくれれば良いのです。
ごめんなさい描き忘れました。
ようするにこのパソコンのスペックで最大限のスプライトをどのくらい使えるのかが知りたいのです。
みんなのDirectX9.0ってどのくらい詰め込めるものですか?(´・ω・`)
えっと
CreateTexture(n〜10枚ぐらい);
RELEASE();
これを書いてる場所が可笑しい void CreateTexture(UTEXTURE *inf) {
lpTexture = new LPDIRECT3DTEXTURE9[10];//ここで10枚つくる
(中略)
D3DXCreateTextureFromFileEx(lpDevice, inf->fn, inf->size.cx, inf->size.cy, inf->mip, inf->usage, inf->format, inf->pool,
D3DX_FILTER_NONE, D3DX_DEFAULT,inf->colorkey,NULL, NULL, &lpTexture[n]);
}
メモリの解放は
for(unsigned long j=0;j<10;j++){
RELEASE(lpTexture[j]);
}
他 delete
不明だったところです。
レス頂きまして、ありがとうございます。
>これを書いてる場所が可笑しい
場所ですか・・・、これは
便宜上隣り合ってるだけで、実際の記述とは異なります。(´・ω・`) 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未満が動く保証はないと思う。