【C++】 DirectX初心者質問スレ Part40 【C】©2ch.net
レス数が900を超えています。1000を超えると表示できなくなるよ。
回答する人も、質問する人も必ず読んでください
これらに当てはまる人のための質問スレです。
1.C/C++は多少理解している。
2.最近DirectXを始めたばかり
3.SDKを見ても、Googleで検索しても、いまいち理解できない人
4.余計な雑談は不要ですよ
【 回答してくださる方 】
・ できるだけ優しく質問に答えてあげてください。
・ 優しく教えるのが嫌でしたら、解決するためのヒントだけでも結構です。
「ググれ」「SDK見れ」以外の回答でおながいします。
・ 神ですら理解不能な質問は無視して下さい。
【 質問する方 】
・ どんな事で躓いているのか明確にしよう。
・ 長くならないなら躓いている部分のコードを晒してみれ。
・ 解決した場合、お礼を言うのは当然だが、何をどうしたら解決したかを明確に書こう。
・ 回答して貰ったら、出来るだけお礼もしよう。
前
【C++】 DirectX初心者質問スレ Part39 【C】
http://echo.2ch.net/test/read.cgi/tech/1418438785/
>>2リンク スレタイ読んでからこのスレ頭から読むとひでぇな
偉そうなのがずっと文句言うだけのスレという
そら廃れますわ、まぁおかしいのが一人、ずっと常駐しているだけかもしれないが >>836
答:MediaFoundation
メディアGUIDハードコーディング 愚痴だがWindowsのカメラフレームワークは、なんであんなに使いにくのか。
デバイスから取り出した映像と音源のストリームをそのまま寄越せといいたい。 Media Foundationが「DirectXのみ」に当てはまるかはびみょんなところね すいません教えてください。D3DX11CreateShaderResourceViewFromMemoryを使って、テクスチャの画像更新をしているんですが遅いんです。
FPSは1桁台になっています。テクスチャのサイズは1024×1024です。他で高速に処理できる方法を教えてください。よろしくお願いします。 予め画像を全部GPUに送り込む
画像の中味をCPUで触るのならば、定数バッファでレバ利かせる。 目的にもよるがCPUからのテクスチャ更新は基本的にUpdateSubresourceだぞ >>847 了解しました。UpdateSubresourceを調べてみます。 >>846
お前さ、
自分の回答がズレズレなのわかってる?それがわからないなら
迷惑だから答えるのやめろよ 色々なわけがあって、dx9で個人制作のゲーム作ってるんだけど、dx9の作品でゲーム業界行けるかねぇ
unity,ueのが断然良いってのはわかってるんだけどさー >>854
DX9で何をするかが大事。
APIはそれほど重要ではない。 vista以降DirectSoundの中はソフトウェアでやってるって聞いたけど回避策はないのかなあ ソフトウェアでなんか困るのけ?
レイテンシをタイトに突き詰めたいとかならWASAPIで自前で頑張るしかないんじゃね 自分で作るならそうなんだけど
他人のソフトだとそうもいかないしなあ オフラインで問題ないソフトなら、昔のハードを用意すりゃいい OSの仕組み上厳しいでしょ
SBのアルケミーみたいな仕組みでもないと WASAPIネタで便乗
排他モードで複数ソースを同時発音するには
自力でミキシングするしかない、という理解で正しい?
ていうかスレチ? サウンドカードが一個ならたぶん排他モードで専有しちゃうと思う
2つあれば1つを共有モード
1つを排他モードとかできるかもしれない
やってみないと
普通に作り混んでるとハードウェア列挙したりAPI選べるから行けそう なるほどー、たしかに複数デバイス使っての同時発音なら
出来そうだけど流石にニッチすぎるかな?w
自分はおとなしく共有モード使っときます・・・ 質問です。
DirectInputでゲームパッドをEnumDevicesしたのですが
引数をDIEDFL_ATTACHEDONLY | DIEDFL_FORCEFEEDBACK にすると
上手く取得できません。
引数をDIEDFL_ATTACHEDONLY のみにすると上手く取得できます。
という事はこれは自分が使ってるゲームパッドのフォースフードバック機能を
DirectInputから認識できないという事になるでしょうか?
パッドはEDGE301というものです。 そもそもEDGE301がDirectInput非対応のようだけど DirectShow/Media Foundation/Windows.Media.Captureだな
もちろんスレ違い >>865
そうなんですか?
DIEDFL_ATTACHEDONLYにすれば一応取得できて
方向キーと一部のボタンだけの情報はDirectInputから取得もできました。
XInputの方も試しましたが、どうしてもLT,RTの情報が取得できません…
XINPUT_GAMEPAD 構造体のbLeftTrigger, bRightTriggerも変化なく
ボタンの、XINPUT_GAMEPAD_LEFT_THUMB, XINPUT_GAMEPAD_RIGHT_THUMBも変化無しでした。
LB,RBの方はボタンのXINPUT_GAMEPAD_LEFT_SHOULDER, XINPUT_GAMEPAD_RIGHT_SHOULDERで取得できるのですが…
LT,RTの取得は無理なんでしょうか。 すいません。自分の勘違いでした。
XInputからはbLeftTrigger, bRightTriggerの値で取得できました。
お騒がせしました。 directxsdkのサンプルあるだろう
あれの結果はどうなのよ やはりこのパッドのフォースフィードバックの機能は
DirectInputからは見えないようです。
どのコードを動かしてもDIEDFL_FORCEFEEDBACKを指定すると
EnumDevicesでこけます。
という事で大人しくDInputから動かそうと思います。 × DInputから動かそうと思います。
〇 XInputから動かそうと思います。
お騒がせしました。 今ってXInput非対応のゲームコントローラどのくらい残ってるんだろう。
もう無視してよいくらいのレベルの話?
市販ゲームだとXInputのみ対応って結構あるよね。 >>875
Amazonとかではまだまだ売ってるよ。アナログスティックの無いシンプルなやつとかね
でも昔と比べると減った(XInput対応が増えた)から、
キーボードに対応してればゲームパッドはXInputのみ、でも問題ないかと >>861
たぶん正しい。
問題の根底にあるのは、
・ソースのサンプリング周波数のバリエーション
・再生デバイスの再生周波数
当たり前だが、再生周波数は一つを選択する必要
つまりリサンプリングは避けて通れず、リサンプリングするならば、ボリュームやイコライザーもソフトウェア処理する方が多様性(みんな大好き♥ダイバシティ)が増すので応用なら好ましい。 なんかカメラの質問に人気があるのね
カメラで盗撮したいなら、Linuxのが簡単だと思うの >>877
と、思いきや
基本的にWASAPIは共有モードでもサンプリングレートの変換は自前でするもの
デバイスの共有モードのサンプリングレートと再生したいソースのレートが合ってない場合は
自前で変換してから渡すのが普通
IAudioClockAdjustmentもあるけど音が悪いのと対応してないサンプリングレートもあるので >>879
IAudioClockAdjustmentは微妙なクロックのずれを補正するためのもので、所謂サンプリングレート変換は想定外だよ。
共有モードで良いなら、XAudio2でも使えば良いんじゃないかな。 Windowsの機能でサンプリングレート変換するなら、Media FoundationのResampler MFT
XAudio2のサンプリングレート変換は音が悪かったはず DirectSound.dllそのもののソースコードって公開されてないのかしら DirectSoundなんですが
DSBUFFERDESC::dwFlagsにDSBCAPS_CTRLFXを加えると
IDirectSound8::CreateSoundBuffer()でINVALIDPARAMが返ってきて失敗します…
DSBCAPS_CTRLFXは指定できないのでしょうか?
DirectSoundCreate8()のところで指定するデバイスのミスとかでしょうか…?
一応、DSBCAPS_CTRLFXを外せば普通に動きます。 面白い現象に出くわした。
Intel内蔵グラフィックスとnVidia
環境がd3d11、x64、7
同じバイナリを使って深度バッファシャドウで影をだしたら、影のでき方が違う。
インテルだと右に影ができる。
nVidiaだと左右に影がでる。
射影行列かラスタライザの生成座標(z成分)か出力マージャが深度値を出す部分に機種依存する所があるみたい。
不思議… >>887
未だに同じコードで絵が違うとかあるんだなw >>886
GetDeviceCaps()は
IDirect3DとIDirect3DDeviceにしか無いみたいなのですが。
それからIDirectSound8とIDirectSoundBuffer8の方にはGetCaps()がありますが
IDirectSoundBuffer8::GetCaps()の方はバッファ作成時に指定したフラグが何かだけが取得できるようです(dwFlagsに指定したものがそのまま取得できるようです)。
IDirectSound8::GetCaps()の方にはエフェクト関係の能力値は無いような気がします。
どこで調べれば良いのでしょうか? 自己解決しました。
dsbdesc.dwFlags = DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFX;
このフラグ指定でいけました。
DSBCAPS_STATICとDSBCAPS_CTRLFREQUENCYとDSBCAPS_CTRLFXは同時指定できないみたいですね。
今回はDSBCAPS_STATICを同時に指定してるのが原因でした。 インテルiGPUはちょくちょく仕様外の挙動するから困る
俺はテクスチャフィルタリングで悩んだ DirectX 9 シェーダプログラミングブック
古本探しまくったが、CD付きが売ってない。
なくても勉強する上で問題ない? >>892
なくても大丈夫。
昔のVisualStudioのアプリウィザードベースだから簡単に実行もできないだろうし。
今給黎本はとにかく本の内容が充実してるし、それ読めば十分。 質問があります。
当方、vvvvというフリーのソフトでシェーダーを書こうとしているものですが、
HLSLに関する質問です。
次のようなエフェクトを考えています。
@ビデオからの入力をリアルタイムに取る
Aそれをパーティクル化する
Bパーティクルをいろいろ動かす
@とBはどうにでもなるのですが、Aをどうやって実践したらよいかが色々調べましたが
分かりません。
テクスチャをサンプリングして、それをピクセル単位にスケーリングして(ここまではできます)、
それを分解するというか、とにかくテクスチャからパーティクルを生成したいのですが、
考え方等を教えて頂けないでしょうか。
よろしくお願いします。 >>896
要するに映像効果としては、画像をピクセルレベルで分解して好き勝手にいじりたいんです。
ダンサーさんとのセッションか何かで、動いているダンサーさんをパーティクル上にして縦横無尽に動かしたら、
面白い効果が得られるのではないかと思いまして。
ここ↓でやっているようなことを、HLSLの文法で実装したいのです。つまりテクスチャの対応する
ピクセルの色を取得したいのです。
https://mike-neko.github.io/blog/metal-image/
ですので、考え方というよりは↑のサイトのコードのHLSLへの翻訳をしたい、ということです。 >>897
ソースがあるんだから移植しろよ、アホか すみません、初心者なもので、HLSLの文法がよく分かっていないのです。
例えばこの一文にしても、
particles[index].color = image.read(id);
このままじゃHLSLでは使えませんよね、
じゃあ、済みません、一つだけに質問を絞って消えます。
上の変数particlesですが、Metalという言語において
元のテクスチャを格納したバッファだと思われます。
HLSLだと、サンプラーを使いたいテクスチャで定義することと同義だと思われます。
というかここまで書いてきて思ったのですが、要するにテキスチャを読みこむというのは、
文字通り画像を分解することじゃなくて、画像と同じスケールの板を用意して、それに画像の色を取得させて、
元画像をパーティクル化しているように見せている、ということですよね。
ですので、分からないのは、
particles[index].position = float4(id.x / (float)size.x, id.y / (float)size.y, 0, 1);
これをHLSLでどう表現するかです。変数パーティクルの後に配列[index]があり、
さらにpositionなるメソッド?が用意されている。ここでパーティクルが配置されているものと思われます。
とても直感的で分かりやすいですが、これをどうHLSLに翻訳するか、教えて頂けないでしょうか。 DirectXしかわからないけど
入力で座標とどのピクセルを描画するかの情報を送る
↓
頂点シェーダでパーティクルのポリゴン作る
↓
ピクセルシェーダで入力情報をもとにテクスチャの1pxを描画
って感じだと思う シェーダコード見てみたけど100行ぐらいしかないやん
しかもシェーダなんて似たようなコードだし
リファレンス見ながら書き直してもたいしたことないだろ
「真性の馬鹿なので勉強の仕方がわかりません。答え教えてください」
こういう風にしか見えんわ >>900-901
ありがとうございました。
もう少し自力でやってみようかと思います。 馬鹿だから無理でした。
内容としては、
頂点シェーダで、テキスチャのサイズにテキスチャ座標をスケーリングしたものと同様の変数を
x座標、y座標ように2つ用意する
↓
それをそのまま2つの配列にする
↓
頂点座標のx成分、y成分にそれぞれ配列を代入する
↓
確保していたテクスチャから色情報を取得してそれを頂点座標に代入
↓
頂点座標を出力(ピクセルシェーダはスルー)
そうしたら、何も映りませんでしたが、入力していたメッシュをワイヤーフレームワイヤーフレームとか
ソリッドとかで表示できる機能がvvvvにはあるのですが、それをポイントにしたら
点が一つだけ表示されました。
書いていて情けなくなるくらい自分馬鹿だなあと思っています。
でも実現の方法が分からず・・・優しい方教えてください。 VSとPSの最低限の物を理解してれば難しくないだろ とりあえず最低限の頂点シェーダだけです。配列index[],index2[]にはソフトウェアの方から、座標を任意個数リニアに出力してくれるノードを使っています。
入力してるメッシュは1つだけで、出力されてるのも1つだけなので、このコードをどういじってもせいぜい変形したメッシュにビデオ入力がそのまま映るだけです。目的としては320*240個のパーティクルを作りたいのですが、
ソフトウェア側でその数のパーティクルを用意するのでなく、単にその数の座標を入力しているだけの状態です。
struct vs2ps
{
float4 Pos : POSITION;
float2 TexCd : TEXCOORD0;
};
// --------------------------------------------------------------------------------------------------
// VERTEXSHADERS
// --------------------------------------------------------------------------------------------------
float index[320];
float index2[240];
vs2ps VS(
float4 PosO : POSITION,
float4 TexCd : TEXCOORD0
)
{
vs2ps Out;
PosO.x=index[TexCd.x * (ArrSize-1)];
PosO.y=index2[TexCd.x * (ArrSize-1)];
Out.Pos = mul(PosO, tWVP);
Out.TexCd = mul(TexCd, tTex);
return Out;
} あとPSとVSのバージョンは3.0までしかソフトウェアが対応していません。
DX9の環境です。
よろしくお願いします。 DX9だと入力のメッシュを320*240にしないと難しいよ その場合、単一のメッシュ(320*240)をピクセル毎になるように分割する、ということになるのでしょうか?
幸い、メッシュを任意個に分割するノードがvvvvにはあります。 流石に潮時ですかね
スレ汚し失礼しました
ただ、具体的な回答があればもっと早く消えていたのですが。
残念です。 CreateCompatibleBitmapでメモリビットマップを作成し、
それに対してGDIのDrawTextで描画し、それを画面にBitBltするという、
昔からよくある手法で画面に大量の文字を描画する処理があるのですが、
DirectWriteに置き換えると文字を綺麗にできると聞きました。
CreateCompatibleBitmapなどの仕組みは残したまま、
メモリビットマップへのDrawTextの部分を置き換えることは可能でしょうか?
よいサンプルがあれば勉強してみたいのですが。 >>919
GDIでTextOut/DrawTextやってる程度なら出力先をGDIとしてDirect2D上に描画
Direct2D and GDI Interoperability Overview
https://msdn.microsoft.com/en-us/library/windows/desktop/dd370971
Rendering DirectWrite
https://msdn.microsoft.com/en-us/library/windows/desktop/ff485855.aspx
文字単位で凝った処理してるならリンク先にもあるけどDrawGlyphRunというメソッド中心で調査されたし
リッチなレンダリング目的ならどの方法でやるにしても
既定だと基本的にGDI互換の方向で描画して大差無いので
IDWriteRenderingParamsを適切に設定する >>920
ありがとうございます。
わからない仕組みばかりですが、勉強してみます。 本当にやりたいことを聴かずに遠回しに質問するからだよ 質問の目的は明確だし1レス目の回答で完了してるのに
どんだけバカが揃えばこんなうんこみたいな流れになるんだ... 頂点を射影変換して、さらにクリッピングまでされた頂点をテッセレーションで分割したいのですが、
パイプラインの流れ的に普通にはできません。
やれるとしたら、ジオメトリシェーダでプログラマブルにクリッピングして、
それをストリームアウトし、再度頂点シェーダから読み込んでテッセレーションするというやり方でしょうか?
プログラマブルなクリッピングが可能かどうかが問題ではりますが・・・。
もっといい方法があれば教えてほしいです。 4ヶ月ぶりに覗いたけど
相変わらずかそってんのな
amdのfetch4ってgatherredで効くの?
Sample()で4点フェチして自前でバイリニアすると(dx9のshadowmapのサンプル)
ちゃんと補完されるのに
gatherredだとモザイクみたくなるんだよな
コツ教えて ピクセルシェーダはピクセル単位だし
クリッピングされた頂点が欲しいというなら
これは不適当だ
アンタの言うとおり
ジオメトリで三角形分割して
ストリームアウトプットしか無いんじゃないか 何がしたいのか、サッパリわからん。
この説明だと、二次元に落とし混んだ後に三次元計算したい!と無理なロジックを考えとるように聞こえるの。 そもそも「クリップ」が何を、どのような結果を期待しているのか?がわからない。
「ワールド座標内から三次元に空間を切り取りたい」
だけならば、頂点シェーダで空間外にある頂点を捨てれば済む訳なんだが、
するとドメイン、ハルシェーダに流し込むべきプリミティブの整合がなくなる。
そうなるとジオメトリシェーダでプリミティブ単位で落とすことになるが、これだとパイプラインの工程に制約され、テセレータに戻すには二バス目が必須となる。 書きながらなんとなく、メッシュをピクセル単位で落としたい、
メッシュの衝突をシェーダでやりたいのかと思ったが、そうなるとテセレータが欲しいという意図が不明。
もちっと具体的に実現したい結果を説明しないと有意義な答えは出てこないと思う。 シェーダは別に1パスであらゆることが実現できるようには設計されていない、
一般的な三次元描画のセオリーを基軸にして、高速に計算できるように設計している。
パイプラインのフローに合わないものを実現するならば、マルチパスにするか、アルゴリズムを変えないと実現できずにアシぶみするだけ。 930だがcapsviewerみたらshader _gather4がoffだった
このせいか?
GPUは超最新のRX470だから意外だ・・
クリッピングに関しては
やってることがおかしいのは
皆わかっていることだろう
大事なのは本人が満足することであって
忠告は余計なお世話だ 1パスでやるなら一つ方法がある。
頂点シェーダは頂点番号を引数に取れたはずだから、三角形リスト(ようはストリップとファン以外)を前提に頂点番号の剰余をとる。
あとは定数バッファにクリップしたい空間をいれるなりする。
というか、クリップしたいのが何なのかがわからんと、これでいけるのかもわからんが。 そうだ。俺が知る限り、ピクセルシェーダ以外にdiscard命令はないから、厳密にはクリップはできないと思う。
これはプリミティブの一貫性を担保出来なくなるからだと思う。
つまりクリップ後じゃないとダメというなら、それはかなり無理をしないと実装しにくいと思います。
おわり レス数が900を超えています。1000を超えると表示できなくなるよ。