【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リンク 目的が分からないから答えにくいが
とりあえずw=1にしておいて問題が起きたらw=0にすればいい
正規化は不要 >>15
まず単位ベクトルとは何なのかちゃんと調べろ
>>16
馬鹿は黙ってろ >>15
元が単位ベクトルなら正規化は不要
ラスタライザが正規化に問題を起こすこともあるから、ピクセルシェーだで正規化を必要とすることもある w=1はおかしいでしょ
w=0だろ元は3次元ベクトルなんだから
お前等大丈夫か? 位置座標は w=1
向き(法線とかライト方向とか)は w=0 向きと座標の違いが分からないのかも
アフィン空間で生活しているのかもしれない DirectXを最近始めた者です。
http://k3tec.net/neko_wiki/index.php?DirectX%B9%D6%BA%C26%B2%F3
に出ていたコードをコピペしたけど、エラーが出て起動できません。
エラーの赤線が引かれている部分は、
pD3D9 = Direct3DCreate9(D3D_SDK_VERSION); のpD3D9の部分
// メッセージループ
MSG msg = {};
while(msg.message != WM_QUIT) {
のwhileの部分、
コードの最後のpDevice3D->Release();
pD3D9->Release();
////////////////////////////////////////////////////////////////////
return 0;
のpD3D9の部分、return 0;の部分などです。
どうすればいいのでしょうか?
よろしくお願いします!! >>24
SDK関連のインクルードができてないのでは?
とにかくエラーメッセージ出してくんないと分からない。 >>25
いろいろいじったりインクルードをやりなおしたりしたのですが、エラーの赤線はなくなりましたが、やはり実行できません。
これがエラーメッセージです ↓ よろしくお願いします
https://youtu.be/olZEyKLDRlw あほというか、これが普通なんだよ。
ここの住人が普通じゃないだけで directwrite始めたいんやが
サンプル落とせないんやがあ!!
ワイどうすればいいんや
馬鹿は死ね以外でよろしおま 最近、とある字形レンダリングライブラリを使った描画処理を整理したが、
DirectWriteからDirect3Dへの転送が遅い理由がよくわかった。 >>31
な、なんや・・
優Cやないけ
おかげでゲット出来たわ
ワイがJKならお礼に
ぎゅるんぎゅるんやってやつところやけど
汚いオッサンなんや
堪忍な☆ >>34
単純にパス数(工程数)が多い。
1.字形のラスタライズ
ベクトルフォントからビットマップにラスタライズ。CPU。輝度のみ
2.字形に色を塗る
輝度から色相。CPU
3.GPUのステージんぐに転送
4.ステージングからレイアウトされたテクスチャに変換
5.アルファ合成
完成
普通のモデル、ジオメトリなら一度読み込ませたらテクスチャ転送なんかしない。 >>35
サンクス!
うわぁ、けっこうCPUに仕事させてんなぁ〜。
もっとGPUにオフロードしてほしいもんだね。 字形描画を実装した。
雑な実装だが、アホみたいに遅くなった。
初期実装:描画ループで35の全部やったらフレームレートが1fpsを割った。
兎に角、プロセッサからGPUメモリにアクセスするとガッツリと下がる。 昔の古いゲーム、メモリの動きを監視してたら
起動するとかなりシステムメモリが消費されるけど
ビデオメモリ使用されてないんですかね?
古いバージョンだとなんか制限あるとかですか? >>37
遅くなったが読ませてもらった。
全然理解できなんだw
フォントレンダリングの基礎を知らないとアカンっぽいね。
今のところ、GPUよりもCPU(SMID)でやるほうが良い領域なんだな。 >>41
・GPUだと早いでw
・FreeTypeは遅い
としか書いてないからな。
GPUオフロードがメモリ面での現実問題になりにくいアルファベット文化の発想と感じる。
訳なんだが、たかだか100MBのベクターフォントなら全部上げて計算シェーダで実装とかも嫁ではないが、
字形をフレーム毎に再計算したいニーズがあるのだろうか? 描画のほとんどは、字の計算式だろ
毎フレーム、描画すると遅い DirectX9 SDK(June 2010)をインストールするとついてくるDirectX Control panelの64bit版が
設定を変えて保存して閉じても、有効にならず、再度DirectX Control Panelを起動すると
変更が戻っています。32bit版であれば正常に動作します。
ググっても同じ症状の人がおらずお手上げ状態です… DirectInputでタッチパネルは扱えるでしょうか? ようやくFreeTypeで縁取りを取り出せるようになった。
気づいたことは、最初から太字でデザインされたフォントじゃなければ、見るに耐えない字になる。
NotoSansレギュラーを縁取りしたら、見栄えが悪くなりました。
とりあえず、あれ。縁取りのサンプルでSVGでやるやつは、取り出しかたの考え方を間違えていると思った。
それとベシエprimitiveがほしい。 やってるのは、16ピクセルだしね
64ピクセルぐらいにすれば、今でも綺麗に縁取りが描ける。
製本、組版はビットマップを好む。
3DCGは速度を求める。パスが欲しい。 「DXライブラリ」がミドルウェアとしてNintendo Switchに対応、ロイヤリティーフリーで提供開始
https://www.gamer.ne.jp/news/201806080022/
マジか… >>53
出世したなぁ…。
使ったことないけど、おめでとさん! 俺もちょい信頼性の落ちる簡易ラッパーぐらいの印象しかなかったわ
昔からあるよねぇ……祝福しておこう dxライブラリーと聞いて、d3dxのライブラリー関数のことだと思ったら別物なのね。 2つの方向ベクトルがあるとき、
一方をもう一方の向きに一致させるようなピッチ(X軸回転)とヨー(Y軸回転)を導き出すには
どのようなアプローチがあるでしょうか?(ロール(Z軸回転)はなし)
一つは、
(1)2つのベクトルに直交する軸(外積)で2つのベクトル間の角度分回転させるクォータニオンを生成
(2)Z軸方向の単位ベクトルを(1)のクォータニオンで回転させる
(3)(2)で回転させたベクトルの先を原点から注視するようなビュー行列をXMMatrixLookAtLH()で生成(上向きベクトルはY軸方向の単位ベクトル)
(4)(3)で生成したビュー行列(回転行列)からピッチとヨー成分を抽出
という手順が考えられますが、もっとエレガントな方法ってあるでしょうか? ただの数学じゃねぇか
数学苦手なんか?
アホらしい 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というキーワードが妥協案におすすめ。 ■ このスレッドは過去ログ倉庫に格納されています