【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リンク DirectX9でアニメーションメッシュを描画するのに
HLSLを利用しようと考えています。
そこで気になったのですがID3DXAllocateHierarchyの仮想関数CreateMeshContainerの
3番目の引数に D3DXEFFECTINSTANCE *pEffectInstances というのがあります。
また、D3DXMESHCONTAINERにもLPD3DXEFFECTINSTANCEというメンバーがいて
シェーダー用に何か用意されているみたいなのですが
これは無視して問題ないですか? >>5
使ったことないから知らないけど、
おそらくは、固定機能の挙動を操作するパラメータ値を「エフェクト」と読んでいた筈だから、
固定機能のパラメータを別に設定すれば、そこは省略しても大丈夫だと思う。
ただ、それ以前にDirect3D9を使うことを避けた方が合理だと思う。
アニメーションメッシュ(ボーンアニメーションとかスケルタルアニメーションとか言われるやつ)は、
それを実現するには、入力するモデル(=ジオメトリ、メッシュの集合)に頂点索引と頂点重みを適切に付与してやることを暗黙の大前提とする。
これが整ったモデルがない限り、アニメーションメッシュを描画して、任意にモデルを動かすことはできない。
そして、これが整ったモデルがあるならば、Direct3D9を使う必要もない。 >>6
回答有り難うございます。
いろんなサンプルを見てみたのですが
まるぺけ様の解説以外は皆無視していたので
自分も無視して実装してみていました。
HLSLのエフェクトのことではないんですね…
いろいろあってDirectX9使うしかない状況になっています。すみません。 これが期待通りの結果を得られるならば、ライトマップテクスチャを作りやすくなりそうだな dx12には興味はないけど
これはちょっと面白そうだよな
今は忙しいんで始めないけど
落ち着いたらやってみたい DirectX9でD3DXMESHCONTAINER構造体にpNextMeshContainerというメンバがいて
次のメッシュへのポインターということはわかるのですが、
先頭のメッシュはどうやったらわかるのでしょうか?
よく再帰関数でMeshContainerを探すプログラムがありますが
兄弟→子供の順で探すものと子供→兄弟の順で探すものがあり
この場合、XファイルにMesh情報が複数あったときに最初に見つかるMeshが異なるはずです。
兄弟から探す、というような決まりがあったりするのでしょうか? DaaSって
DirectX as a Service の略? 数学の初歩的な質問ですみません。
D3DXVECTOR3型の単位ベクトルをD3DXVECTOR4型にする場合、
xyzをコピーして、w要素に1.0fを渡せば良いのでしょうか?
もしくはD3DXVec4Normalizeを再度呼ぶべきでしょうか? 目的が分からないから答えにくいが
とりあえず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
そのまま取得するだけではだめなのでしょうか?