【C++】 DirectX初心者質問スレ Part18 【C】
1 名前:デフォルトの名無しさん[sage] 投稿日:2008/04/09(水) 09:55:56
※回答する人も、質問する人も必ず読んでください
これらに当てはまる人のための質問スレです。
1.C/C++は多少理解している。
2.最近DirectXを始めたばかり
3.SDKを見ても、Googleで検索しても、いまいち理解できない人
4.余計な雑談は不要ですよ
【 回答してくださる方 】
・ できるだけ優しく質問に答えてあげてください。
・ 優しく教えるのが嫌でしたら、解決するためのヒントだけでも結構です。
「ググれ」「SDK見れ」以外の回答でおながいします。
・ 神ですら理解不能な質問は無視して下さい。
【 質問する方 】
・ どんな事で躓いているのか明確にしよう。
・ 長くならないなら躓いている部分のコードを晒してみれ。
・ 解決した場合、お礼を言うのは当然だが、何をどうしたら解決したかを明確に書こう。
・ 回答して貰ったら、出来るだけお礼もしよう。
【C++】 DirectX初心者質問スレ Part17 【C】
http://pc11.2ch.net/test/read.cgi/tech/1207702556/
超初心者用にさきほど質問をしたのですが、まったく返事がこないので
こちらで質問させてください。
DirectX SDK 9.0をインストールして、その中にあったVoiceClientServerの
voiceserverを試しにビルドしてみたのですが、
C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\winnt.h(236) : error C2146: 構文エラー : ';' が、識別子 'PVOID64' の前に必要です。
などのコンパイルエラーがでてしまいます。
検索をしたらいくつかみつかったのですが、はっきりとした原因と解決策はわかりませんでした。
申し訳ありませんが、何か知っている方がいらっしゃいましたら教えてください。
お願いします。
4 :
3:2008/07/17(木) 14:08:19
補足します。
IDEはVisual C++ 2008 Express Editionです。
5 :
3:2008/07/17(木) 14:55:57
超初心者用の方で回答いただきました。
マルチのようになってしまい申し訳ありません。
以下に解決方法を報告させていただきます。
該当行の直前に
#define POINTER_64 __ptr64
を追加しやりすごすことができました。
次のエラーはrcファイルの中でインクルードしているafxres.hがみつからないというものでした。
検索してみると、
#include <windows.h>
#define IDC_STATIC (-1)
と書いたafxres.hをカレントディレクトリにおけば解決とかいてありそれで大丈夫でした。
あとはライブラリの名前dplay.libをdplayx.libに修正したらできました。
ありがとうございました。
6 :
3:2008/07/17(木) 14:57:08
該当行というのは
winnt.hの
typedef void * POINTER_64 PVOID64;
のことです。
>該当行の直前に
>#define POINTER_64 __ptr64
>を追加しやりすごすことができました。
winnt.hのバージョンが古かったって落ちはないか?
8 :
3:2008/07/17(木) 18:00:28
>>7さん
winnt.hをみたところBUILD Version: 0091とあります。
フォルダはv6.0A\Includeです。
とりあえず報告まで。
----------------------------------------------------------------------
4 デフォルトの名無しさん [sage] 2008/04/09(水) 15:18:25
マルペケつくろーどっとコム
ttp://marupeke296.com/ ↑これも入れてもいいんじゃね?
てかここ読めば大抵わかるのと、超初心者ターゲットのしつこいくらいの説明がいい
----------------------------------------------------------------------
通りすがりの俺がテンプレ貼るっていったい・・・
前スレの話だけど、自前フォーマット作れないのは
プログラミングの技術っていうより、理論がわかっていないんだと思う
シェーダープログラムで
CommitChangeってやらなくてもシェーダープログラム内のデータは
かわってるけど、これが必要な場面というか
明示的にやらないとダメな理由ってあるのかな?
>>11 だから、理論をわかるための入門としてXファイルは手頃なんじゃないか
RADEON系のビデオチップで
1024x1024のRHW付き2次元テクスチャをある一定以上拡大すると、
マイナス座標の頂点が固定される(それ以上マイナス方向に拡大できなくなる)
ようになってしまうのですが、なにかレンダリング設定等で回避する方法はないでしょうか?
ちなみにnVidia系ではこの現象は出てないです。
開発環境はDirectX9c,Win2k,VC++2005
>>14 それは頂点座標がGuardBand***を超えてるだろう。
ポリゴンを自分でクリッピングすればいい。
>>14 別にRadeonに限った話じゃない。
自分でシザリングすればいいだけの事。
nVIDIAは・・・まぁ中で勝手にやってるんだろうな。
そんな感じで変換済み頂点はハードに影響する部分があるので
変換行列や頂点シェーダでごにょごにょして入力座標値とスクリーン座標値を
一致させるやり方をお勧めするよ。
18 :
14:2008/07/19(土) 13:13:48
>>15-17 回答ありがとうございます。
やっぱり自前でクリッピングしないとだめですか。
回転なしの四角平面ポリゴンならそれも簡単なんですが、
回転が入ると最悪8頂点に分割しなければならないので、
ソフトウェア処理で余計な処理コストが追加されるのが嫌だったのですが。
とりあえず、回転行列を監視して個別に振り分けて処理コストが最低限で済ませる
ようにアルゴリズムを考えてみます。
シザリング面倒なら16x16の格子とかにすりゃいいだけのヤカン
20 :
デフォルトの名無しさん:2008/07/20(日) 18:50:30
>>11 で、それを言って何の参考になる?
マスターベーションでもやってろ、仕様もない糞が。
D3DXMatrixPerspectiveOffCenterLHを使っているんですが
引数のl,r,b,tはどこの値なんですか?
Nearプレーン(zn)での描画する範囲が幅r-l、高さt-bの長方形ということでいいんですか
22 :
デフォルトの名無しさん:2008/07/23(水) 16:52:18
カメラの向きを回転したいのですが、縦の回転が出来ません。どうやったら良いのでしょうか?
横の回転は、
D3DXMATRIXA16 m;
D3DXMatrixIdentity( &m );
D3DXMatrixRotationY( &m, 回転量 );
vDir = vLookAt - vEye;
D3DXVec3TransformCoord( &vDir, &vDir, &m );
vLookAt = vEye + vDir;
で求めています。
D3DXMatrixRotationY( &m, 回転量 );
の部分に
D3DXMatrixRotationX( &m, 回転量 );
D3DXMatrixRotationZ( &m, 回転量 );
を追加しても変な動きになってしまいます。
横回転はY軸を回す。
だったら縦はX軸を回すだろ?
どううまくいかないんだ?
>>23 現在向いている方向が(0,0,1)として。
Xだけで回転すると正面と真後ろを向いている時は上手く行くんだけど、真横を向くと上下に回転しなくなります。
一方Zだけで回転すると、真横は上手く行くけど正面真後ろがダメになります。
そりゃそうだろ。
D3DXVec3TransformCoord()使うとかクォータニオン使うとかでどうか
>>25 何故そうなるのかもD3DXVec3TransformCoordを使うやり方も分かりません
くだすれの方でも同じような質問あったから除いてみ
28 :
22:2008/07/23(水) 22:01:30
調べてみましたがさっぱり分かりません。
XYZと回転マトリクスを1つずつ計算してみたりしましたが、最初よりバグっています。
どう計算したらいいんでしょうか?ソースを書いて貰えると助かります。
根本的に理解できていないなら、その根本的な部分を説明するサイトか書籍を教えてください。
XとZの回転量って個々にちゃんと計算してるの?それが不安
>>28 「一次変換 行列」でググってみて。
メラの行列がわからないって事は、
カメラの行列を作るときに何が起きているかを理解していないって事。
「透視射影行列」あたりでググってみても良い。
行列の本は簡単なので良いから1冊ぐらいは読もうね。
キーワードは「線形代数」ね。
>>28 個人的なお勧め本は 「リアルタイム レンダリング 第2版」
本の内容を一通り理解して頭に入れとけばどけばまず間違いないと思う。
33 :
デフォルトの名無しさん:2008/07/24(木) 12:16:14
>>28 マイクロソフトのフレームワークや書籍のサンプルを筆頭に、何で誰もそのソースを書かないと思う?
xz回転を加えるだけで、ソースが何百行も追加になり複雑になるからだよ。
directxのAPIだけじゃ不可能で、要素を1個ずつsin,cosで計算しないといけないから、行列を根元の部分から理解していないと絶対に作れない。
y軸だけならAPI1行で済む。
そんな簡単にカメラが動いたら、今頃世の中に大作ゲームがわんさか溢れてるよ。
ジンバルロックの問題もあるし、xz回転はしない方がいい。素人にはお勧めしない。
つか
カメラまわしてから注視点きめるんじゃなくて
注視点まわせばええんとちゃう?
視点と注視点の概念がまだわかってないんじゃないだろうか?
いろいろやってみりゃわかってくるね。
でもいきなり数値大きく変えると何がどう影響したのかわかりにくいが。
37 :
28:2008/07/24(木) 20:10:17
レスありがとうございます。
皆さんのおかげで、オイラーは難易度が高いので使わない方が良いということが分かりました。
オイラーを止めてクォータニオンを使うことにしたのですが、今度は回転の補間の説明ばかりで平行移動が分かりません。
http://hikari-hinomoto.hp.infoseek.co.jp/PDF/DX305.pdfにほとんど書いてあるのですが、肝心の部分が書かれていなくて困っています。
void CCamera::Move(const float inFront, const float inUp, const float inRight)
{
// カメラの方向ベクトルを取り出す
D3DXVECTOR3 right(m_View._11, m_View._12, m_View._13);
D3DXVECTOR3 up (※ここは各自考えましょう);
D3DXVECTOR3 front(※ここは各自考えましょう);
// 移動
right *= inRight;
up *= inUp;
front *= inFront;
m_Position += front + up + right;
}
の、ここは各自考えましょうの部分が分かりません。
予想では
m_View._21, m_View._22, m_View._23
m_View._31, m_View._32, m_View._33
ですが、本当に合っているのか分かりません。
これはどこを調べたら分かるのですか?
クォータニオン周りを調べましたが、本のリンクが出てきただけでさっぱり分かりませんでした。
その本も買いましたが、glTranslateを使えばおkとしか書かれていないので、肝心の中身が分かりません。
DirectX版のglTranslateを探せば通るとは思うのですが、理解しないまま進むのも嫌なので。
これはどこをどう調べたら分かるのですか?
>>37 そんなになんにも理解してない状態でそのレベルの理解を要求されても困るw
39 :
37:2008/07/24(木) 20:47:36
自己解決しました。ビュー変換行列を見ていたらありました。
>>38 初心者スレということで、理解できるレベルまでお願いします><
>>39 一次変換の意味はわかる?
行列を掛け合わせることをやるとどういう行列が出来るかはわかる?
行列の積に可換性がないのはなぜかわかる?
クオータニオンと行列の違いはわかる?
透視変換行列の作り方は理解している?
上のことを一つずつ解決していけば出来るようになってるはず。
まあ、そんなとこだよね
まず数学だからなぁ・・・
テキトーにキーワードかき集めてはめてみて→動いた!→OK!
って人間にはならんほうがええぞ
答えを焦り過ぎだ
理解も時間が解決するときがあるべよ
DirectX初心者スレなのでDirectXのことで分からなければいくらでも答えるんだけどねぇ。
行列の意味や仕組みや動作すらわからないのは線形代数の本を抱いて寝てくれとしか言えん。
教えて欲しけりゃ金持ってこいっつーの
つI
つD
つ ミ
I
. . I
(ノ'A`)ノ
( )
, , , , / >
あ、でも正直、この辺って感覚的なもんも大事だから
色んな人の本を読むといいと思う
色んな人の色んな行列の解釈を読んだほうが勉強になると思う
実際、ゲームで使うとなったら
この動きはオイラーのほうがよくてアニメーションはクオータニオンで
この動きはこの座標を中心にして極座標で動かして・・・
って条件分岐の荒らしになるのは仕方ねーことだし
汎用座標系クラスなんて無意味なもん作ろうとするとソースがヤバイ行数になって死ぬw
49 :
デフォルトの名無しさん:2008/07/27(日) 05:33:37
directxとは直接関係なくて悪いのですが・・・
3Dプログラミングを学ぶにあたって、最低限知っておくべき数学・算数を教えて下さい
私頭悪いので、最低限のものでお願いいたします
高校理系卒業レベルは必須
>>49 そんな大きな枠で括られても高校数学まではなんでも食えとしかいいようがない
必要になったら必要な分だけ理解すればいいんじゃない?
とりあえず行列とベクトルが必要なのはわかってるんだから
勉強してみればいいんじゃない?
52 :
デフォルトの名無しさん:2008/07/27(日) 16:27:32
>>51 ありがとうございます
今のところわかっているには、行列・三角関数です
上記2点を理解するためにさらにほかのをやらなきゃならんようですが・・・
わかっているのはっていうのは、なにをやればいいかってことです
理解しているというわけじゃありません
スレ汚しスマヌ
4x4行列演算・空間図形・四元数・三角関数・ベクトル演算
この辺は押さえておくよろし
質問があります。
30〜60枚を1単位としたアニメーションを表示させたいのです。
1フレームに1枚で、60枚で1秒間のアニメーションと考えてください。
このアニメーションが約20〜30種類あります。
問題は、このそれぞれのアニメを「いつ」「どれを」表示するかが決まっていないのです。
とはいえ、こんなに大量の画像データをメモリにおいておくわけにもいかず困っています。
アニメの表示命令が下った時点でそのアニメをリアルタイムに読み込みする
ように組んでみたのですが、(1フレームに1枚ずつ読み出す)
Textureの読み込みが非常に重く、処理落ちが酷くなってしまいます。
何か有効な手段、ごまかし方など、ありませんでしょうか?
ちなみに使用している画像フォーマットはDXT、DirectXのバージョンは9.0cです。
>>55 仕様を聞いてみないとなんとも
アクションゲームのキャラ絵だったら諦めろとしかいいようがないし
ステータス画面のちょっと凝ったサムネイル(アイコン?)だったら
カーソルをロード時間分置いたら表示されるようになってるゲームが多いな
1枚のテクスチャに30〜60枚分の画像を収める
サイズにもよるけど
インタラクティブな場所でないならムービー化
59 :
デフォルトの名無しさん:2008/07/27(日) 21:37:36
すいません 質問させてください
directshowがdirectx9の後半(?)から使用できないっていうんで
しかたなくdirectx8でdirectshowやってるんですが
3dの描画にはdirectx9を使用しています
directx9と8の両方が使用されているゲームをPLAYするには
9,8両方のランタイムが必要になるのでしょうか・・・
教えてくださいm(_ _)m
9のランタイムが入っている=1〜9のランタイムが入っている
1〜9?アホか?
DirectSoundでループ再生を行う場合に再生開始は曲の開始からでも
ループした際は曲の途中から再生したいんですが、こういうのって
やはり、再生が終わった事を検出して自分で再生位置を指定して…っていう
やり方になるんでしょうか?
それともループ再生用のパラメータ等が存在するのでしょうか?
回答どうもありがとうございます。
>>56 ちょっと違うけど、「アクションゲームのキャラ絵」という表現が近いです。
扱いとしてはキャラのモーションとかゲームのエフェクトとかになると思います。
やっぱり諦めるしかないですかねー…
>>57 小さい画像なら、それでいけそうですね。
大きい画像(200x200とか)の場合はどうしようもなさそうですが…
>>58 コーデック必須にしたくないので、たぶん無理かと思われます…
無圧縮にするくらいなら、画像全部メモリに持ってろって話になると思いますし。
>>64 画像を一気に読み込むとして、
どれぐらいのメモリが必要か計算してみると良いよ。
システムメモリで行けそうだったらシステムメモリに確保すればいい。
200x200ピクセル で 60fps、30秒だと 200MB ぐらい。きついね。
ムービーが無難。
無責任なことを書くと、メモリマップドファイルでベタで画像情報をファイルにしておくとか?
出来たとしても速度は出ないと思うけど。
>>64 そういうときは普通ポリゴンモデルを使うんじゃねぇの。
毎フレーム分の画像なんてアホな事普通やら無いぞ。
2Dアクションならせいぜい5フレとかで間引くし。
コーデックが云々いうがWindows95とかターゲットにしない限り
MPEG1が再生できない環境なんてないと思うが。
もろに2Dゲームが無くなった理由そのものだしな
3Dに比べて、使うメモリに対して表現能力が少なすぎる>2D
スパロボのカットインのようなことがやりたい、に100万ペソ
そんとき読み込むので十分だろwあんなのw
スパロボのはおもいっきり解像度落としてるし、
そもそもツール上でキーフレームアニメのエディットしてるだろ。
全フレーム画像もってるわけがねえ。
多数のmeshをマテリアルの設定だけを変えてDrawSubsetしているのですが
描画するmeshの数が1000くらいあってDrawSubsetを一回ずつ呼び出して描画
すると重くなってしまって困っています.
一回のDrawSubsetで一度に描画できたり,あるいはその他の方法で
あまり負荷をかけずに描画するにはどうすればいいか教えてください
>>71 カメラにmeshは全部入るの?
カメラに入らないmeshはちゃんと省けてる?(=視錐台カリングはちゃんとできてる?)
>72
はい.カメラに入るメッシュだけDrawSubsetしてます
74 :
デフォルトの名無しさん:2008/07/29(火) 07:26:32
質問です。
DirectX で描画した上に、ウィンドウコントロール(具体的にはテキストエディット)をおきたいと思っています。
そこで、描画が終わったら必ずウィンドウコントロールも再描画されるように、
下のような感じのメインループを書きました。
for (;;) {
if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
if (msg.message != WM_QUIT) {
TranslateMessage(&msg);
DispatchMessage(&msg);
} else {
break;
}
} else {
Render();
RedrawWindow(コントロールのHWND, NULL, NULL, RDW_INVALIDATE);
}
}
しかし、まだコントロールがちらつくことがあります。
DirectX の描画と WM_PAINT のタイミングの問題のような気がしているんですが、
こういうとき、どの辺をチェックすればいいでしょうか?
75 :
デフォルトの名無しさん:2008/07/29(火) 07:39:09
>>73 それで1000個?
ハードにできないことやろうとしてない?
最適化してやっと動く程度ならやらんほうがいいかもよ
マップチップとかなら一つに纏めるとはやいって聞くけど
それがどのくらいかわからん
なんていうかそもそも仕様がハードに合っているか
っていうのから考えたほうが良さげ
>>73 一つのメッシュは何ポリゴンぐらい?
1フレーム当たりの描画ポリゴン数を計算してみた?
>>73 DrawSubsetというかDrawPrimitiveは非常に重い処理。
流石に1フレームに1000回はかなり無茶なレベルだぞ。
まったく同じモデルを複数表示してるならジオメトリインスタンスを使え。
>>74 GDIとDirect3Dの共存は基本的には無理。
GDIはGDIサーフェスという固定のバックバッファに対してしか描画しないが、
Direct3DのフルスクリーンモードではFlipにより画面に表示されるバッファが
入れ替わり、GDIサーフェス以外のバックバッファが表示されたりする。
ただし、SetDialogBoxMode(TRUE)を使えば一応可能。
ウインドウモード限定なら、WS_CLIPCHILDRENスタイルを指定すれば、
コントロールが上書きされなくなるので再描画も必要ない。
79 :
74:2008/07/29(火) 11:08:32
>>78 ありがとうございます!
WS_CLIPCHILDREN を知りませんでした。ためしてみます。
>>79 全部DirectXで書く方が早いし楽だと思うが・・・
文字描画の方法を知らないからコントロール叩いてるんだろな
デバッグビルドにはd3dx9d.lib、リリースビルドにはd3dx9.libといったようにリンクすると思うのですが、
これはコンパネから変更できるDirectXランタイムのデバッグ/リテールとは関係ないのですか?
リリースする時にはリリースビルドに下上で、ランタイムをリテールにしてビルドしなければいけないのでしょうか?
83 :
デフォルトの名無しさん:2008/07/30(水) 11:20:24
pow2textureとnonpow2の違いってなんなんでしょうか?
84 :
デフォルトの名無しさん:2008/07/30(水) 13:32:32
質問です。
ゲームでログイン時やチャット時などのテキスト入力する箇所って
Win32APIのエディットコントロールを利用してるのでしょうか?
それともDirectX側でそのような機能が用意されてたりするのでしょうか?
SDKのサンプルを調べてみようと思っていたのですが
自分の環境だとサンプルで使う用のプラットフォームSDKの
インストールが上手く行かずコンパイルが出来ず調べ辛く、
そういったUI部分をDirectXで実装する事を詳しく紹介してる
サイト・書籍などあれば教えていただけると助かります。
(「DXUTを使え」とかじゃなしに、SDKを利用した実装方法が知りたい)
自力でキー関係のウィンドウメッセージを処理し、(必要によっては)IMEを呼び出し、文字を描き、
あたかもエディットコントロールかのような動作を実装している
>>77さんの言われているジオメトリインスタンスについて載っているサイト等教えていただけませんか?
探しているのですが、探し方が悪いのか見つかりません。
質問です。
「任意軸による回転」のプログラムってどんな時に使うのが理想なのでしょうか?
実装はできましたが、いまいち面白い使い方がわかりません・・・。
ググってみましたが、調べ方が下手なのか任意軸で回転させる行列の作り方ばかりで
具体的な使用箇所等は見つかりませんでした。
「任意軸による回転」が1つあれば、「X軸の回転」「Y軸の回転」「Z軸の回転」を3つ別々に作らなくて済む
90 :
デフォルトの名無しさん:2008/07/30(水) 17:17:30
メモリ上にあるxファイルのバイナリデータを読み込む関数ってありますか?
D3DXCreateTextureFromFileInMemoryExみたいな感じで
91 :
デフォルトの名無しさん:2008/07/30(水) 17:21:26
( ^ω^)なんというD3DXLoadMeshFromXInMemory
ボールが転がるようなの作るのときに使ったよ
まっすぐ転がすだけならX軸回転だけでいいが、途中で横に転がるなんて場合に便利
93 :
デフォルトの名無しさん:2008/07/30(水) 17:27:23
( ^ω^)D3DXLoadMeshFromXInでググッてでてこなかったからあきらめて質問してしまった、さんくすなり
>>64 ・全アニメーションの前半部分(最初の10フレ分とか)だけをメモリにおいておき、
それを再生中に残りを読む。
・リングバッファでデータを持っておき、1度読みこんだものはしばらく解放しない。
・使用頻度の高いもの、即時応答が必要なもののみを事前ロード
→対戦格闘なら待機モーション+そこから派生する最初の動作のみ。
・圧縮してメモリに置いておく。使用する度に解凍する。
詳しい仕様が解ればもっとネタ出せるかも。
95 :
88:2008/07/30(水) 17:49:25
回答ありがとうございます。
知らないことが多いので非常に参考になります。
>>89 マジですか、現状D3DXMatrixRotationを3回使って行列作ってますから
それだけコスト掛かってるって事になりますね。
やり方はわかりませんが、ちょっと調べてみます。
>>92 まだ任意軸の仕様がきっちりわかっていませんでしたが、
ちょっと考えればなんとなく分かりました。
つまりボールの移動しているベクトルと(0,1,0)のようなベクトルと
外積をとればXZ方向で回転させたい方向のベクトルがとれるってことですね。
なるほど、非常に参考になりました。
えーと・・
>>95 任意軸回転は3軸それぞれ回転するくらいの処理負荷は普通に食うぞ。
それにそこまでやるならもう四元数使え。めんどうくせえ。
>>97 分かりました。
ちょうどそのあたりの本も揃えたので、やってみようと思います。
ありがとう!
>dsound.hのコンパイルが通らないので、どうにかしたい
[環境]WinXP(sp2) VC++2005(pro) DirectXSDK(oct 2006) PlatformSDK(?最新)
[設定]ツール>オプション>VC++ディレクトリ>インクルード、ライブラリ、Bin
の設定をPlatform>DirectXの順にして設定。※DirectXSDKのライブラリはx86を指定
[ソース]
#pragma comment(lib, "dxguid.lib")
#pragma comment(lib, "dsound.lib")
#pragma comment(lib, "winmm.lib")
#include <windows.h>
#include <dsound.h>
int _tmain(int argc, _TCHAR* argv[])
{
return 1;
}
[エラー]
c:\program files\microsoft directx sdk (october 2006)\include\dsound.h(230) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
c:\program files\microsoft directx sdk (october 2006)\include\dsound.h(230) : error C2143: 構文エラー : ';' が '*' の前にありません。
以下省略
エラーの場所:typedef const WAVEFORMATEX *LPCWAVEFORMATEX;
[備考]
mmreg.hでWAVEFORMATEXが宣言されていいて、PlatformSDKに含まれている。
PlatformSDKの設定を失敗している??
参考にしたURL:
ttp://www.cppdrive.jp/vc/sdk/index1.html 上記、問題解決へのヒントなり参考サイトなり紹介していただければと思います。
100 :
74:2008/07/31(木) 07:02:13
>>84 さんとは別人ですが、やりたいことは同じでした。
Win32API を使って文字入力をしているゲームはあんまりないですね。
IME とかを使っていると、変換中の文字が画面の左上にでてきたりするし。
>>85 さんの言うように全部実装するという手もありますが、
IME や右クリックしたときのコンテキストメニュー、
その他もろもろを実装するのはあんまり現実的じゃないかなと。
この辺はユーザビリティにどの程度重きを置くかで選択が変わってくると思います。
101 :
99:2008/07/31(木) 08:20:20
>追記 ※半分解決※
新規プロジェクト>Win32プロジェクト>空のプロジェクト
でプロジェクトを作成するとコンパイルが通ります。
通常のWin32のテンプレート(空のプロジェクトではない場合など)
を使ったプロジェクトでは
>>99 同様エラーが出ます。
>>99 プロジェクトのプロパティで、
Configuration Properties→Advanced→Show Includes
を Yes にしてからコンパイルすると、
インクルードしている順番とかがわかるので、
それでなにかわかるかも。
103 :
99:2008/07/31(木) 09:02:26
>>102 レスサンクスです。
早速やってみたのですが、、、順番として
dsound.hの前にmmreg.hがあるか確認したのですが、、、
そもそもmmreg.hが読み込まれていません、、、orz
>>100 チャットの文字とかそういうのもコピペできるようにしたいの?
IMEの制御と入力中の文字のコピペぐらいで良いと思うんだけどね。
コンテキストメニューは無しで。
>>103 とりあえず、これ入れてみては?
#include <mmsystem.h>
ちょっとやってみたよ。
stdafx.h の中の↓の行、消すかコメントにしてみ
#define WIN32_LEAN_AND_MEAN // Windows ヘッダーから使用されていない部分を除外します。
ってプリコンパイルヘッダ使ってないのか。
まあ、WIN32_LEAN_AND_MEAN のdefineがどっかにあると思うけどな。
108 :
99:2008/07/31(木) 12:38:34
レスサンクスです。
>>105 >#include <mmsystem.h>
なぜか、大量のエラー(88個)が出ました、、、。
[エラー文]
構文エラー : ';' が、識別子 'MMVERSION' の前に必要です。
以下略
[エラー内容 mmystem.h]
typedef UINT MMVERSION;
以下略
>>106 #define WIN32_LEAN_AND_MEAN
を消してみましたが、
>>99 と同様のエラーが発生してダメでした。
みなさんの助言ありがとうございます。
もう少し自力で調べてみます。
あったのか、、
消したらリビルドな
あと空のプロジェクトだとうまくいくって書いてたが、
そのうまくいくやつのwindows.hをincludeする前に
#define WIN32_LEAN_AND_MEAN
してごらん。
111 :
99:2008/07/31(木) 12:46:19
>>109 も、申し訳ありません、、、。
コンパイル通りました。
大変失礼いたしました。
#define WIN32_LEAN_AND_MEAN
についてこれより詳細に調べます。
112 :
99:2008/07/31(木) 13:26:29
レスサンクスです。
>>110 うまくいかないときと同じ症状になりました、、、。
おっしゃるとおり#define WIN32_LEAN_AND_MEANが原因でした。
追記(同じ過ちを繰り返さぬよう)
#define WIN32_LEAN_AND_MEAN
をはずした後に、今まで組んでいた部分と合体したら、
winsock(winsock2.h)関係でエラーがいっぱいでましたが、
stdafx.hでwinsock2.hを読み込ませることで回避できました。
(windows.hより先にwinsock2.hを読ませないといけない)
諸兄のご尽力により、無事解決となりました。
スレ汚し大変失礼いたしました。
>>100 DirectX SDKにあんたのやりたいこと全て、ソースコード付きで入ってるよ。
まぁ、そのままだと微妙に使い物にならないから、少し手直しが必要だが。
>>113 Samples\C++\Direct3D\CustomUI
だね
日本語だと確定するまで違うところに表示されるのはしょうがないのかね
116 :
デフォルトの名無しさん:2008/07/31(木) 16:56:43
>>74 コントロールの位置が分かってるなら
マスクかければいいじゃn
118 :
64:2008/07/31(木) 23:59:47
>>65 200Mだと、メモリに置いてもツライ量ですね…
メモリマップドにしても、結局ディスクから読むので変わらないのかな…
>>66 全くもってその通りなのですが、どうしても2Dでやりたいのです。
MPEG1は検討してみます。ありがとうございました。
>>94 色々とありがとうございます。
リングバッファは試してみる価値があると思います。
前半だけメモリにおいておくのは、結局止まってしまうので
メモリも食うし、中途半端になってしまうかも…
圧縮もありかもしれませんね。
ディスクから読み込むのと、展開するのとどっちが重いかにもよりますが…
詳しい仕様は…そうですね、エフェクトに使うと思ってもらえればいいと思います。
1〜2秒のエフェクトが30個ほどあり、どれがいつ必要になるかわからないという状況です。
(実際には少し違いますが)
色々試したところ、どうも重くなるのは初回のみなので、あらかじめ確保→開放して
キャッシュにいれておくなんて手法もありかもしれません。
(問題は人によってキャッシュの大きさがまちまちな点ですが…)
家庭用機でもメモリに置いといて解凍してVRAMに展開とかはやると思う
この場合はCPUの速度が固定なのでやりやすいとは思うんだが
それでもPCから比べればかなり貧弱でも十分に出来ると思う
もちろんPCの場合はどんなCPUつんでるかは不明だから間に合わないってケースも出てくるだろうけど
それでも大よそのケースで間に合うと思うけどな
どんな絵かはわからんが、20%ぐらいの圧縮率とかにはなるんじゃね?
エフェクトに使うってことで非可逆でも構わないならそれこそかなり圧縮できると思う
エフェクトならそれこそ3Dで作って2Dで描画しろよ、ってレベルだな
とりあえず 30fps にするんだ。メモリ消費は半分だ。
>>120 2Dエフェクトを作るツールの使い勝手の良さ考えると
それと同じレベルのを3Dで作るにはかなり敷居高いと思うが
>>122 似たようなもんだろ
はじめの選択ミスがひきづってるだけの話でしょ?
次はきっと彼もうまくやれるさ
>>122 結果的にそれ以上の苦労を実機側でしているのだから意味がない
エフェクト作ってるのが自分じゃなければ
その苦労は単純に比較できないんでは?
見てる限りだと圧縮で解決する感じがするけど
いいたくはないけど、仕様のミスだよ、明らかに。
メモリをちゃんと計算しなかったのが原因。
127 :
94:2008/08/02(土) 10:09:14
なんていうか、お題だけを考えれば
「大容量のアニメーションをスムーズに再生するには?」
というだけなのに、設計とかを否定するのはどうかと思う。
仕事でゲーム開発してれば、こんな難関はいくらでもやってくる。その度に
プログラマーの強権発動して「仕様的に無理」っていきなり言っちゃうのは
怠慢だと思う。(そして、ある日隣のプログラマーに「○○すれば簡単にできますよ♪」
とか言われて肩身が狭くなっちゃう。)まずは色々考えてみようよ。
どれかで上手くいくかもしれないし。まぁ仕事じゃないけどさw
個人的には
>>119の意見を支持。不可逆で圧縮が可能なら楽にいけそう。
ってかこんな展開シェーダー誰かが作ってそう。
キャッシュに頼るなら、事前にその場では使わないヤツを全部解放しておくと
ちょっと親切かも。
WMVの7ならXP以降は標準搭載されているし、
DVD並の画質なら展開しつつテクスチャに転送しつつ再生しても、
CeleronM程度の型落ちCPUでも問題なく動くが、
お前らはいったい何を気にしているんだ?
アルファ抜きとかかな
>>127 でも、会社の職場で
「3Dでやってればもっとたくさん表現できたよね?」
って言われたらどういいわけするの?
いっとくけどデザイナさんにとっては3Dで作ろうが2D作ろうが
あんまり労力は変わらないかもしれないよ
こんなことも提示できないでデザイナさんにひたすら作らせた後
「ごめんなさい、やっぱこの仕様だときついかもしれません」
とかいうの?
こんな不安要素を抱えてしまうぐらいなら安全策をとるべきでしょ
趣味でやってるなら自由にやればいいと思うけど
会社でやったら恨まれますよ〜(みんな表だっては言わないけどねw)
131 :
94:2008/08/02(土) 11:32:46
>>130 それはプログラマーとして提言しても決定することはないんじゃない?
表現の仕方や方向性はデザイナーや企画が決めるんではないかと。
会社によって方針(力関係w)が違うだろうから解んないけど。
>>130の言いたいことは良く解る。リスクを抱える開発はプログラマーとしては褒められない。
しかしながら、やりたい事はそれに矛盾する。
「では、できるかどうか検証してみましょう。」
というのが今この場ではないかと、勝手に思ってるんだけども。
もちろん「できない。」と迅速に判断して次にいくのもあり。
「いやいや、方法はあるんでない?」というのが俺の意見。
判断は難しいけどねw
>>131 そう?
他のゲームはどうなってんだろ?
って解析できるのもプログラマだけだと思うけどね
エフェクトがいるアクション・イベントを3〜4に絞る仕様だってできるわけじゃない?(テイルズ方式)
こんな無理目なことに時間かけてそれに対するリターンはどれほどよ?
って相談までしたんかどうなんか気になるが
まあ、「やってみるけど時間くれる?」まで言ってるならなにもいうべきことはないな
存分に研究してみろ
ただ、決断はしなきゃいけないな
無理なら無理でしっかりいうんだぜ
(もちろんこの期間でこれこれこんなことを試してみたんですけど
試してみた範囲ではこの仕様は実現できませんでした。的なことが必要だ)
と初心者スレだし言ってみるテスト
やる前に、かかる工数を見積もって(難しいだろうけど)
予算と相談しないとな
今回の内容は見積もりがどうこう言うほど難しい作業じゃないぞ。
どれだけ技能が低いんだよ。
そういう考えがスケジュールの遅延を招く。
たとえどんなものでも仕事として発生するなら
ちゃんとスケジュールに組み込んで管理するのが基本。
能力が低いと見積もりが積もり積もって大変だよな。
比較対象で出ている、3Dでエフェクト作るっていうのは具体的にはどうやればいいのでしょうか?
モデルにモーション付けてもらってそれを再生するという感じ?
例えば爆発のエフェクトであれば、炎や火の粉をアニメ付きのモデルで大量に表示とかになるのでしょうか?
能力の高さとスケジュール管理は別のスキルだろう。
仕事が溢れそうならマネージャーに相談して溢れる分を他に振るなり増員なりで解決する。
ギリギリになってからやっぱり終わりませんとか言ってきたらマジで回し蹴りだ。
>>137 ビルボード/パーティクル等など
いくらなんでも1個1個モデル表示なんてしないぞ。
ビルボードやパーティクルで作るというのは、そういうツールみたいなのがあるのでしょうか?
そういうツールを作ればよい
そのツールを作ってデザイナーに使いこなしてもらう手間考えれば・・
とか思ったけど、もしかしてどこでも当たり前にそういうことやってて今更議論するような程でもないってぐらいのことだったりしますか?
初心者質問スレという意味合いではそんなツール作れるかよ!
プロと言う意味ではPG的にはその程度のツールもないのかよ!
デザイナー的にはその程度のツールも使えないヤツはいらない。
そして多くの開発ではコンバータを作成し、
バージョン互換を恐れて古いツールを使い続ける。。。
>>142 仕様はよく考えられてても、UIがコマンドラインだったり、
フォーマットの変更まで考えました、とかいって、
死ぬほど使いづらいツールを作ってきたりする奴もいるからな。
そして、そういうツールに限って不安定。ちょっとテキストファイルに
ゴミ文字が入ってただけで落ちたりしてな。
>>144 それはツールを作る人間の技量の問題。
その程度のヤツにツールを作らせる人的リソースの不足も問題。
とりあえずUndoがないツールは糞
は?んなツール作らなくてもとりあえず
デザイナさんがモデリングした通りに出してみたらどうよ?
適当にボーン入れてアニメーションさせたモデルを加算半透明ではってみりゃ
立派なエフェクトのできあがりっしょ
何に手間かけようとしてんだ
こういうところからプラグイン使えたら便利かなとかそういう考えが浮かんでくるんだぜ
モデリングツールでできることは極限まで活かせよ
まずは、モデルをアニメーションさせるところから説明しないと駄目なほど馬鹿でもないだろ?
こんなところに手間かけてるからお前等苦労ばっかりしてろくなゲーム作れないんだぞ
モデルでエフェクト作るのも結構手間だと思うけど
既存の2D系のエフェクト作成ツールでエフェクト作って
それ表示って方のがある程度のレベルまでは時間もかからずに合理的だと思うんだが
個人で作ったショボイツールなんぞよりも何倍も良いものできると思うぞ
最終的に出来ることが3D>2Dだとしても
そこまで行かなければ、使いやすいツールのある環境のがいいものできると思う
それに気の利いたパーティクルツールなんてどこにでもあるようなものとは思えないが
上で出てた爆発みたいなのって爆発のパターン絵描きが書いてプログラマが適当に飛ばして終わりってのが多いんじゃね?
その上で初心者スレってこと踏まえれば
この方法って間違いとかとは全然思えないんだが
>>142 デザイナーにとっては使いこなすに値するツールかどうかだろう
これはプログラマーの次第だと思う
>>148 3Dで爆発なんてそれっぽいもやもやを拡縮するだけで終わりってのも考えられるんじゃね?
しかもそれはモデリングのアニメーションで設定できる話で
プログラマはそれを再生すれば終わりでしょ?
だからこれはアニメーションモデルの再生でしかないと思うんだけど?
3Dの何が手間なの?
勝手な想像で手間だと思ってるだけじゃない?
>>149 旧世代のキノコの成長の早回しです、
みたいなドン臭い爆発だったらプログラマーの負荷は少ないけど、
パーティクルを使って云々ってやってると結構めんどくさいよ。
>>150 そうか?
それもモデリングツールにちょちょっと細工して
モデルのアニメーションで出るようにしたら終いな話でしょ?
3Dで苦しくなるような想定ばっかしててもしょうがないと思うんだけど?
まぁゲーム内容次第だべ。
CoD4の手榴弾みたいなリアルな爆発が欲しい時と
GCのゼルダみたいなアニメ調のが欲しい時では話が違うんだし。
大抵モデリングツールからの出力をそのままだしゃいいのに
くっだらないイレギュラー想定して発言を潰す作戦ですか?
それらのやり方にパーティクルイリュージョンほどの使い勝手があるとは思えないんだけど
>>151 パーティクルやったこと無いんじゃない?
>>155 あるある
うちのモデリングツールのプラグインに吐き出す奴あるもん
テクスチャアニメーションで粒子を表現するタイプと
頂点シェーダで吐き出してくれるタイプがあるよ
どっちもモデルのアニメーション扱いでいけるようになってる
手間がかからず実装できるとかじゃなくて会社にあるツール自慢を初心者スレでされても・・・
市販のツールを使うのが一番簡単なわけだが
それぞれの環境を試したこと無い人達が自分達の方が楽とかいうのはどうなの?
2Dやってる人は、モデルデータからエフェクト作ってみなよ
3Dやってる人は、パーティクルイリュージョンとか使ってみなよ
>>159 ないならないで仕様を固定すればやりようはいかようにもある
ただ、その方法を挙げても別のイレギュラー的例を挙げて
そういう案を潰すことばっかりさっきからしてるじゃん
それじゃなんにも進まんと思うのよね
だから2Dで全部アニメーション・・・みたいな馬鹿な選択肢を選んじゃうわけでさ
もっと現実的な話を考えたらぶっちゃけ3Dしか道はないのは誰の目にも明らかで
2Dゲーがなくなっちゃった理由はまさにメモリ使用量に対する表現力の貧弱さなので
あってこんなところ問題じゃないように思うんだけどどう?
だからこういう問題にぶち当たる前にするべきなのは技術的な話じゃなくて
あくまでも仕様の固定化なんだよね
ってのはもうずいぶん前に学習した
どんな開発であっても汎用ツールを作ってはならない
まずこういう問題にぶちあたってしまったら
その時点ですでにゲームオーバーな状態にあるわけで手遅れなんだよね
プログラマとしての腕を見せる前にこういう問題を起こしてしまうプログラマってのは
社会人としてすでに駄目な場合が多い
作るときにたくさん疑問がでて細かい警告をいくつも見つけてたのにも関わらず
誰にも相談しないで勝手に想定して勝手に自爆してしまっているんだよね
って初心者スレで過去の自分を振り返って語ってるテスト
>>160 いや勝手に色々と決め付けてその案を潰そうとしてるのはお前の方だと思うんだ
それに対して2Dって選択肢は間違いでもないだろって話であって
今回のだって圧縮のやりようで許容範囲でしょ
時間も金も無限にあるわけじゃないんだから、必ずしも毎回ベスト目指せるような環境とは限らん
あーこれ駄目だよな、とか思いながら騙し騙しやっていくもんじゃないだろうか?
今時ならGPGPUでデータのリアルタイム解凍しながら描画とか出来るしな。
>>156 テクスチャアニメーションで粒子を表現って普通のパラパラアニメじゃないの?
頂点シェーダではき出すって、頂点シェーダのプログラムをはき出すの?
>>164 GPU 周りが GPGPU を使えるほど余裕があるようなシチュエーションってそんなにあるか?
>>166 3Dゲームだとぶっちゃけない。
ただ2Dでパラパラアニメするって言ってるんだから
殆どGPU使わないような2Dゲーなのかと思っただけ。
>>162 >今回のだって圧縮のやりようで許容範囲でしょ
じゃ、やれば?
ただ、3Dだったらもっとよくなったかもねw
169 :
64:2008/08/04(月) 03:41:04
ものすごい議論が進んでしまっているようで
なんだか割り込んでしまう形になってしまうのですが、一応報告を…
あ、ちなみに今回のは学校の友達と一緒に作っているようなレベルで
高価な機材やソフトとかも全然無い状況なのです。
なので締切りも無く、時間が限られてるわけでもなかったりします。
なので、とりあえず3Dでやってみることにしました。
今までDirectDrawしか触ってなかったもので、3Dには正直疎いのですが
これを機に勉強してみることにしました。
圧縮やフレーム数の削減なども考えたのですが、
これを機に3Dにも手を出してみることにします。
(アニメ調のものもあるので、表現しきれるかはわかりませんが…)
相談に乗ってくださってありがとうございました!
お互い相手の良い所が見えてない生き物が自己主張してるだけなので
この話題はこの後もグダグダ続く。
適当に教わったことにして話題を切り上げた
>>64は優秀。
切り上げたのに余計な蛇足つけんでも(笑)
directXで背景が3Dの2DSTGを作ろうと思ってるんですが。
DXライブラリの様にクライアント領域左上が(0,0)で座標の管理がしたいんですが
どういった関数郡を使えば良いんでしょうか。
DXライブラリとdirectXの両方で使おうとおもってDXライブラリの設定にしたら
directXでプログラムしたところがエラー吐いてどうすればいいのか。
DXライブラリで出来るということは元のdirectXで出来ると考えて良いんですよね?
どなたか助言頂けると幸いです。
3D描画も左上(0,0)にしたいのか?
2D描画のみでいいなら楽だが
レスありがとうございます。
3Dの部分を描画した後2D部分を描画すれば問題なさそうなので
2D部分のみでも良い方法があったら是非教えて頂きたいです。
関数群ってよりかカメラの設定かな。
DirectXならD3DXMatrixOrthoOffCenterLHを使うと、
物体を遠くに置いても小さくならない。座標を2D画面の様に使える。
詳しく知らないけどDXライブラリで出来ることはDirectXでできると考えて問題いと思うよ。
ただ、共存はどうだろう?俺がライブラリ作者なら勝手に内部数値変えといて後でバグ報告されるとたまらんから、
非推奨、自己責任でってするけど。
射影行列変換に
D3DXMatrixOrthoLHを使う(引数wとhはウインドウサイズ)
座標変換済み頂点の板ポリで2D描画する
DXライブラリは使ったことがないので知らんが、
3D座標上の特定の奥行きをスクリーン座標に合わせるのであれば、
奥行きと視野角から行列を逆算すればいい。
おお、こんなにレスが、、ありがとうございます。
カメラの
D3DXMatrixLookAtLH を D3DXMatrixOrthoOffCenterLHに
射影変換の
D3DXMatrixPerspectiveFovLH を D3DXMatrixOrthoLHにでいいんでしょうか?
とりあえずやってみたら板ポリゴンも何も表示されなくなってしまいました。
とりあえず該当箇所は現状こんな感じでプログラムしてました。
//ビューマトリックスの設定
VOID ViewMatrix(LPDIRECT3DDEVICE9 theDevice) {
D3DVIEWPORT9 vp;
if(FAILED(theDevice->GetViewport(&vp))) {
return;
}
// アスペクト比の計算
float aspect;
aspect = (float)vp.Width / (float)vp.Height;
// 初期化
D3DXMatrixIdentity(&m_proj);
// 射影マトリックスを作成
D3DXMatrixPerspectiveFovLH(&m_proj,
D3DXToRadian(45.0f), // カメラの画角
aspect, // アスペクト比
1.0f, // nearプレーン
1000.0f); // farプレーン
//ここにD3DXMatrixOrthoLH(&m_proj,640,480,0,0);?
// マトリックスをレンダリングパイプラインに設定
theDevice->SetTransform(D3DTS_PROJECTION, &m_proj);
}
//カメラの設定
VOID Camera(LPDIRECT3DDEVICE9 theDevice) {
D3DXMatrixIdentity(&m_view);
D3DXMatrixLookAtLH(&m_view, &D3DXVECTOR3(0.0f, 0.0f, -50.0f),
&D3DXVECTOR3(0.0f, 0.0f, 0.0f),
&D3DXVECTOR3(0.0f, 1.0f, 0.0f));
//ここにD3DXMatrixOrthoOffCenterLH(&m_view,0,640,0,480,0,0);?
theDevice->SetTransform(D3DTS_VIEW, &m_view);
}
D3DXMatrixLookAtLHは変えなくていい
D3DXMatrixOrthoLHにnearプレーンとfarプレーンが設定されてない
D3DXMatrixOrthoLH(&m_proj,640,480,1,1000);
出来ました、この場合だと中心が0.0になるんですね。
でもこれでかなり理想に近い状態になりました。
本当にありがとうございました、皆様に追いつけるよう頑張ります、、、
だから座標変換済み頂点を使えと
D3DFVF_XYZRHWか
D3DDECLUSAGE_POSITIONTでぐぐれ
WinXPで(D3D10を使用しないで)、最新GPUのリソースをフルに使うには
どういう選択肢がある?
nVidiaならCUDA?
ATiは?
directXのカメラの原点を一時的に移動するにはどうしたらいいでしょうか。
(0,0,0)にある原点を(30,0,0)に移動して描画した後また(0,0,0)に戻したりしたいのですが。
186 :
185:2008/08/06(水) 16:23:08
文字通りカメラの原点を移動して戻せばいいんじゃね?
そのやり方がわからなかったんですけど、うんこしてる間に自己解決しました。
>>184 ビデオカード毎に全部作る気概があるの?
そうでないならシェーダーでよくね?
GPUの性能をフルに引き出すのが目的なのか、
何らかの目的のためにGPU性能を引き出したいのか・・
GPUの性能なんて、フルに引き出したら発熱量が増えるだけじゃん。
ちょっと疑問なんですが。
winapiのタイマーで10mscに1回WM_TIMERを送ってrenderを呼んでるんですが
10mscの間にrenderの処理が終わらなかったら処理はどうなるんでしょうか?
処理ののコマ抜けみたいなのが起きたりするんじゃないかと不安なんですが。
変数ループで1から100の間の50ループ目だけ飛んだり。
ちなみにリフレッシュレートはD3DPRESENT_RATE_DEFAULTで固定してます。
これってリフレッシュレートに合わせて描画してると考えて良いんですよね?
だとすると尚更メッセージループとの誤差が生じるんでは内科と心配なのです。
処理し終わってから次のWM_TIMERが来る
タイマーが10msに一度やってくるとでも思ってるのだろうか
サンタが街にやってきた
CとC++の勉強が一通り終わったのでDirectXのグラフィックについて勉強しようと思うのですが
WIN32APIを極めないで勉強するのは無謀ですか?
少しだけ勉強したのでWIN32APIの基礎ならわかります。
>>196 極めてる人はそういないと思うよ
いつまでたってもヘルプ見ながら書いている俺
窓開いてHelloWorld出せる程度でとりあえずは十分
>>197 >>198 なるほど〜。
C言語に比べて覚えることが多すぎてちょっとびっくりしていましたw
アドバイスありがとうございました!
>>199 そりゃぁあんた、「日常会話を英語でする」のと「代数幾何を英語で学ぶ」のとででは必要な知識が桁違いに決まっているだろ。
201 :
デフォルトの名無しさん:2008/08/09(土) 14:56:11
独自フォーマットの3Dモデルデータを描画しようとしています。
1つのメッシュで2つ以上の物体が離れて存在する場合、
D3DPT_TRIANGLESTRIPの設定で1回で描画するのは無理なのでしょうか。
エラーが出るわけでは無いのですが、物体が離れているメッシュを描画すると1つの三角形が橋渡しのように表示されます。
D3DPT_TRIANGLELISTだと必要な頂点数がかなり増えるため使用は控えたいです。
Xファイルでは1つのメッシュをDrawSubsetで描画できていますし、頂点の並び方に法則があったりでもするのでしょうか。
そうなるように頂点データを構築すればいい。以上。
ちなみにDrawSubset()は中でD3DPT_TRIANGLELISTを使ってDrawIndexedPrimitive()を呼んでいる。
縮退三角形でググってみ。
>D3DPT_TRIANGLELISTだと必要な頂点数がかなり増えるため使用は控えたいです。
なんでインデックスを使わずに、効率の悪い方法を選ぶんだ?
インデックスにしてもストリップのほうが3分の2から半分ぐらいになるから自前ならストリップにするほうがいいけどね。
別に数kb増えたところでどうってことはないけど物量で勝負するアプリなら恩恵は受けられるんじゃないかな。
nVIDIA先生も言ってるがキャッシュ効率を考えたら最速はリストだろう。
いやTRIANGLELISTと比べてってことでしょ
どうでもいい話だが。
速度や効率を考えたらどう考えてもストリップの出番はない
確かにな
踊り終わるまで待ってるのダルイ・・・・
あれ。インディックスのストリップってないんだっけ?
あるけどインデックス使うならリスト使った方がいいだろ。
場合によりけりだけど複数描画するならリストで1回ならストリップのほうがいいかな。
検証用の単純なものであればリストが有利だけど
かなり組みあがっているアプリの所々ストリップに直したらCPU/GPU負荷が平均で5%ほど下がった。
自作のスキンメッシュデータをインデックスのストリップとリストに相互変換するプログラムを組んでみたが、
リストの方が確実にFPSが上昇した。
215 :
デフォルトの名無しさん:2008/08/10(日) 12:01:25
名前が緑になるんですが 青にはどうすればなれますか?
光の波長を変える
>>213,214
モデルの形状も影響するんじゃなかろうか。
ストリップをぶつ切りにする必要のある形状だと当然効果は薄いし、
なるべく法線の近いもの同士でストリップを繋ぐと、
陰面消去の時に効率が上がる場合がある。
メッシュでどこまでやってくれているか解らないけど、
ストリップを繋ぐアルゴリズムって奥が深いらしい。
奥が深いというより本気で最適化しようとするとロジックが複雑になるというだけの話。
そんな状況でメリットが全く見えない。
縮退なしで書けるなんて状況まずないからな。
いちいち反転するからCPUでコリジョンとる時とか面倒だし。
そもそもモデリングデータをストリップで吐き出すデータ形式を見たことがない。
データを読み込んだ後にわざわざストリップに変換しているライブラリを見たことがない。
ちまたで見かけるのは平面を書くだけの単純なサンプルで、
インデックスを使わずにストリップのみで構成している、
まともに組むときには書かないようなダメソースぐらい。
半透明とかストリップだときつそうだし、いろいろ細かい部分が面倒。
UVの割れとかも考えると、効率的にもそんなに変わらない気がする。
のっぺりテクスチャ無しの球でテストしてるときとは違うし。
インデックスリストはGPUの頂点キャッシュアルゴリズム依存という問題はあるが、
淘汰されて4社しか残ってない今となってはどうでもいいな。
>>222 GPUの頂点キャッシュアルゴリズム依存度よりも、
ユーザーの財布依存度の方が高いから。
バックバッファについて教えてください。
1.アプリ毎に専用のバックバッファを持つんですか?
2.窓モードのバックバッファのウィンドウ外の領域は何も描画されていないんですか?窓サイズ変更時にバックバッファサイズも変更される?
3.窓モードで、ディスプレイに表示されている画像は全てのバックバッファを重ねたものと言うことですか?
ちょっと描画するくらいなら既存のバックバッファ使った方が良い?
新しいバックバッファを追加するコストが知りたい
効率なんて実装方法によって子となるんだから、自分で作って最適解を見つけろよ。
知りたいなら試せ。
>>224 1.そうだ
2.そうだ
3.違う 1つだけだ
>>225 そうだ
バックバッファいじらないならデフォのまま使うんだ
>>224 アプリ毎に持ちます
バックバッファの大きさは任意です。窓の大きさとは関連しません。
まぁデフォルトの窓の大きさ(たとえばゲームなら640x480とかね)と一致させるのが一般的。
窓の大きさを変えるたびにバックバッファの大きさを変えるのはあまりないんじゃないかね
窓が大きくなったら、バックバッファから窓への転送時に拡大する
ディスプレイも1つバックバッファを持っている。
アプリが自分の窓へ描画=ディスプレイのバックバッファへの描画
ツールとかでドラッグで大きさ自在に変えるような場合は
デスクトップと同じサイズで作って窓の大きさ分を左上に描画して使ってるな。
サイズが変わるたびに作り直すのは流石に無茶。
スタート画面にクリックしたらそれぞれのシーンへ飛ぶボタンを表示させたいのですが
何か良い方法は無いでしょうか?
スタート画面をクリックする前はボタンを描画しないで、
スタート画面をクリックした後はボタンを描画すればよい
スレの主旨から言ってDirectXで、という話だと思うけど
DXUTが一番楽なのでは。
後はイルリヒトとかコンポーネントっぽいのが入ってた気がする。
ダイアログを置いてオーナードローでDirectX描画っつー手もあるけど
多分、面倒臭いと思う。
質問です
スペースキーを押したらゲーム本体が始まる様にしたいのですが
実行するとキーの状態を取得せずにいきなりゲーム本体が始まってしまいます
どうすれば最初にスタート画面を表示し続けれるのでしょうか?
スタート画面処理
{
if ( GetAsyncKeyState(VK_SPACE) & 0x8000 ){
スタート画面を描画する
}
}
while(1){
if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{
〜略〜
}else{
スタート画面処理
ゲーム本体
Sleep(1);
}
}
何と言う糞設計
DirectX関係ないし
235 :
233:2008/08/19(火) 10:23:26
いやでもDirectX以前の話。
そこまでひどいとどこから説明していいのか途方にくれるわ。
237 :
233:2008/08/19(火) 10:33:45
なんだよ つかえねーな
if ( GetAsyncKeyState(VK_SPACE) & 0x8000 ) なの?
アドバイスのしようがないほどのソースは久しぶりに見た。
まずはメインループを書ける様になってからだ。
「DirectXゲームグラフィックスプログラミング」の他にDirectXの基礎事項を勉強できるおすすめの本はありますか?
if ( (GetAsyncKeyState(VK_SPACE) & 0x8000) == 0 ) でイインジャネ?
入力待ちしないものでいくら判断したって押されてなけりゃそのまま通過するだけだろうが。
243 :
デフォルトの名無しさん:2008/08/20(水) 15:43:01
if (GetAsyncKeyState(VK_SPACE) & 0x8000)
else if ( (GetAsyncKeyState(VK_SPACE) & 0x8000) == 0 )
ひどいソースわろた
常にスペース押しとけばいつか動くさ
DirectShowの質問です。
ムービーの動画をテクスチャに移して加工した上で表示させたいと思い、
ネット上のサンプルを読み漁ってとりあえず組んでみたのですが
以下の疑問点が発生しました。
どなたかわかる方が居ましたら、答えていただければありがたいです。
1. ムービーファイルの画像を「1枚ずつ」「任意のタイミングで」取得する方法はありますか?
現在のコードでは、DirectDrawに再生させておいて
描画時にテクスチャを取得して再生する、という構造になっています。
おそらく別のスレッドで再生させているのだとは思いますが
このシステムでは、負荷でメインスレッドのFPSが落ちた場合などに
当然ながら同期のズレが発生してしまいます。
(動画とメインループのフレームの比率が変化してしまうため)
アプリ側から任意のタイミングでフレームを進めることはできますでしょうか?
2. 実際に再生させるルーチンまでは作れたのですが
動画ファイルの読み込みに250msほど時間がかかってしまいます。
特にIGraphBuilderのRenderFileメソッドが非常に重く、
ここだけで200ms持って行かれてしまいます。
これはムービーファイルを再生する上で回避できない時間なのでしょうか?
ちなみに、ムービー形式はサンプルに沿ってwmvを使用しています。
DirectShowというと、マイナーでネット上のサンプルも少ないというイメージで
触っている人が少ないかもしれないかと思うのですが、わかる方が居ましたら
よろしくお願いいたします。
ここまで書いてふと思ったのですが、
DirectShowなどに頼らずに自分で動画をデコードするような
コードを書いたほうが早いのでしょうか…
再生する形式はwmvなりmpegなり1形式に絞れるので。
ム板かマ板にDirectShowと戦うスレがあったはず
DirectShowがDirectXから切り離されてひさしいので
そっちで聞いたほうがいいかと
ありがとうございます。
この板にDirectShowと戦うスレ Part 4というスレがあったので
そちらで再度質問してみることにします。
テクスチャフィルタをポイントに設定するにはどうすれば良いでしょうか?
現状はバイリニアのかかったような少しぼけた画像が
表示されてしまいます。
SetSamplerStateでポイントサンプリングに設定しても変わりませんでした
交差している半透明のポリゴンを正しく表示するにはどうしたら良いでしょうか?
交線でポリゴンを切り分ければ良し
253 :
デフォルトの名無しさん:2008/08/24(日) 23:59:52
質問いいですか?テクスチャのピクセルを取得しようとしています。
D3DXCreateTextureFromFileEx(
pd3dDevice, L"pattern.bmp", 64, 64, 1, D3DUSAGE_DYNAMIC, D3DFMT_X8R8G8B8,
D3DPOOL_SYSTEMMEM, D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL, &texPattern);
// テクスチャ情報取得
D3DSURFACE_DESC desc;
texPattern->GetLevelDesc(0, &desc);
// テクスチャをロック
D3DLOCKED_RECT lockrect;
texPattern->LockRect(0, &lockrect, NULL, 0);
DWORD* ptr = (DWORD*)lockrect.pBits;
DWORD pixel_color=0x0;
short getx=10;//取得したいピクセル
short gety=10;//取得したいピクセル
254 :
デフォルトの名無しさん:2008/08/25(月) 00:00:10
if (0<=x && x<(short)desc.Width){
if (0<=y && y<(short)desc.Height){
pixel_color=ptr[getx+gety*(short)desc.Height];
}
}
texPattern->UnlockRect(0);
short color_r=(pixel_color
>>16)&0xFF;
short color_g=(pixel_color>> 8)&0xFF;
short color_b=(pixel_color )&0xFF;
上のプログラムで正確な色が取得できません。
指定するピクセルによって違う値が返ってきているので、
きちんとテクスチャを参照してはいると思うのですが。
どうか教えてください。よろしくお願いします。
pixel_color=ptr[getx+gety*(short)desc.Height];
これを直すといいかもしれない
うそいったらごめん
>>253 サーフェスの横幅は、D3DLOCKED_RECT構造体のPitchを参照しないと駄目。
パディングでdesc.Widthと一致しない場合がある。
つーか、desc.Height掛けてどうするよ。
>>255 具体的にどう直せばいいのか教えてもらえると助かります。
>>256 Pitchのほうですか?
あれは余計なところまで含めたものらしいんで使えないはずです。
試してもらえばわかりますが、Pitchのところまで表示させるとゴミが出ますよ。
>>257 yは縦ですからHeightでしょう、高さという意味ですし。
DirectX以前だな。
・ぼーるがたてに5つよこに4つならんでいます。
・ぼーるをひだりうえからいちだんずつよこにじゅんばんにばんごうをつけることにしました。
・いちばんひだりうえが0で、いちばんみぎうえが3です。
・みぎはしまできたのでいちだんさがってつぎのだんのひだりはしが4になります。
・いかどうようにばんごうをつけるといちばんみぎしたは19になります。
さて、ひだりから0からかぞえて2ばんめ、うえから0からかぞえて3ばんめのぼーるはなんばんでしょうか。
けいさんしきがわからなかったら、えにかいてみるといいですよ。
Q. 3Dプログラミングに行列等、数学の知識は必要か
A. 掛け算程度は出来ないとお話になりません
>258
算数からやり直せ
正方形ならうまくいったのになw
>>258は質問者を騙った釣りだろう
sageてるし
内容があからさまに釣りだし
質問です
布シミュに手を出して満足のいくものができたので、次は髪の毛にいこうかと思っています。
布シミュは「布シミュ」や「クロスシミュレーション」でうまく資料を探せたのですが、髪の毛はうまく資料をぐぐれません。
何か良いキーワードか、ページを教えていただけないでしょうか
よろしくお願いします
3DのRPGを作ろうと思っているのでDirectXを勉強しようと思ったのですが
数学や物理の知識が必要と聞いたので
三角関数・ベクトル・行列を一通り勉強したのですが
他にやっておいたほうがいい分野はありますか?
ゲーム開発のための数理学物理学入門は一通り理解しました
RPGってどんなのを作るつもりかわからんけど
3Dの知識以前にゲーム製作の総合的な知識が必要になると思うぞ
3Dの部分についてはとりあえず作り始めちゃって問題が出たらその都度調べればいいと思う
質問があります。
ATL/WTLにてDirectXを扱うにはどの様にしたらよいのでしょうか
クライアント領域を別のビュークラスで定義しサブクラス化しており、色々調べたところ
ビュークラスのHWNDを渡してしまうとCreateDeviceが通らないためウィンドウのHWNDで初期化し、
Render関数にて引数にCDC*を取り
LPDIRECT3DSURFACE9 pSuf = NULL;
m_pd3dDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&pSuf);
上記でバックバッファを取得し、
pSuf->GetDC(pdc->m_hDC);
とビューのHDCとバックバッファのHDCを関連づける方法にたどり着いたのですが、
Clearすら通りません。
問題のあるところを指摘していただけないでしょうか。
269 :
デフォルトの名無しさん:2008/08/25(月) 23:07:25
最強の同人ソフトウエアーを作るにはどのグラボを買えばOKでしょうか?
>269
Intelのオンボード
>268
>ビュークラスのHWNDを渡してしまうとCreateDeviceが通らないため
普通に通るぞ
あれ、ほんとだ。
初期化関数に渡すハンドルをクライアントのに変えただけであっさり通りました
むしろ何故以前は通らなかったのか……
いずれにせよ前に進めました。ありがとうございます。
DirectX9.0cなのに「診断ツール」がありません・・・
どうやったらdxdiag.exeをインストールできますか?
dxdiag.exeはDirectXのドライバ入れたら(=ビデオカードがあれば)
Windowsに入ってると思うが。
275 :
273:2008/08/26(火) 11:23:20
Cドライブでdxdiag.exeの検索かけても何処にも無い位は実行済み
更新しようとしても「最新だからインストール必要なし」と表示されます
ファイル名を指定して実行、とか、Windows\system32の中、とか無いの?
今まで無かったためしがないのでないという状況がよくわからん。
DirectXを学ぶときって関数を暗記する必要ありますか?
暗記する必要はないが、どんな関数があるかくらいは一度全部
目を通した方がいい。
パソコンのDirectXバージョンがDirectX10で
製品の動作機種がDirectX9対応グラフィックでは正しく使えるのでしょうか?
それともDirectXというのは同じバージョンでしか対応しないものなのですか?
283 :
デフォルトの名無しさん:2008/08/26(火) 23:03:10
とりあえず280GTXってのを買ってきました。これでコミケに出れます。
今からDirectXの勉強を始めようと思うのですが
入門書としてDirectXゲームグラフィックスプログラミングVer2.1
を買いました。
DirectXGraphicsの初期化などは暗記して見ないで打てるようにしたほうがいいですか?
初期化なんかゲーム1本につき1回しか書かないから、ちゃんと動くの1回書けたら忘れていいよ
なんか暗記とか数学どこまで勉強とかって・・・
日曜プログラマならみんなコピペでいいよ
コピペで駄目になってから考えろ
>>283 待つんだゲフォの280は地雷だ。
らでの4850にしとけ。
大差ないスペックで大量の消費電力と3倍近い値段するんだぞ280は。
>>287 March 2008でも直ってねーじゃん
日曜プログラマでも脳みそは使わなきゃダメだ
提供元のサンプルはコピペのためにあるようなもんだしなw
DVD出たときにパイオニアと東芝がしょっちゅう同じバグ出してたのもコピペだったんだろうなあ
>>291 昔買ったNECのマウスのファームウェアがサンプルのコピペでワロタ
CY7C63101のサンプルコードに書いてあった仮のベンダーIDとかそのまんまになってた
DC版VF3がSAMPLE GAMEなのと同じですね、違いますね。
294 :
デフォルトの名無しさん:2008/08/28(木) 00:58:23
Windosゲームを作っていて、
ゲーム起動時に32*32のフォント画像のテクスチャーを約8000個作りたいんですが、
その処理に15秒くらいかかってしまいます。
CreateTextureやバッファにフォント画像を書き込むこと自体は、
全然時間がかからないんですが、
↓の処理が凄く遅いです。
D3DLOCKED_RECT lockRect;
pTexture->LockRect(0, &lockRect, NULL, D3DLOCK_DISCARD);
高速化する方法ってないでしょうか。
295 :
294:2008/08/28(木) 01:12:25
自己解決しました。
CreateTextureのプールを、
D3DPOOL_DEFAULT から D3DPOOL_MANAGED に変えたらちょっぱやになりました。
理由はよく分かりませんが、
D3DPOOL_DEFAULTだとLockRectでVRAMにアクセスするから遅い?
296 :
294:2008/08/28(木) 01:20:42
LPDIRECT3DVERTEXBUFFER9を頻繁にLockして色を変えたりする場合も、
もしかして、D3DPOOL_MANAGEDの方が速いのでしょうか?
D3DPOOL_MANAGEDとD3DPOOL_DEFAULTの長所短所がよく分からないんですが、
詳しい人いたら教えてもらえませんか?
POOL_DEFAULTは適切な使い方をすればちょっぱやになります。
あなたの使い方は論外です、今は素直にPOOL_MANAGEDを利用して
いつか分かるようになったらそのとき色々考えましょう。
っていうかDEFAULTのテクスチャをロックするなよ。
298 :
294:2008/08/28(木) 08:47:12
今までリソースは全てPOOL_DEFAULTで作ってたんですが、
POOL_DEFAULTはどういう場合に使うのが適切なんでしょうか?
いつかじゃなくて今知りたいんですが、教えてもらえないでしょうか。
299 :
294:2008/08/28(木) 09:23:29
かなり苦労してデバイスロスト時のリソース開放復帰処理を作ったので、
適切なところはPOOL_DEFAULTを使いたいんです。
その前にテクスチャ8000個の方に突っ込むべきな気もする…
淫乱負数からディスプレイアダプタを取得する方法が分からないのですが
誰か教えていただけませんか?
// ディスプレイアダプタを表すためのデバイスを作成
// 描画と頂点処理はハードウェアで行う
if(FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&m_D3DPP, &m_pD3DDevice))) {
// 失敗した場合
// 描画処理はハードウェアで、頂点処理はCUPで行う
if(FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SPFTWARE_VERTEXPROCESSING,
&m_D3DPP, &m_pD3DDevice))) {
// 失敗した場合
// 描画と頂点処理をCUPで行う
if(FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_REF,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&m_D3DPP, &m_pD3DDevice))) {
//取得失敗
return E_FAIL;
これだとコンパイルエラーが出ます。。。
D3DPOOL_DEFAULT とかD3DPOOL_MANAGED考える前に
テクスチャ8000個ってのを改善しろよ
8000個なんて使うときあるか?
>>302 日本語全部だとそのくらいじゃないの
知らないけど
1文字ずつバラしてんのか
1枚でつくって切りだして使えよ
>>305 じゃあ聞きますけど1枚に全部入りますか?
書き込む前に考えるクセをつけるべきだと思います。
jpeg3なら可能なんでない?
マトリョーカシからの圧縮も対応してるし
12000*8000のサイズも余裕で収まるっしょ?
糞設計ブーム到来中
「1枚じゃはいらないなぁ」
「でも複数にするとどの文字が
どのテクスチャに収納されてるのか考えないと・・・」
「そうだ!1文字テクスチャでつくればいいんじゃね」←いまここ
こういうことだろ?
どんだけ手抜きなんだよ
書き込む前に考えるクセをつけるべきなのは
>>306だなwwww
---煽りあいはここまで---
32*32を8000枚って、30MB超えたんだが、いったいどんな富豪グラボを想定してるんだろうw
大丈夫
いまどきの富豪なグラボは1GBある
淫乱負数からディスプレイアダプタを取得する方法が分からないのですが
誰か教えていただけませんか?
// ディスプレイアダプタを表すためのデバイスを作成
// 描画と頂点処理はハードウェアで行う
if(FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&m_D3DPP, &m_pD3DDevice))) {
// 失敗した場合
// 描画処理はハードウェアで、頂点処理はCUPで行う
if(FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SPFTWARE_VERTEXPROCESSING,
&m_D3DPP, &m_pD3DDevice))) {
// 失敗した場合
// 描画と頂点処理をCUPで行う
if(FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_REF,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&m_D3DPP, &m_pD3DDevice))) {
//取得失敗
return E_FAIL;
これだとコンパイルエラーが出ます。。。
とりあえずエラーの内容も書こうぜ
Renderer.cpp(266行目) 淫乱負数からのポインタが取得できません
ちなみに使っているコンパイラは現役専門学生の友達が作ってくれたものです。
DEFAULTはそれこそ毎フレーム書き換えるようなデータに使うのが一般的。
その場合は当然DYNAMICフラグとセットにしてな。
それ以外のただの画像テクスチャなんてものはMANAGEDで問題ない。
速度的にDEFAULTが速いとか勘違いしてるかもしれないが
作成時に1回だけ書き換える程度の静的なデータには無意味だ。
一般的といっていいかは分からないけど、
MMOみたいな大量の文字を使うようなゲームでも普通は事前に
テクスチャに展開してUVで切り出して描画をするぞ。
1文字1テクスチャは色々とおかしいといわざるを得ない。
1文字単位でテクスチャの切り替えが発生するしキャッシュ効率も最悪。
【淫乱負数】
デクリメント負数のサイズ (バイト単位)。柔軟な頂点フォーマット (デクリメント) 頂点バッファの場合は、
淫乱負数 は少なくとも 1 つの頂点を格納できる大きさでなければならないが、頂点サイズの倍数である必要はない。
淫乱負数 は非 FVF バッファについては検証されない。
320 :
294:2008/08/29(金) 00:13:09
>>309 手抜きじゃなくて、無知で初心者なだけです。
常に最善を求めて頑張っています。
>>310 とりあえず
>>306は私じゃないのであしからず。
>>312 いまどきのグラボは30MBくらいいけると想定して、
古いグラボはすっぱりと切る心づもりでした。
321 :
294:2008/08/29(金) 00:14:46
>>317 参考意見ありがとうございます。
charがどの文字に対応するかは絶対1つずつ判定が必要ですよね。
そしたら後は、1枚から特定の場所を切り出す処理がない分、
1つずつのテクスチャにした方が効率がいいかと思ったんですが、
そうではないんでしょうか?
私はプログラムやコンピュータに触りだしたのが最近で、
キャッシュ効率(たぶんハード寄りなこと?)というのがよく分からないんですが、
大量のテクスチャを使えば一時保存領域などを頻繁に入れ替えることになるから、
その分オーバーヘッドが生じて遅くなるってことでしょうか?
>>317 その書き方では、DEFAULTはロック書き換え用だと読めるが、
そうなの?
別に実測値を出せとは言わんが、それを示すドキュメントとかあるか?
323 :
デフォルトの名無しさん:2008/08/29(金) 01:25:44
扇形を簡単に描画させる方法ってないですか?
60度の角度で上方向に扇形を描画さしたいのですが(円弧の方が上)
開始地点は275から半径50の扇形を描画さしたいのですが
pD3Device->SetTexture(0, pTexture[0]);
pt[0].x = 250.0f;
pt[1].x = 300.0f;
pt[3].x = 275.0f;
pt[2].x = 275.0f;
pt[0].y = 225.0f;
pt[1].y = 225.0f;
pt[2].y = 275.0f;
pt[3].y = 275.0f;
pt[0].tu = pt[3].tu = 0.0f / 1024;
pt[1].tu = pt[2].tu = 200.0f / 1024;
pt[0].tv = pt[1].tv = 0.0f / 1024;
pt[2].tv = pt[3].tv = 200.0f / 1024;
pD3Device->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,2,pt,sizeof(CUSTOMVERTEX));
これでは普通に三角形ができただけで・・・
角度計算とかで簡単に扇形にできないでしょうか?
>>321 テクスチャの切り替えはなるべく少なくした方が高速
325 :
233:2008/08/29(金) 05:00:57
解決しました
粗末な物を張ってすみませんでした
淫乱負数って一体何なんだ
>>321 テクスチャの切り出しなんて文字コードをインデックスにして
テーブルからUVを引っ張ってくるだけだろ。
今のCPUのキャッシュ容量なら余裕で全部乗る程度のキャッシュサイズだし、
別にテクスチャ自体を切り出して作るわけじゃないぞ。
「テクスチャの切り替えをする」ということはそのつど「DrawPrimitive」を呼ぶということだ。
昨今のグラフィックカードは細かいデータをたくさん出すようには設計されてないので致命的なほど遅い。
なので可能なら1枚のテクスチャに格納⇒文字全てを1個の頂点バッファに格納⇒DrawPrimitive1回で全ての文字を描画
これが実測でも理論でも最速になる。
DrawPrimitiveの連打に比べたら頂点データの作成やUVテーブルの参照なんてゴミみたいな負荷。
>322
SDKに入ってるドキュメントに書かれてるよ。
>動的な頂点バッファおよびインデックス バッファの使い方
>
>理想は頂点データまたはインデックス データがまったく変化しないことですが、これは必ずしも可能ではありません。
>アプリケーションがフレームごとに頂点データまたはインデックス データを変更する場合は多くあり、
>フレームあたり複数回変更することさえあります。
>このような場合は、D3DUSAGE_DYNAMIC を使って頂点バッファまたはインデックス バッファを作成する必要があります。
>この利用法フラグによって Direct3D を頻繁なロック処理用に最適化します。
>D3DUSAGE_DYNAMIC はバッファを頻繁にロックする場合にのみ有用であり、
>変化しないデータは静的な頂点バッファまたはインデックス バッファに格納する必要があります。
テクスチャやサーフェイスの場合だとシステムメモリにコピーをいちいち作れない、
レンダリングターゲットや深度バッファなんかもDEFAULTで作る必要あるけど。
328 :
327:2008/08/29(金) 07:43:05
補足。
D3DUSAGE_DYNAMICフラグはD3DPOOL_DEFAULTと一緒じゃないと使えない。
D3DPOOL_MANAGEDって単にシステムメモリにコピーもってて、
システム側のバッファ⇒DMA転送⇒VRAMのバッファってやってるだけ。
だからデバイスがロストしても復旧できる。
当然だけど描画中のバッファをLock()しようとした場合は描画終わるまで待たされる。
そうなると頻繁にバッファ書き換えるなら直接VRAMのバッファ変えるほうが速いのは当然だし
DYNAMICフラグの場合はLock()する度に別のアドレス返してくるからMANAGEDみたいに
データの保障は出来ないってことだな。
DYNAMICしたバッファは
Lock()→新しいビデオメモリ領域をmalloc()→そのアドレスを返す→描画終わったらドライバがfree()
っていう処理だから他のバッファみたいに描画中のバッファに干渉してパイプラインを止めなくてすむ。
だから書き換えないならMANAGEDでいいし、頻繁に書き換えるならDEFAULT+DYNAMICにしとけってな話。
ドキュメントの「DirectXGraphics」→「プログラミング ガイド」→「プログラミングのヒント」→「パフォーマンスの最適化」を参照。
書き込むスレ間違えたのでマルチスレッドになるかもですが、
シーンの作成時やレンダラーの初期化時に
HRESULTをいうのを使っているのですが
HRESULT Renderer::Initialize(HWND hWnd, BOOL isFullScreen, int clientWidth, int clientHeight)
LRESULTとの違いってなんですか?
LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
ウィンドウプロシージャルを定義するときはLのほうを使って
DirectXの初期化の時などはHを使うって事ですか?
LRESULTはもともとlongだったものからきてる、longで結果を返すものと思っていい。
HRESULTは内容が決まってる。COMが返すものと思っていい。
自分で作った関数は、よそから返ってきたHRESULTをそのまま返すもの以外はあまり使わないと思うよ。
>>330 なるほど〜〜
ありがとうございました!
テイルズっぽいゲームを作ろうと思っているのですがエフェクトの所で悩んでます
戦闘時のエフェクトとかってDirectXで描写するのとAdobeEffectsとかで作ったのを描写するのどっちが一般的なんですか?
3Dなら、プログラム率高い
2Dなら、ベタでいいんじゃね?
絵の量が多いと、プログラムしないとメモリが足りないけど
>>332 このスレ64から嫁
一般的かって話なら3Dで作るのが一般的
質問もマルチスレッドの時代になったか
337 :
294:2008/08/29(金) 20:40:02
>>327 文字列全てを1個の頂点バッファに格納するというのは、
同じ板ポリゴンに、位置をずらしながら1文字ずつ貼り付けていくということですよね。
板ポリの4頂点にテクスチャのUVを指定して、
板ポリ全体にテクスチャを貼り付ける方法しか知らないんですが、
板ポリゴンの一部にテクスチャを貼り付けるにはどうすればいいんでしょうか?
>>337 いうてる意味がわからんが「描画する文字数 x 4角形」分の大きさの頂点バッファをこしらえるだろ。
1文字あたりポリゴン2枚(三角形×2)
1個の頂点バッファにたくさんポリゴンを詰め込んで、1回のDrawPrimitiveで全部描く
>>328 D3DPOOL_MANAGEDはレンダリングターゲットには出来ない。
ということはGPUによる書き換えは発生せず、内容の書き換えが起こるとするとすれば
それは常にCPUからの場合のみ。
だとすれば、D3DPOOL_MANAGEDのリソースは、
メインメモリ側がマスタで、ビデオメモリ側がスレーブという考え方でかまわない訳で、
lockした場合は、常にメインメモリ側のポインタを返し、
unlockした時点でスレーブに反映させればいいから、別にCPUはストールしない。
と、勝手に思っていた訳だが。根拠はないが。
また、SDKの記述だが
D3DUSAGE_DYNAMIC+D3DPOOL_DEFAULTが
D3DPOOOL_MANAGEDより優位だとは特に書いていないぞ。
>>340 CPUのメモリに書き込む⇒CPU→GPUの転送をする⇒GPUのバッファが描画待ち状態だった⇒さぁどうなる?
>>341 毎フレームロックするような2Dのスプライトみたいなものとか、
3Dのパーティクルみたいなものには有利とは書かれているぞ。
モデルみたいな作りっぱのデータにはむしろマイナスだろう。
343 :
294:2008/08/30(土) 00:45:36
>>338 >>339 理解しました。頂点バッファって三角形何個でも繋げられるんですね。
今まで常に三角形2枚の長方形で1個の頂点バッファにしてました。
どうもありがとうございます。
344 :
294:2008/08/30(土) 00:47:27
>>328 起動時のフォントテクスチャ作成を、
D3DPOOL_DEFAULT、D3DUSAGE_DYNAMICから、
D3DPOOL_MANAGED、USAGEなしに変えたら、
LPDIRECT3DTEXTURE9#LockRectが20倍くらい速くなったんですが、
描画中だとD3DPOOL_DEFAULTの方がロック速いけど、
描画してない状態だとD3DPOOL_MANAGEDの方がロック速いってことでしょうか。
いずれにせよ、色々実測してみようと思います。
dxerr.lib dxguid.lib d3dx9.lib d3d9.lib このライブラリの中で
ゲーム会社の採用試験の作品提出の時に使ったまずいのってありますか?
まずいのはそんなことを質問するお前の頭
その時点で不採用決定だから気にするな
流石にネタだろw
>>345 windowsアプリケーションを作る時
#include <windows.h>
がないとの同じだぞ?
>>345 お前は心臓がなくて生きてられるか?(ペースメーカーなど除く)
>>345 プログラマーって
>>350みたいなの多いから気をつけた方がいいよ
別に気に入らなければ答えなきゃいいだろうっていう質問をネタに遊ぶ連中だから
再配布禁止なのはd3dx9***.dll系だろ・・・
こういうくだらない話に喰いつく奴をみると
ネット経験が浅いんだろうなぁ、ウザいなぁと何時も思う。
>>352 実行ファイルの隣に置いておくのが駄目なだけで
再配布が禁止されてるわけじゃないよ
採用担当はいちいちそんな所みてねぇよ
356 :
294:2008/08/31(日) 04:38:21
色々試してみましたが、
やっぱうちだとPOOL_DEFAULT より POOL_MANAGEDの方が速いっぽいです。
あと、HARDWARE_VERTEX_PROCESSING より SOFTWARE_VERTEX_PROCESSINGの方が速い。
>>356 システムメモリとビデオメモリを理解してないんですね
わかります
>>356 そりゃロック速度は速いだろうけど描画は遅くなるだろ・・・
>356
測定条件が明確じゃないのに、ここでどっちが早いとか
書いても意味ねーぞ
360 :
294:2008/08/31(日) 14:24:52
>>360 いやぁ
その前にシステムメモリとビデオメモリの違い
ってわかる?
多分、そんなの測ってもケースバイケースよ?
いまのままだとどんな条件のときにそのプログラムが速くて
そんな条件のときにそのプログラムが遅いのかわかんないでしょ?
それを知りたい?
それとも虚構の条件でのみ速いって主張するそのプログラムを
みんなに認めてもらいたいだけ?
どっちか選んで方針決めてよ
363 :
294:2008/08/31(日) 16:59:03
何の違いですか?転送速度とか?
詳しい違いはしりません。
>それを知りたい?
知りたい。
364 :
294:2008/08/31(日) 17:00:47
あとはうち以外の環境でも実測して、
結果と理論を合致させたいです。
何で敢えて「その前にシステムメモリとビデオメモリの違い」を無視しているのかなぁ。
iPhoneのように画像をマウスの動きに合わせて左右にスライドさせて見るような画像ブラウザを作りたいのですがDirectXで可能でしょうか
お勧めのライブラリーなどあればよろしくお願いします
>>361 ちゃんと書いてあっただろ・・・。
もし商業でやってたらアウトだぞ。
再配布していいのは「再配布パッケージ」だけで
「再配布パッケージの中のファイル(d3dx9_32.dllなど)」を
単独で再配布してはいけない
>>363 その詳しい違いを調べてるんじゃないの?
ただロックして書き込み速度だけみたいなら
mallocしたバッファにでも書けば?
>>363 んじゃ
システムメモリってのはPCのCPUで演算させるときに
データをおかなきゃならんところなんよ
ビデオメモリってのはグラフィックボードのGPUで
演算させるときにデータをおかなきゃならんところよ
>あと、HARDWARE_VERTEX_PROCESSING より SOFTWARE_VERTEX_PROCESSINGの方が速い。
これもさ、LockとかDrawPrimitiveUpやってんじゃねぇの?
なのでそんな結果になっちゃうわけよ
つまりな、描画方法がグラボの能力をまったく使えてないw
2Dスプライトを実装する際の
頂点バッファ、インデックスバッファの扱いについて質問です
これらはスプライト毎に用意したほうがいいのでしょうか?
それともシステムに対して一つ用意してそれを使いまわせばいいのでしょうか?
>>370 1個だけ作っておいて
スプライトを順次埋め込んでいけばオッケ
表示するときに一発で済む
>>371 一つの頂点バッファに動的に頂点を追加し
テクスチャごとにインデックスバッファを作成して描画ということでしょうか?
一つの動的な頂点バッファをマイフレームロックして書き換えるのと
テクスチャごとに静的頂点バッファを生成して切り替えて使うのだと
どちらがパフォーマンスにやさしいのでしょうか?
初めてDirectXクリックしたら はい いいえの文字が出たのでいいえクリックしたら
DirectX診断ツールが出てきた・・・はい いいえの内容教えてください
たしか はい がおすすめですと書いてあった
バージョンが最新?DirectX 9.0cになってたいいえクリックすると自動で9.0cがインストールするの?
詳しい方教えてくださいおねがいします。
なんでこの文はFAILEDが2個もあるんですか?
//--------------------------------------
// モデルを生成
//--------------------------------------
// 球体(Sphere)の生成
if(FAILED( FAILED(D3DXCreateSphere( pD3DDevice,
1.0f,
36,
36,
&m_pMesh,
NULL)))) {
return E_FAIL;
}
とりあえず
・プログラミングの話しではない
・日本語がおかしい
>話しではない
お前も日本語がおかしい
if(FAILED(D3DXCreateSphere( pD3DDevice, これでいいと思うんですけど
if(FAILED( FAILED(D3DXCreateSphere( pD3DDevice, これにする理由ってなんですか?
>>377 後生ですからFAILEDマクロの定義を調べた上で初心者スレに出直してください。DirectXには関係がありませんから。
DirectXの画面上にエディットコントロールを貼り付けると激しくちらつきますが、
これは相性が悪いのであきらめろということですか?
>>372 異なるテクスチャを要求されるか
頂点バッファが一定量(例えばスプライト100個)を越えるまで
一つの頂点バッファに溜め込んで
上記条件を満たしたら表示する
>>379 DX搭載のUIを使うか
エディットコントロールの部分をクリッピングする
>>380 その手法はヘルプには書いてありましたが
たとえば
スプライト0〜49がテクスチャA
スプライト50〜99がテクスチャBを資源にしている場合
ひとつの頂点バッファで一括で100個描画をする方法あるのでしょうか?
パーティクルみたいに同じテクスチャを数100個表示するようなときには有効そうですが
>>381 テクスチャごとに(その例では50)表示しても
マルチテクスチャで無理して全部(その例では100)表示しても
速度差は出ないぞ
ウィンドウならWS_CLIPCHILDRENで
超初心者でプログラミングのサイトを読み進めながら組んでるんですが、
"error C2065: 'm_pD3Ddev' : 定義されていない識別子です。"
こんなエラーが出てビルドする事が出来ません。
恐れ入りますが、よろしくお願いします。
LPDIRECT3DDEVICE8 m_pD3DDev;
をクラス定義に入れろ。
>>386 有難うございます。
無事に解決する事が出来ました。
って8でよかったのか?
>>384わおすげー できた!おじちゃんありがとー!
LWでXファイルを書きだしたあとDirectXで読み込むときテクスチャーが読み込まれないの何でですか?
DirectXのほうでテクスチャーを張り付ける処理をしなければいけないってことです?
391 :
デフォルトの名無しさん:2008/09/03(水) 00:10:54
DirectXをダウンロードしたのですがスタートメニューから[DirectX]を検索して
プログラム欄のフォルダを見ても中が空なんですがこれできちんとダウンロードされているのでしょうか?
よろしくお願いします。。
392 :
デフォルトの名無しさん:2008/09/03(水) 00:14:21
OSはvista
DirectX10.0です
いまいち効果が感じられないので質問するに至りました
DirectXってどれ?
ランタイム?SDK?
>>390 DirectXの何で読み込んでいるかにもよる
ポリゴンしか読んでないなら
そりゃテクスチャも読まないとダメでしょう
よくあるトラブルは
テクスチャへのパスが間違っていること
一度Xファイルを覗いてみてパスが正しいか確認すべし
DirectXとOpenGLで共用できるようなメッシュクラスを作りたいと思っているのですが、
OpenGLのように頂点座標や法線、テクスチャ座標が別々の配列に分かれているデータを
一度に描画する方法はないのでしょうか? どなたか教えて下さい。
FVFに直すしかないんじゃね?
そんなのあったんだ!
399 :
デフォルトの名無しさん:2008/09/04(木) 20:41:08
スキンメッシュAと普通のメッシュaをそれぞれD3DXLoadMeshHierarchyFromXとD3DXLoadMeshFromX
で読み込ませたところ、なぜかaがAのモーションに引き寄せられるのですが。
解決方法が分かる人はいませんか?
400 :
399の補足:2008/09/04(木) 20:47:16
普通のメッシュを複数読み込んだ場合、最初の一つ以外は普通に描画されます。
401 :
399:2008/09/04(木) 21:16:59
402 :
395:2008/09/05(金) 08:36:21
>>397 どうもありがとうございます! とても参考になりました。
テ゜バイスがなくなったときの処理はなくてもいいの?
×テ゜バイス
○デバイス
突然、何の前提条件の説明もなく質問する脳味噌の足りない馬鹿って、
どうして発生するんだろう?
DirectX以外の事もおおむね初心者だからです
あなたのESP能力が試されているのです
というわけでデバイスロストでググってまたきなさい
if(pD3DDevice->present(0,0,0,0)) {
pD3DDevice->Reset(&m_D3DPP);
>>407 そんな最低のソース組むやつと仕事は出来ない。
>>408 トンマ ドベ アンポンタン ダボ アホ
2000ミリ秒って何秒ですか?
2秒?
>>412 トンマ ドベ アンポンタン ダボ アホ
>>413 トンマ ドベ アンポンタン ダボ アホ
>>414 トンマ ドベ アンポンタン ダボ アホ
この流れを何とかしてくれ
無視するわけにはいかない
自演にしては手が込んでるな・・・
ID出ないからって調子乗りすぎ
>>418 トンマ ドベ アンポンタン ダボ アホ スケベ ノロマ
キーフレームアニメーションの分野に入ったんですけど この分野の概念は重要ですか?
>>420 それが重要かどうかは、420が何をしようとしているか分からなければ答えられないんじゃないか?
まずはそれよりも、
>キーフレームアニメーションの分野に入ったんですけど
もうちょっと、自分が言わんとしていることが人に伝わる文章になっているか、それを気にしたほうがいい。
コリジョンが簡単にできるPosbiliedクラスって本当に売ってるんですか
>>420 そのぐれー理解しとけレベルとして聞いてるならもちろん理解しなきゃダメレベル
っていうかこれ嫌がったらキャラのアニメーション、エフェクトのアニメーションとか
アニメーションまわり全部苦手になるじゃん
理解しろ
板ポリに張り付けたテクスチャの透明度を動的に変化させたいのですが
いままではカラー情報無の頂点(座標+テクスチャ座標のみ)をつかって
ピクセルシェーダーで直接テクスチャカラーを
指定したアルファ値で書き換えていたのですが
これを固定機能パイプラインで再現するにはどうしたらよいのでしょうか?
調べた限りでは頂点情報にカラー情報を入れて
そこのアルファ値を使ってブレンドしているようなものは見つけましたが
これだとアルファ値を変化させるたびにLockして書き換えることになるような気がします
なにかさっくりとブレンド比を指定することはできないのでしょうか?
固定機能パイプラインを使ったプログラムほとんどしたことがないのでよろしくお願いします
板ポリなんだから、DrawPrimitiveUPを使えばいいんじゃない?
いちいちロックしなくて済むし
DrawPrimitiveUPのUPって何の略ですか?
ウンポーコ
User memory Pointer
>>424 俺も悩んだ。頂点毎に色を変える必要がなければ、
1.レンダーステートでライトを有効にする。
2.ライト自体は全てOFF。
3.マテリアルカラーのデヒューズあたりをいぢる。
で変わったはず。
ただし、この方法だとなぜか元々頂点カラーの入っているポリゴン(グーローポリゴン)
は変えることができなかった。解決方法は今も模索中。
>>430 ありがとうございます
D3DRS_BLENDFACTORにて対応することにしました
drawprimitiveとLPD3DXSPRITE->Drawによる描画を同時に使っているのですが
描画した結果をキャプチャして一枚のテクスチャにするにはどうすればいいですか?
テクスチャをターゲットにする
スプライトに関連づけられたデバイスがSetRenderTargetでテクスチャ指定すれば
DrawPrimitiveのものだけでなくスプライトもそのテクスチャに描画されるということですか?
グダグダ言う前にとっととやれ
D3DUSAGE_RENDERTARGETでテクスチャを作成して
・レンダーターゲットに設定して描画
・GetRenderTarget→StretchRectでフレームバッファからコピー
お好きな方をどうぞ
438 :
デフォルトの名無しさん:2008/09/14(日) 17:04:12
DirectInput使ってキー入力してるんですが、ウィンドウを一旦非アクティブにすると、それ以降全てのキーが押された状態になるようです。
どうすれば直るでしょうか・・・
協調レベルの設定を見直したら大丈夫になりました。
自己完結です。ご迷惑おかけしました
行列計算とか距離計算だけをGPU?にやって欲しいんだけども、どうしたらそこで計算してくれますか?
ちょっと立ち止まって
ホントにGPUで計算したほうが結果的にはやくなるのか考えてみよう
昔はGPUでやってたよね(´・ω・`)
ゲームの場合
どう考えてもCPUの遊んでる時間のほうが長いんじゃね?
445 :
デフォルトの名無しさん:2008/09/15(月) 08:37:45
つかFPU以上に速く処理できる場所ってあるのか?
頂点毎に行列計算があるっていうなら止めないけど
あくまでキャラのローカル座標程度ならCPUのほうがいいと思うよ
そろそろ破線描画について考えようぜ
1軸固定のビルボードで余裕
今まで全然気づかなかったんだけど、Manaded DirextX9のDirectDrawって
もしかしてアルファブレンドに対応してるんですか?
SDK見てたらAlphaSourceConstantプロパティとか見つけたけど
また実装されてないとか・・・かな。
よく考えたらこれスプライトのことだな、すまん
DirectXをマスターしたいんですがお勧めの本教えてください。
その前にマスターの基準を明確にしてください。
MikuMikuDanceが作りたいです。
つDirectX逆引き500
つGameProgramingGems1〜6
つGPUGems
つリアルタイムレンダリング
DirectXゲームグラフィックスプログラミングを買ってきました。
ウィンドウのクライアント領域サイズのテクスチャと変換済み座標を持つ頂点をつかって、
画面全体に画像を表示しようとすると、微妙にゆがんでしまいます。
これはどういったことが原因として考えられるでしょうか。
どうゆがむのかな
1ピクセルおきの格子画像を作って表示させると、モワレ見たいになってしまいます
ノートパソコンじゃあるまいな
普通に画像を表示させたらモワレがでないので、ディスプレイの問題とは思えないのです
普通って?
すいません、ペイントとかで開くとってことです
クライアント領域の大きさはいくつ?
DrawPrimitiveUPとかでやってるのならUVの設定とか頂点位置の設定が怪しいような
同じ画面モードで表示してみてダメなのか?違うモードでは?複数のビデオカードでも同じなのか?ドライバのバージョンは?CRTや液晶では?
0.5ずらして書いてないとかいうふざけた理由じゃあるまいな
いきなり返事がなくなったな
どうも困ったことになってしまいましたので、教えてください。
今まで何の問題もなく快適な速度で動いていた3Dベンチや3Dゲームなんですが、
久々に動かしてみると「3D処理系のゲーム全般含めて…」初めのほうはいいんですど、
途中でいきなり60fps前後のものが30〜20fpsにまでフレームが落ち込んで処理落ちしています。。。
3年ほど前に購入したFFXIベンチ動作認定済みのハイエンド型のノート型なんですけど、
実際に動かしている3Dゲームはこれよりも遥かに要求スペックの低いものです。
おかしなことに2Dゲームのときもこの症状が出てきます。これって何が原因かと思いますか?
ツールを使って自分でチェックしたけど、もうダメ・・・解らなかったです。。。
ビデヲメモリの容量も問題ないと思うし、バス幅も問題ないと思う。CPU&GPUの性能も問題ないと思います。
メインメモリの一部の領域が壊れたら、こんな症状になるのかな?と、思ってMEMTEST86+にてメモリチェック
を行ってみましたが、エラーもなく正常でした。
他に、ゲーム中にいきなりフレームが2/1にまで落ち込む原因は何が考えられるでしょうか?
教えてくだされば助かります。よろしくお願いします。
----------------------------------------------------------------
原因のパソコン : [DynaBook G8 / 型番:X20PDEW]
OS : WindowsXP SP2 / DirectX 9c
詳細仕様 :
http://dynabook.com/pc/catalog/dynabook/030512g8/spec.htm URL :
http://dynabook.com/pc/catalog/dynabook/030512g8/hard.htm ----------------------------------------------------------------
で、C/C++と何の関係があるのかをまずは明確に説明しろ。
DirectX初心者質問スレ、って言ってもここはプログラム板なんだが…
そういうときはOS再インスコでまっさらな状態にするのと簡単に直る。
長年使ってると色々な所でボトルネックが増えてきて新品時とはありえないほどパフォーマンスが落ちる。
リカバリーだな
それでも「途中で落ちてくる」場合は放熱系の性能が落ちてるかもしれんね
なら分解して掃除機orサポート逝きだな
サポートやってるとそれぐらいのは来るんじゃね?
DirectX勉強中なのですがDirectXにはテキストボックスとかは
無いのでしょうか?
全部自前でやるのでしょうか?
なんか定期的にその話出るな・・・
やり方は複数ある。もちろん自前でやってもいい
ヘタレの俺はダイアログ出してそこにエディットコントロールだがな・・・
勉強中ならDXUTでいいんじゃね?
てか、最近のサンプルって全部DXUT使って書いてあるよね
凝り性の俺は自前で処理する
どうでもいい部分に凝るのはなかなかに楽しい
進捗に貢献しないのでほどほどにしておかないといけないけれど・・・
給料泥棒ですね
481 :
デフォルトの名無しさん:2008/09/22(月) 15:00:38
質問です。
xファイルを読み込んでプログラムでボーンを動かして
アニメーションしたいと考えてますが
ボーンを動かす方法がわかりません
ヒントください...
ひどい質問だな
単にスキンメッシュがしたいんです。
ってことなのか
頂点シェーダや固定機能パイプラインを使わないで
CPUでボーンを動かしたいんです。
のどっちなんだ?
DirectXを使うならbccじゃなくてvc++のほうを使ったほうがいいんでせうか?
C++自体もVCの方がいいよ
XFile
なんとかAllocaterとか使わず
自前で読み込んでやってみたら意外と簡単で感動した
すいません、ここの処理がよく分からないのですが
//--------------------------------------
// 背景を描画
//--------------------------------------
// Z比較を行なう
pD3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
// 元画像に合わせてオブジェクトのスケールを変える
if(m_imgInfoBack.Height != 0) {
aspect = (float)m_imgInfoBack.Width / (float)m_imgInfoBack.Height;
}
vScale.x = aspect;
D3DXMatrixScaling(&mScale, vScale.x, vScale.y, vScale.z);
mWorld = mScale;
// ワールド変換マトリックスをパイプラインにセット
pD3DDevice->SetTransform(D3DTS_WORLD, &mWorld);
これだけじゃ質問の意味が分からないかもしれません・・・、申し訳ない
// 元画像に合わせてオブジェクトのスケールを変える の所の処理について説明してもらえませんか
よろしくお願いします
正方形状に頂点を配置してるから、元画像の縦横比を保つために変換行列で正方形を横に広げることを指示してる。
GPUの描画能力を活かして描画ソフト(ポリゴンで二次元的な線や図形を描く)を作りたいのですが、
最終的にレンダリングされた画面をファイルに保存するときはどのような手順を踏めばよいでしょうか?
つD3DXSaveTextureToFile
492 :
490:2008/09/24(水) 17:28:10
最強の入門書は?
DirectX以前の質問になってしまうが、教えて欲しい。
直方体や円柱の林の中を一人称視点で移動できるようなプログラムが
組める位までの知識が欲しいんだけどお勧めの書籍とかある?
当方のスキルは算数は困らん程度に出来るが、数学は微妙だ。
プログラムの言語はCとC++は一通り出来る(はず)。
MFC使って自分用のツールを作る程度のことは出来る。
キーボード、マウス、ゲームコントローラーとして認識されていない機器をDirectInputで扱うことはできますか?
トランジスタ技術8月号についてきた78k0マイコンにスイッチを付けてコントローラーの様にしようと思ったのですが、
パソコンには仮想comポートとして認識されているため途方に暮れてます。
ドライバ書くのがいいかも。
って署名なしは入れにくいか
498 :
デフォルトの名無しさん:2008/09/25(木) 11:39:02
>>494 三角関数、ベクトル、行列あたりの知識は絶対必要。
>>494 程度なら行列は使い方だけ分かれば数学的な知識なくても何とかなるけどな
すみません超初心者版で質問したのですが
スレが消えてしまったのでこちらに改めて質問させてください
リアルタイムロードシステムの妄想をしているのですが
テクスチャをロードする際にMipMapの低レベルサーフェイスから順に
読み込めないかといろいろ試しているのですがいい方法が浮かびません
デバイスのCreateTextureで必要なバッファを確保し、あとから自力で
DDSファイルなりを読み込んでロックして放り込めば出来るかと思ったのですが
D3DPOOL_DEFAULTで作成したものしかロックできないんだとか
USAGE_DYNAMICは効率が悪いから使いたくないよ・・・・
なんかいい方法ないでしょうか?
>USAGE_DYNAMICは効率が悪いから使いたくないよ・・・・
この考えが間違っている
使え
以上
>>501 回答ありがとうございます!
リファレンスのD3DUSAGE_DYNAMICを見直してみたところ、
頂点バッファに関しては配置場所が変わる可能性があるようですが、
テクスチャに関しては特にそういった記述が見当たりませんでした。
つまりテクスチャに関してはDYNAMICにしても、速度的なデメリットは無いんでしょうか?
宜しくお願いしますm(_ _)m
MipMapの低レベルサーフェスから順に読み込む理由が知りたい。
っていうか、Lockできる条件を勘違いしてるだろ。
>D3DPOOL_DEFAULT で作成されたテクスチャはロックできない。
(SDKのヘルプより)
504 :
494:2008/09/25(木) 16:02:40
>>498、499
とりあえず教えて貰ったキーワードを元に、
ググる先生に参考書になりそうな本を聞いてくる。
>>504 来月始め頃にちょうどいいのが出るような気がした
移動するくらいなら算数だけできればおk
508 :
500:2008/09/25(木) 16:20:39
低レベルから順にロードする理由は、数フレームにわたってリアルタイムロードする場合は
低解像度でもいいので出来る限り早く読み込んで表示したいからです
それから
>D3DPOOL_DEFAULTで作成したものしかロックできないんだとか
は
>D3DPOOL_DEFAULTで作成したものは、USAGE_DYNAMICを指定しないとロックできないんだとか
の間違いでした。すみません
>>508 D3DPOOL_DEFAULTならLockするより、UpdateTextureや
UpdateSurfaceを使った方が速い。
510 :
500:2008/09/25(木) 17:45:03
ご意見どうもです
UpdateSurfaceでやると、ロックするのと違いなぜ速くなるのでしょうか?
システムメモリ上にもテクスチャを作ることになりそうであまりやりたくないかなと^^;
また、D3DXLoadSurfaceFromMemoryと言う関数を見つけたのですが、
これで代用することもできますでしょうか?
入門書はなにがよろしくって?
>>510 UpdateTextureはDMAが使用される。
転送速度そのものは、DMAを使おうが使うまいが大差ないが
DMAの場合は転送中にCPUがフリーになって他の処理ができる。
>>512 それならMANAGEDでいいですやんって話
ポイントプリミティブを同じ座標に描画して色のブレンドを行いたいのですが上手く行きません。
これは無理なことなんでしょうか?
515 :
デフォルトの名無しさん:2008/09/26(金) 02:42:55
directx10 SDK だとdirectsoundが使えないとかないよね?
音が鳴らない・・・
516 :
デフォルトの名無しさん:2008/09/26(金) 07:46:42
↑
音だけ鳴らす最小限のサンプルを見つけて、そこからチェックしてみたら?
DirectX10のSDKなんてないだろ。
DirectSound自体はDirectX8の頃から変わってないし最新SDK使ってても普通に鳴るぞ。
自分のプラグラムのバグだとは思わないのかね
何でも人のせいにするんじゃないよ
directx10 SDK→Vistaを使ってる
VistaとDirectSoundの相性関係でうまく再生できてない
って事はない?
何れにしろ再生できるはず
存在しないSDKの名を上げ、何をどうしたのかも書かず、
自分のプログラムを疑わず他人のせいにする。
プログラマ適性0だから、そのそも足を洗うのが正しい選択だろう。
OpenALへようこそ
やっぱそういう流れなのかな^^;
日本語ドキュメントさえあればそれでもいいんだけど
XAudio2ってどうなってんの?未だ未完成だよね
3DCGツールにボーンってあるじゃないですか?
あれってDirectXの機能じゃないですよね?
自分で実装する領域ですよね?
素人ですまそ。
補助機能みたいなのはあるにはあるが自分で実装する部分だね
>>524 そうですよね。ありがとうございます。
例えば人体のモデルがあったとしても
ボーンを入れるならボーンごとにモデルを分けないと
いけないってことですよね。
>ボーンごとにモデルを分けないと
頂点バッファやインデックスバッファ自体はひとつでもいい。
各頂点にボーンの番号付けて、頂点シェーダでそれ見て変換する。
>>525 別のボーンに限らずモデル描画自体は自分で全部実装する部分なのでボーンだけが特別なわけじゃない。
528 :
デフォルトの名無しさん:2008/09/27(土) 15:58:52
>>459と同じ状況に陥りました。拡大するとより一層モアレが目立ちます。
デバイスタイプをHALからREFに変えたら画像がはっきりするのですが、
かなり重たくなってしまいます。
REFを使わないでモアレを消す方法を知っている方がいればお願いします。
PCは「Let'Note」で「directx9 」使ってます。
ビデオカードを変える
ビデオカードによって見た目は変わるんだよ
現状でモアレを消すならミップマップを使う、モアレの出ないような絵にする
531 :
デフォルトの名無しさん:2008/09/27(土) 17:29:54
>>529 >>530 ビデオカード変えたらかなり綺麗になりました。
こんなに変わるものなんですね・・・
ミップマップの方も挑戦しようと思います。
アドバイスくれた方ありがとう御座いました m(>_<)m
>>531 デバイスの初期値もあまりあてにはならない。
全てのステートを起動時に初期化するべき。
あとビデオカードのユーティリティで強制的に
異法性フィルタやMSAAとかがONになっている可能性もある。
533 :
468:2008/09/28(日) 00:10:55
>>471-473 レスが遅れてしまいましてすみません。
貴重なご意見をありがとうございました。
皆さんの意見を参考に、こちらで色々と作業をやってみたいと思います。
原因解消の復旧というか、最後の手段はやはりOSの再セットアップしかなさそうですね。
がっばってみます。
534 :
504:2008/09/29(月) 14:06:49
>>505-506 レスが遅くなってすまん。
まさにぴったりなタイトルだよ。 マジサンクス。
早速、密林に予約した。
DirectX9勉強して1年になるのですが、関数が多すぎて全部覚えられそうにありません・・・。
皆さんはどんなふうに覚えてますか?
536 :
デフォルトの名無しさん:2008/09/29(月) 18:26:36
名前とかスコア表示用にアルファベットと数字のビットマップを等間隔で出力するツールってないかな?
>>536 SentSentBampTool ???
>>535 関数を沢山覚える必要はないが、
貴方のやりたい事にもよるけど、例えば
マルチパスレンダリングの手順などは覚えていた方がいいと思う。
皆はどう思う?
540 :
デフォルトの名無しさん:2008/09/29(月) 21:32:07
DirectX 初心者です。 DirectX9 を用いて下記のことを
やっているのですが、上手く表示が出来なくて困っています。
DrawPrimitiveにてD3DPT_TRIANGLELISTを指定して
4つ三角形をテクスチャを貼り付けてレンダリングしようと
しているのですが、D3DRS_ZENABLE=TRUE , D3DRS_ZWRITEENABLE=TRUE
とした時にテクスチャがうまく貼り付けられなくて困っています。
D3DRS_ZENABLE=FALSE とすると、うまく貼り付けられるのですが
今度は各三角形を個別に描画したような絵になってしまいます。
D3DRS_ZENABLE=TRUE, D3DRS_ZWRITEENABLE=TRUEでも、D3DRS_ZFUNCに
D3DCMP_ALWAYS とするとテクスチャはうまく貼り付けられるのですが、
D3DRS_ZENABLE=FALSE とした場合同様、各三角形を個別に描画した
ような絵になってしまいます。
よろしくおねがいします。
Zの問題とテクスチャの問題は別だ
まずZENABLE=FALSEの状態で正しく描画されるようにしよう
うまく描けたら、ZENABLE=TRUEの状態でもいけるように直す
テクスチャ座標がまずいんでない?
>>541 ありがとうございます。 こんな感じで定義しています。
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_TEX1 )
typedef struct {
FLOAT x, y, z;
FLOAT u,v;
} CUSTOMVERTEX;
CUSTOMVERTEX vertices[] = {
{ 0.0f, 0.5f, -0.5f, 0.0f, 0.0f },
{ 0.0f, 0.5f, 0.5f, 1.0f, 0.0f },
{ 0.0f, -0.5f, -0.5f, 0.0f, 1.0f },
{ 0.0f, 0.5f, 0.5f, 1.0f, 0.0f },
{ 0.0f, -0.5f, 0.5f, 1.0f, 1.0f },
{ 0.0f, -0.5f, -0.5f, 0.0f, 1.0f },
{ -0.5f, 0.5f, 0.0f, 0.0f, 0.0f },
{ 0.5f, 0.5f, 0.0f, 1.0f, 0.0f },
{ -0.5f, -0.5f, 0.0f, 0.0f, 1.0f },
{ 0.5f, 0.5f, 0.0f, 1.0f, 0.0f },
{ 0.5f, -0.5f, 0.0f, 1.0f, 1.0f },
{ -0.5f, -0.5f, 0.0f, 0.0f, 1.0f }
};
よろしくお願いします。
543 :
デフォルトの名無しさん:2008/09/29(月) 23:18:37
>>541 すみません。
ZENABLE=FALSE の時には正しく描画されているように見えます。
ただ、1つ1つの三角形を個別にレンダリングしたような感じになっ
てしまいます。(陰影などが全く反映されません)
よろしくお願いします。
それは、テクスチャが貼れてないだけ?
ポリゴン自体は描けてる?
Zバッファのクリアをミスってるとか
法線がないようだが、ライティングはオフにしてる?
546 :
デフォルトの名無しさん:2008/09/29(月) 23:57:28
>>544 >>545 ありがとうございます。
はい、テクスチャがうまく描画されないだけみたいです。
Zバッファのクリアはとくにしていないのですが、どうやれば
良いでしょうか?
はい、ライティングは無効にしてあります。
SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
SetRenderState( D3DRS_LIGHTING, FALSE );
SetRenderState( D3DRS_ZENABLE, TRUE );
SetRenderState( D3DRS_ZFUNC, D3DCMP_LESSEQUAL );
SetRenderState( D3DRS_ZWRITEENABLE, TRUE );
SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
SetRenderState( D3DRS_SPECULARENABLE, FALSE );
SetRenderState( D3DRS_DITHERENABLE, FALSE );
SetRenderState( D3DRS_FOGENABLE, FALSE );
SetRenderState( D3DRS_SPECULARENABLE, FALSE );
SetRenderState( D3DRS_RANGEFOGENABLE, FALSE );
SetRenderState( D3DRS_STENCILENABLE, FALSE );
よろしくお願いします。
547 :
デフォルトの名無しさん:2008/09/30(火) 00:10:28
>>544 >>545 ありがとうございます 動きました!
Zバッファをクリアする必要があることを知りませんでした。。。orz...
本当にありがとうございました。
548 :
デフォルトの名無しさん:2008/09/30(火) 13:02:49
すごく初歩的な質問で恥ずかしいのですが・・・
DirectXで3Dゲームを作る場合、3Dグラフィクス自体は(キャラクターのモーションなど)専用のグラフィックツールで作ると言う形なのでしょうか?
あ・た・り・ま・え
1>gamemain.cpp
1>c:\documents and settings\^^^^^^\デスクトップ\src\test90walking\test1\../../class/classlib.h(70) : fatal error C1083: include ファイルを開けません。'dpaddr.h': No such file or directory
これと同じエラーが20個もでてコンパイルできないのですがどう対処すればいいのでしょうか・・・?
3Dリアルタイムアニメーションという書籍のサンプルです。
551 :
550:2008/09/30(火) 17:45:25
dpaddrというヘッダファイルがどこにもなくて・・・。
DirectX SDK には以下のコンポーネントは含まれなくなりました。
Direct3D 8 とそれ以前のすべてのバージョン
Direct3D RM
DirectAnimation
DirectMusic
DirectInput7 およびそれ以前のすべてのバージョン
DirectPlay
DirectPlayVoice
DirectX 8 時代の HRESULT 変換ルーチン
Managed DirectX サンプルとドキュメント
これらのコンポーネントをご利用になりたいデベロッパーは、MSDN から入手可能な August 2007 DirectX SDK をダウンロードする必要があります。
DirectPlay関連のヘッダーだろ
DirectX8のSDKにあるんじゃないかな。
ありがとうございます
インストールしてみます
BCCでDirectXを使うにはどうすればいいんですか?
SDK入れよう
>>548に便乗して質問。
どんなグラフィックソフト使ってる?
3DS MAX
うらやましい限りだぜ
俺はBlender
560 :
デフォルトの名無しさん:2008/10/01(水) 09:14:54
Mayaってどうなんだろ
この手のツールは無料から始めたほうがよさげ。
使い切れずに放り投げるには高すぎるからなw
金があったら
ZBrush+3DSMAXが最強な希ガス
俺はMikuMikuDance
MAXの無料版ってもう無いの?
先日買った書籍に3Dリアルタイムアニメーションというのがあるのですが。
LightWaveで作ったアニメーションをUViewで読み込んでOBJ形式で描きだして
DirectXで読み込む方法を使っているのですがUViewは現在販売していないらしく
他のソフトで代用して欲しいと最後に筆者が記述していたのですが
他のソフトってどんな物があるのですか?
何個か教えてもらえたら嬉しいです!
obj形式なら普通にエクスポート出来ると思うが?
じゃなくてOBJ形式をXファイルに変換とか?
何れにしてもLightWaveの標準機能で出来た希ガス
ID3DXEffectを使用した場合、シェーダのグローバル変数の共有や、ステートの一括変更などが可能ですが
これらの処理をID3DXEffectを使用しないで自前で実装することは可能でしょうか?
リファレンスを見ているのですが、変数を共有する方法は全く見当たりませんし
ステートブロックを自前で管理したとしても、API呼び出しは回数は減らせないですよね?
ID3DXEffectを使用しないという人は結構いると思うのですが、この辺はどうやって解決しているんでしょうか・・・
宜しくお願いしますm(_ _)m
568 :
567:2008/10/02(木) 10:51:24
すみません、ステートブロックに関してはIDirect3DStateBlock9が使えることが分かりました
これに関しては何とかなりそうです。
569 :
デフォルトの名無しさん:2008/10/02(木) 11:06:45
俺はMayaかってしまった。マジすごいなこれ。
ブルジョワジーめ
571 :
デフォルトの名無しさん:2008/10/02(木) 16:20:40
August 2007のDirectX SDKを入れていますが、IA64のライブラリがついていません。
付属してるバージョンのSDKを知ってる方はいませんか?
うああああああ
シェーダー定数の共有のさせ方わっかんねーwww
燃えてきたぜ
573 :
567:2008/10/02(木) 17:22:54
結局sharedキーワードでうまく共有する方法は分からないが
レジスタを直接指定すれば共有できることは分かった
取りあえずこれでいこうと思います。もっといい方法があったら教えていただけると助かりますm(_ _)m
>>573 1、ID3DXEffectPoolオブジェクトを作成(D3DXCreateEffectPoolを使用)
2、sharedをつけた変数を宣言したFXファイルを作成
3、共有したいFXファイル全てに2のFXファイルをインクルード
4、3のFXファイルをコンパイル時、D3DXCreateEffectに1のID3DXEffectPoolオブジェクトを引数で渡す。
ん?
ID3DXEffectを使わないで変数の共有をしたいって言ってるのか?
そりゃー、逆アセンブルしてD3DXがどう解決しているか確認してみりゃいいんじゃね
まーEffectPoolなんて使ってる以上、力技だろってのは想像がつくがな
単純に変数を一時的にEffectPoolに入れておいてるだけで、
結局描画時に全部毎回マッチングしてレジスタに設定してるんじゃ無いっけ?
あくまでユーザー側からは同じ変数のように見えているだけで。
>>576 マジすかw
だとしたら効率的には何の意味もないんだな^^;
頂点シェーダーにハードウェア対応していないグラフィックカードでは
頂点処理はCPUで実行されると思いますが、その場合に
D3DPOOL_DEFAULTを指定して作成したっ頂点データは
システムメモリ上に配置される可能性が高いんでしょうか?
システムメモリ上に配置されるということはレンダリングの度にシステムメモリから
ビデオカードへのデータ転送が発生しているのでしょうか?
>>576 そういえば、頂点シェーダー(VS)とピクセルシェーダ(PS)を別々にビルドしてセットする場合って、
VSとPSそれぞれの定数テーブルに値をセットする必要があると思うけど
(VSとPSでレジスタ空間が違うからなのか?違うよね?)
この辺もD3DXEffect系使った時って意識しないから、やっぱD3DXEffect系は内部でいろいろやってるのか…
1>.\MapModel.cpp(622) : error C2065: 'DXFILEFORMAT_BINARY' : 定義されていない識別子です
最後にこのエラーだけ解決できません・・・。
対処方法を教えていただけませんか?
>>578 頂点変換をハードウェアで対応してなければ
システムメモリから転送するしかない。
RadeonHD3450が5000円で買えるんだから
素直にDirectX10対応のビデオカード買えばいい。
>>579 かといって自分で全部管理した方が速くなるのか?という話になると
どちらかといえば遅くなるだろうから素直にID3DXEffect使う方がいい。
すでにDirectX10ではそれしかないし。
582 :
580:2008/10/03(金) 20:37:52
if (FAILED(D3DXSaveMeshToX(name, pMesh, NULL, material, NULL, 3, DXFILEFORMAT_BINARY)))
return false;
return true;
}
コードです
>>582 使ってるSDKが新しすぎるんじゃね?
よく分からんわ
>>580 それは、dxfile.hに定義がある。
使いたければ、includeしろ。
てか、それ間違ってるんで
#include <d3dx9xof.h>
を追加して
D3DXF_FILEFORMAT_BINARYを使え。
おまいらどうやってDirectX勉強したの?
独学?
独学
すっげー
俺はDirectX5の頃からだぞ、なめんな
あと歳は聞くな
WinGから
じじい言うな
d3dx9_xx.dllにはいろんなバージョンがありますが、ロードするのは一番数字が大きいものでいいのでしょうか。
それとも、各バージョンごとで互換性が低いのでしょうか。
つかってるSDKによって勝手に対応するバージョンのものが呼ばれる
それはd3dx9.libをリンクしていたらってことですよね。
友達にプログラムを渡したら二人が二人ともd3dx9_xx.dllがないとエラーが出るといっていたので、
とりあえず一番に、最新のDirectXを入れるように言ったのですが、
プログラム側で選択してもよいものなのかと疑問に思ったのです。
>>592 >プログラム側で選択してもよいものなのかと疑問に思ったのです。
それをやれるだけのスキルがあるならやればいいと思うけど、
「やってみたいんですけどうまくいきません」というのならやるなと言いたい。
ということは少なからず差異があるようですね。
>>594のページを教えて、インストールさせようと思います。
ありがとうございました。
Direct3D 9 Driver Development Kitなんて何処にあるんだ・・・?
ぶっちゃけ
自分のPCにはいってる一番番号の大きいdllを
exeと同じフォルダに入れて渡せば動くよ
typedef struct _D3DLVERTEX {
D3DXVECTOR3 pos;
D3DCOLOR color;
D3DCOLOR specular;
D3DVALUE tu;
D3DVALUE tv;
} D3DLVERTEX, *LPD3DLVERTEX;
#define D3DFVF_LVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1)
_D3DLVERTEX についている_の意味ってなんですか?
別にそこで使った名前は他で使わないから適当でううんだけど
よそと名前がぶつかったら困るでしょ。
そのために自分たちだけで決めたルール
なるほど そういうことですか
ありがとうございjます
おしえてください。
ウィンドウサイズの変更イベント OnSize() の中で、
Reset() を使っているのですが、D3DERR_INVALIDCALL
というエラーが出て先に進めなくてこまっています。orz...
D3DPRESENT_PARAMETER の中身は、
BackBufferWidth 0
BackBufferHeight 0
BackBufferFormat D3DFMT_X8R8G8B8
BackBufferCount 0
MultiSampleType D3DMULTISAMPLE_NONE
MultiSampleQuality 0
SwapEffect D3DSWAPEFFECT_DISCARD
hDeviceWindow = GetSafeHwnd() で取得したハンドル
Windowed 1
EnableAutoDepthStencil 1
AutoDepthStencilFormat D3DFMT_D16
Flags 0
FullScreen_RefreshRateInHz 0
PresentationInterval 0
です。
よろしくお願いします m(_ _)m
ウィンドウハンドルがNULLとか
>>603 ありがとうございます。
D3DERR_INVALIDCALLが発生する原因がわかりました。
リソースをD3DPOOL_DEFAULTで確保するとダメみたいです。
OnSize() でウィンドウサイズを可変した時に3D画像のアスペクト比が
変わってしまうのを防ぎたかったのですが、Resetを呼び出してもダメ
みたいです。
アスペクト比を固定するにはどのようにすれば良いでしょうか?
よろしくお願いします。
D3DPOOL_DEFAULTで作成したリソースをいったん削除してからデバイスをリセットして、その後でリソースを作り直す。
606 :
デフォルトの名無しさん:2008/10/04(土) 23:39:07
>>605 ありがとうございます。
早速ためしてみます。
>>604 何がしたいのかわからないんだが
ウインドウサイズが変わった時点で
変更後のサイズからアス比を再計算して
射影行列を作る時に指定しているアス比を変更するだけじゃだめなのか?
D3DXMatrixPerspectiveFovLHとかの話
ついでに流れ的に関係あるようでないような質問
テクスチャとかメッシュとかはパフォーマンス的には置いといて
デバイスのロストを気にしなくても良い様にできるけど
ID3DXEffectだけは対応しなくちゃいけない感じなんだが
これって何かの設定で対応しなくて良いようにできるものなの?
>>607バックバッファの大きさは変わらないんだからぼんやりしちゃうだろ
デフォルトのバックバッファを使わないで、
後から確保した物を使えばリセットする必要性は皆無
>>607 ID3DXEffectの仕様として管理下はサポートされていないので
それは無理だろ。
ただ、ロスト対応が必要な理由として、シェーダ引数のテクスチャと
ステートブロックがあるからだろうと考えられるので
エフェクトに渡すテクスチャは管理下のみ、
pass内でステートの変更はしない、ステートブロックは使わない、などの
対策をすれば、大丈夫になるかもね。
マルチディスプレイで
WindowモードのWindowを他方のWindowへ移動すると
presentが遅くなるのはどうしようも無いですか?
VOID DrawText(ID3DXFont* pFont, char* text, DWORD x, DWORD y, D3DCOLOR Color)
{
RECT Rect;
SetRect(&Rect, x, y, CW_USEDEFAULT, CW_USEDEFAULT);
pFont->DrawTextA(text, -1, &Rect, DT_LEFT | DT_NOCLIP, Color);
}
の
pFont->DrawTextA(text, -1, &Rect, DT_LEFT | DT_NOCLIP, Color);
この部分で
error C2660: 'ID3DXFont::DrawTextA' : 関数に 5 個の引数を指定できません。
と言うエラーが出てしまいます
自力で調べた所DirectX SDKの仕様が変わったためにコンパイルできないらしいと言うところまではわかったんですが
どのように書き直せば良いのかわかりません
どのように直せば良いのでしょうか
ちなみにSDKはaugust 2007です
よろしくお願いします
第一引数にD3DXSPRITEを渡さないとダメ
最新のSDKのマニュアルとサンプルを見るべし
614 :
612:2008/10/08(水) 14:40:09
ありがとうございました
やってみます
615 :
デフォルトの名無しさん:2008/10/08(水) 15:35:55
これからDirectXをまなぼうと思っています
ゲームをつくりながら解説していくようなサイトを探しています
オススメがありましたら教えてください
C++とWINAPIの基本は理解しています
age失礼しました
DirectInputで作成したマウスデバイスで、強調レベルを非排他に設定したときだけAquireメソッドが成功しません。
どういうときに失敗するのでしょうか。
>>617 Aquireは排他制御のためのメソッドだから、非排他設定なら必要ないだろう。
619 :
617:2008/10/08(水) 21:22:12
どんなサイトの解説を見ても、必ずAcquireメソッドをよんでるんですが・・・
少なくともサイトの管理人の環境では、実行できてるってことですよね?
>>619 Acquireを呼んでいるのと、Acquireが成功するかは別問題。
MSのサンプルだってAcquireは呼んでいる。
でも、それが成功したかなんて気にしていない。
621 :
617:2008/10/08(水) 21:54:33
日本語版のMSDNでようやく該当する記述を見つけました。
Acquireの戻り値として、
>DIERR_OTHERAPPHASPRIO 他のアプリケーションの優先レベルの方が高いので、この呼び出しを実行できない。
>この値は、標準の COM 戻り値である E_ACCESSDENIED に等しい。このエラーが返されるのは、
>デバイスに対するアプリケーションのアクセス権がフォアグラウンド アクセス権であるにもかかわらず、
>バックグラウンドであるときにデバイスを取得しようとした場合である。
とありました。WM_CREATEの処理内で呼び出していたために失敗していたようです。
大変お騒がせしました。まさか日本語ページの方が詳しいなんて・・・
DirectSoundはDirextX8も9も一緒なんですか?
DirectSoundCreate8からDirectSoundCreate9になるのかと思ったんですがないといわれます。
ライブラリの追加はdsound.lib dxguid.lib winmm.lib だけでいいんですか?
>>622 dsound.hの中を見ればわかるよ
DIRECTSOUND_VERSION >= 0x0800
なので8も9も同じ
libはそれでいいんじゃない
未解決とか言われたら追加すればいい
質問です
DirectX8で作られた古いソースが出てきたのですが、現在PCには9.0cのSDKが入っています。
上記ソースをコンパイルしようとしたところ
#include <d3d8.h>
#include <d3dx8.h>
こいつらがないと言われてしまったのですが、DirectX8のSDKをインストールしないとダメってことでしょうか。
(普段は9のプログラムを組んでいるので)競合しそうで怖いのですが、何か良い手はありますでしょうか
俺も場合は複数バージョンのSDKをインストールしないで解凍して保管する
で、includeやlibは新しいバージョンを優先しとけばないものだけ古いものから参照される
>>625 オプションのVC++ディレクトリを
C:\Program Files\Microsoft DirectX SDK (March 2008)\Include
C:\Program Files\Microsoft DirectX SDK (August 2007)\Include
・
・
こんな感じにしてるが心配ならDX8のときは順番を入れ替えればいいんじゃない
DirectInputのマウスデバイスで相対座標のデータを得るとき、値1が1pxと対応しているわけではないと思うのですが、
どうやってピクセル単位の座標変化を求めればいいでしょうか。
対応してた気がするが?
629
つまりプログラムのミスですか。確認してみますorz
サウンドバッファはプライマリとセカンダリ両方作る必要はあるんですか?サンプルを見たんですが、2つ作ってるのにセカンダリしかつかってないように見えるんですが
633 :
629:2008/10/09(木) 19:43:32
やっぱりどうしても、実際のカーソルの位置と、DirectInputで求めたカーソル移動量が食い違います。
スクリーン上で1000px水平に移動させると、移動量の合計が600〜800くらいになっています。
下がそのコードなのですが、どこか間違っているところがありますか?
void MouseDevice::UpdateState()
{
HRESULT hr;
if (hr = pDevice_->Acquire(), FAILED(hr))
{
LOG_WARN("IDirectInputDevice8::Acquire 非アクティブになった?");
return;
}
DIMOUSESTATE mouseState;
if (hr = pDevice_->GetDeviceState(sizeof(mouseState), &mouseState), FAILED(hr))
{
LOG_ERROR("IDirectInput8::GetDeviceState");
return;
}
cursorPos_.x = clamp(cursorPos_.x + mouseState.lX, 0L, 1279L);
cursorPos_.y = clamp(cursorPos_.y + mouseState.lY, 0L, 1023L);
//SetCursorPos(cursorPos_.x, cursorPos_.y);
POINT pt;
GetCursorPos(&pt);
std::stringstream ss;
ss << "MOUSE " << cursorPos_.x << "," << cursorPos_.y << " (" << pt.x << "," << pt.y << ")";
LOG_INFO(ss.str().c_str());
}
>>633 関係ないけど ,演算子をそんな風に使う人は初めて見た
WAVEFORMATEX構造体のnSamplesPerSecに値がはいらないんですが、どうしてですか?
WAVEFORMATEX FEX;
ZeroMemory(&FEX, sizeof(WAVEFORMATEX));
FEX.nSamplesPerSec = 44100;
ここで変数をみても44100が入ってなくて0なんですけど
>>633 試してないのでわからんけど、マウスカーソルの加速の分がずれてるとか・・・?
>>636 ありがとうございます。「directinput マウス 加速」で検索したら解決しました。
DirectInputではマウスドライバから直接データを得るので、ウィンドウズのカーソルを意識するアプリケーションは
Win32関数かメッセージを使うように書いてありました。
//ローカル回転&ワールド移動 >> ワールド変換行列設定
//
//角度はRAD
HRESULT CDXDevice::SetWorldTransformLW(D3DVECTOR &l_rot, D3DVECTOR &w_trans, int index)
{
D3DXMATRIX mat,mat2;
D3DXMatrixIdentity(&mat);
if (l_rot.x) {
D3DXMatrixRotationX(&mat2, l_rot.x);
D3DXMatrixMultiply( &mat, &mat, &mat2);
}
if (l_rot.z) {
D3DXMatrixRotationZ(&mat2, l_rot.z);
D3DXMatrixMultiply( &mat, &mat, &mat2);
}
if (l_rot.y) {
D3DXMatrixRotationY(&mat2, l_rot.y);
D3DXMatrixMultiply( &mat, &mat, &mat2);
}
D3DXMatrixTranslation( &mat2, w_trans.x, w_trans.y, w_trans.z);
D3DXMatrixMultiply( &mat, &mat, &mat2);
return SetWorldTransform( &mat, index);
}
行列を掛ける順番って x z yなんですか?
望む結果に応じて好きな順序で掛ければ良い
どなたか
>>623の質問に答えられる人はいませんか?
DIRECTXで描画をしながら、Windowsのテキストボックスなどを表示したいのですが
どのような方法がありますでしょうか?
普通にウィンドウにコントロールを作成するだけでは
DIRECTX側のpresentで上書きされてしまい、表示することができません。
ウィンドウモードならば、ウィンドウ作成時にWS_CLIPCHILDRENを指定することで
テキストボックスを部分のみをクリッピングすることができたのですが
フルスクリーンモードでは、当然上書きされてしまいます。
フルスクリーンモードでも通用する、何か良い方法はありませんでしょうか?
GXUT custom UI
ニセフルスクリーンモードにする
>>641 上書きしないところに描かなければ良いだけ
そんな当たり前なことを聞く意味が分からない
上書きしたくなければ、その位置に描くなということだろ
>>644 上書きしなきゃいいって問題じゃない。
GDIサーフェスについて勉強してこい。
設定をフリップにせず、present時に適切に描画位置を指定すれば上書きされない。
いくら無能でもその程度のことぐらい理解出来るだろ。
別途専用ウィンドウを描画する
このメソッドは、Microsoft Windows Graphics Device Interface (GDI) のダイアログ ボックスを、フルスクリーン モードのアプリケーションで使えるようにします。
構文
HRESULT SetDialogBoxMode( BOOL bEnableDialogs );
>>635 どうやって確認してるの
ブレークポイント?
StretchRectでモザイク的なもの作ろうと思ってるんだが、どうもメソッドが失敗しちゃう。
GetRenderTargetで成功しているコピー元とコピー先と同じの使ってるから何とかなると思ったが・・・
しかもMSDNの言ってることがよー分からん。RTテクスチャって何ですか?単純なオフスクリーンってなんですか・・・
天才が居たら助言頼む
そういう用途に使うのなら素直にテクスチャとして、適切に位置指定して描画しろ。
規制で書き込めませんでした…
>>642 DXUTでしょうか? ちょっと調べてみます。
>>643 自前で解像度変更して、ごまかすことも考えたのですが
強制終了した場合に解像度が戻らなくなってしまったりしそうで悩んでいます
>>644 >>648 言ってることはわかりますし、以前にその方法も考えたのですが
コントロールが単純な位置にあり、少ない方形でまとめられるのならまだしも、
「コントロールの位置が固定でなく、しかも複数が散らばる」という
状況ではどうしようもなくなってしまうので止めました。
>>649 テキストボックスから入力が必要な場面のみダイアログを描画、という
方法も考えたのですが、できるだけ1ウィンドウでやりたいと思っております。
(どうしようもなかったら、ダイアログを出そうかとも思っていますが…)
>>650 使用してみましたが、やはりフルスクリーンでは効果がないようです。
色々と調べてみた限りでは、ダイアログやメニューに対して効果があるようですが
ウィンドウに、子ウィンドウとして貼り付けたコントロールにも使用できるのでしょうか?
クリッピング程度の単純な処理すら書けないのなら、
そもそもプログラムを組むのを諦めろ。
>>654 逆に考えるんだ
ダイアログに効果があるのならダイアログに貼り付ければいいだろ
>>655 >>648で言われたようにクリッピング的な処理は調べてみたのですけども、
今回の条件の場合には適切な方法なのでしょうか?
presentにはrect単位で転送領域を区切る方法などもあるようです。
ですが、仮にど真ん中にBOXがあったら、これを避けるように方形で区切ると
上下左右の4個の領域に区切るということになり、
仮にこのコントロールが複数ある場合には、非現実的に思えました。
(見当違いな意見を言っているようでしたら、すいません)
>>656 やはり難しいようなので、ダイアログを使って別ウィンドウに出すか、
もしくは最初に言われたDXUTとやらの勉強を始めてみたいと思います。
一応、presentの「後に」GDIでコントロールの画像を転送する、
という方法でトライしてみましたが、どうもちらついたりしてダメみたいです。
複数矩形があろうが、その分だけ分解すればいいだけ。
その程度のことが非現実的だったら、
Windowsが行っているGUIのクリッピングは超常現象なのか?
まっさきにDXUTのサンプル動かしてみるようじゃないと、今後も苦労しそうだな・・・