ページ 11

DirectXについて

Posted: 2012年7月20日(金) 12:10
by 赤鬼
今、C++でDirectXについて勉強しているのですが一つの事を複数の方法で出来るため逆に勉強し辛くなっています。
例)
テクスチャの一部切り取り
D3DLOCKED_RECT で書き換え
u,vを設定
レンダーターゲットで指定してコピー等


基盤だけ学習した後色々な方法を学びたいと思っている自分にはこれだけでお腹一杯です。
なので、お勧めの文献等はありませんか?
(出来れば内部がどういう仕組みで動いているのかとか載っている文献が欲しいです)

それとmsdnは専門用語多すぎて良く分からず、しかもたまに間違っています。コード等特に。
此処なら実務で使っている人も居ると思うので、良質な答えが見つかると思い質問させていただきました。

Re: DirectXについて

Posted: 2012年7月20日(金) 16:10
by 赤鬼
すみませんバージョン表記を忘れていました。DirectX9です

Re: DirectXについて

Posted: 2012年7月20日(金) 19:20
by ISLe
目的は何でしょうか?
DirectX9を使って何かを作るのではなく、機能を詳しく知りたいということでしょうか?

テクスチャを書き換えるにしても、ロックして書き換えるのはシステムメモリを消費しませんが速度低下のペナルティが大きいと思います。
システムメモリに用意したイメージを書き換えて一気に転送したほうがメモリを大量消費しますが速度低下は少ないかもしれません。
複数のやり方にそれぞれメリット・デメリットがありますから、状況に応じて選択できるように知っておく必要があります。
赤鬼 さんが書きました:それとmsdnは専門用語多すぎて良く分からず、しかもたまに間違っています。コード等特に。
此処なら実務で使っている人も居ると思うので、良質な答えが見つかると思い質問させていただきました。
MSDN以上に詳しい資料は無いと思いますけど。
テクニカルな解説文書も揃ってますし。
英語版なら内容に間違いも無いのでは?

Re: DirectXについて

Posted: 2012年7月21日(土) 14:41
by 赤鬼
ISLe さんが書きました:目的は何でしょうか?
DirectX9を使って何かを作るのではなく、機能を詳しく知りたいということでしょうか?
ちゃんと”使える”ようになるためには詳しく機能を知りたいと思います。
ですが扱うためにはまず、基本的な流れのプログラムを知らなければなりません。
その後に機能を詳しく知る必要があると思います。
例)
テクスチャを描画する場合の自分が知っている(使用できる)基本的な流れ(一部割愛、他にも方法があるのかも知れませんが)
                  まず、オブジェクトの初期化
                  ↓
                  テクスチャの取得、此処で二つに分岐

   テクスチャに貼り付けて表示                     SPRITEを利用する
      ↓                                    ↓
   テクスチャ貼り付け用の(変換済み)ポリゴンを作成      SPRITEの初期化
      ↓                                    ↓
   ポリゴンにテクスチャを貼り付け                  SPRITE使用の為必要なし
      ↓                                    ↓
                  バックバッファをクリア
                     ↓
                  バックバッファに描画
                     ↓
                  表画面に描画
いくつか段階を省いてますがこんな感じでしょうか。
テクスチャバージョンだと更に細分化します(変換無しなら、ワールド変換、射影変換等、他描画方法等、またDrawPrimitiveUPかDrawPrimitiveによっても違いますし、DrawIndexedPrimitive(UP)なら更にインデックスが付きます)。
この細分化の部分も含めて一編に全部詰め込むのはさすがに無理です。
なので、頂点変換済みの場合で言うなら複数の方法一度にでは無くて
まずこれは覚えろ(DirectXでの描画の仕組みを学ぶためDrawPrimitiveに等、簡単だからDrawPrimitiveUPに等、DrawPrimitiveUPでは一々書き直されているの遅い等)と言うような事を書いてあるような書籍は無いかと質問させていただきました。
個人的に一つの方法から分岐して覚えていくほうが覚えやすいと思いますし、何より多すぎるとどこから手をつけてよいのか分からなくなります。
ISLe さんが書きました: テクスチャを書き換えるにしても、ロックして書き換えるのはシステムメモリを消費しませんが速度低下のペナルティが大きいと思います。
システムメモリに用意したイメージを書き換えて一気に転送したほうがメモリを大量消費しますが速度低下は少ないかもしれません。
複数のやり方にそれぞれメリット・デメリットがありますから、状況に応じて選択できるように知っておく必要があります。
解説有難う御座います。

ですが、何故なるかその説明はmsdnにのっていますか?
(ロックする処理、また、ロックして書き換えを行う際にVRAMに何度もアクセスする必要があるから(VRAMにアクセスする速度のほうが遅い、メインメモリはバーストやCPUキャッシュが有る為)、ロックする処理も減る、が逆にアクセス数を減らせばその分システムメモリを使用しなくてはならない。だと思いますが、あってますか?)
探し方が悪いのか見つかりません。(考えの確証が得られないので正しいかどうか不明、あいまいな知識は大きなバグの元です)
自分で考えたら分かるだろといわれても知識が足りずに無理です。
知識が無いならなら調べろといってもどこから手をつけたら良いのか、何を調べたら良いのか分からない状態では調べようがありません。
(もちろん、さすがにmsdnにあるチュートリアル程度は理解できています)

例えばSetRenderStateやSetTextureStageStateなど、こんなの全部把握しろって言うのは無理です。
この中で覚えて置くべきものは~普段使用するようなものは~、というような解説があるようなものを求めています。(別なもの(その範囲外)を使用しなくてはならない時はmsdnやヘルプを見る)
ISLe さんが書きました: MSDN以上に詳しい資料は無いと思いますけど。
テクニカルな解説文書も揃ってますし。
英語版なら内容に間違いも無いのでは?
だから、テクニカルではなく基本的なことを学びたいのですが。(用語とか内部構造とか(例えばD3DCOLORの中がDWORDで、左ビットからα,R,G,B(普通はマクロ使いますけど))。前提知識は基礎だと思うので)
なるほど英語版ですか、英語は其処まで得意ではありませんが、読んでみます。(でも、コードの間違いは修正されてませんよね。’)’付け忘れとか。こぴぺして弄ろうと思った時にエラーが出てきてあせります)

Re: DirectXについて

Posted: 2012年7月22日(日) 00:07
by へにっくす
赤鬼 さんが書きました:考えの確証が得られないので正しいかどうか不明、あいまいな知識は大きなバグの元です
確かにそれは言えますが、その根拠となるところが絶対正しいとどうして言えるのでしょう?
MSDNに載っていても、その言葉の取り方に個人差がある以上、結局は実際に実行してみなければわからないのです。
赤鬼 さんが書きました:この中で覚えて置くべきものは~普段使用するようなものは~、というような解説があるようなものを求めています。
技術資料 アカデミックポータルのDirectX によるゲームプログラミング入門とかはダメなんですかね。
Googleで「基礎」「入門」「DirectX」と検索して見つけましたが、、
赤鬼 さんが書きました:(でも、コードの間違いは修正されてませんよね。’)’付け忘れとか。こぴぺして弄ろうと思った時にエラーが出てきてあせります)
かっこのつけ忘れとか、そういうのはMSDNでは見ないなあ(とゆーかコピペは個人的にしないしw)。
もしあるのなら、MSDNのフォーラムで書き込んで報告するとよいです。

Re: DirectXについて

Posted: 2012年7月22日(日) 00:44
by ISLe
赤鬼 さんが書きました:ちゃんと”使える”ようになるためには詳しく機能を知りたいと思います。
ですが扱うためにはまず、基本的な流れのプログラムを知らなければなりません。
どういう状況が「ちゃんと」なのか、説明していただけないでしょうか。

メリット・デメリットがあるから複数のやり方があるというのは、何がメリットになって何がデメリットになるかは状況によって異なるということです。
覚えて置くべきものは~普段使用するようなものは~というのは一概に決まるものではありません。

基本を押さえるのは、入門者向けの書籍等に書かれている内容で十分なのではないでしょうか?
赤鬼 さんが書きました:(ロックする処理、また、ロックして書き換えを行う際にVRAMに何度もアクセスする必要があるから(VRAMにアクセスする速度のほうが遅い、メインメモリはバーストやCPUキャッシュが有る為)、ロックする処理も減る、が逆にアクセス数を減らせばその分システムメモリを使用しなくてはならない。だと思いますが、あってますか?)
CPUがVRAMにアクセスする際にはPCI Express等のデータバスを通ることになるので、単純に「システムメモリよりアクセスが遅い」という一点だけで理由は十分だと思います。
レンダリングパイプラインに与える影響も大きいとは思いますけど。
オンボードグラフィックでシステムメモリから確保する場合はほとんど変わらないかもしれません。その分グラボのVRAMアクセスが遅いわけですが。
赤鬼 さんが書きました:例えばSetRenderStateやSetTextureStageStateなど、こんなの全部把握しろって言うのは無理です。
この中で覚えて置くべきものは~普段使用するようなものは~、というような解説があるようなものを求めています。(別なもの(その範囲外)を使用しなくてはならない時はmsdnやヘルプを見る)
個人的にはこのくらい全部覚えられないようではいろいろたいへんだと思いますけど。
一字一句覚える必要はないので、どんなことができるかというふうに覚えておくわけですが。

どうしても覚えるのが嫌なら、Direct3D 9をやめてDirect3D 11にしたら良いのではないでしょうか。
固定機能が全廃されて、Set~Stateというもの自体が無くなりましたから。
赤鬼 さんが書きました:だから、テクニカルではなく基本的なことを学びたいのですが。(用語とか内部構造とか(例えばD3DCOLORの中がDWORDで、左ビットからα,R,G,B(普通はマクロ使いますけど))。前提知識は基礎だと思うので)
なるほど英語版ですか、英語は其処まで得意ではありませんが、読んでみます。(でも、コードの間違いは修正されてませんよね。’)’付け忘れとか。こぴぺして弄ろうと思った時にエラーが出てきてあせります)
技術的な内容という意味でテクニカルと書いたんですが誤解させてしまったのでしたらすみません。

MSDNには、APIリファレンスだけではなく、開発ソフトウェアのマニュアルやSDK付属のドキュメントなどもすべて掲載されていることはご存知ですよね。
DirectX SDKのドキュメントの、概要やプログラミングガイドのページは読んだことがありますか?
DirectXの仕組みや効果的なAPIの使い方が詳しく載ってます。
内容が難しくて分からないのなら、分かるようになるための勉強をしてください。

構造体の中身程度のことであれば、インクルードファイルをエディタで開いて実際の定義を見ることができます。

MSDNの日本語のページがボロボロなのは昔からなので、いまさら文句を言っても仕方ない気がします。
#一時期良くなったときもあったんですけど最近またヒドい。
リファレンスの単語そのものが消えてたりリンクになってなかったりリンク先がなかったり、サンプルコード(の一部)がごっそり削れてたり。
基本的に本家英語ページを読むときの参考と考えたほうが良いと思います。

Re: DirectXについて

Posted: 2012年7月22日(日) 16:47
by 赤鬼
へにっくす さんが書きました: 技術資料 アカデミックポータルのDirectX によるゲームプログラミング入門とかはダメなんですかね。
Googleで「基礎」「入門」「DirectX」と検索して見つけましたが、、
有難う御座います!
行列の事しか書いていないものかと思ってました。描画処理とかもしっかり書いてあったんですね。
「directx9」 「講座」とか「directx9」 「入門」で調べても7や8しか出てこなかったので。
へにっくす さんが書きました: かっこのつけ忘れとか、そういうのはMSDNでは見ないなあ(とゆーかコピペは個人的にしないしw)。
もしあるのなら、MSDNのフォーラムで書き込んで報告するとよいです。
まだ、dirextxで一から組めないので(ポリゴンやテクスチャくらいなら出来ますよ、流石に)、引っ張ってきてそれを弄り回しながら理解してます。
何だったか忘れましたが(descの時でしょうか?うーん違うかな)if(FAILED・・・・・)←ここの')'が一個足りませんでした。たしか、この下に定義されてませんエラーが沢山。直ぐに分かりましたが。
ISLe さんが書きました: どういう状況が「ちゃんと」なのか、説明していただけないでしょうか。
関数内でどんな処理が行われているか説明できる程度、また、どちらのほうがどのくらい利点があるのかまた、欠点があるのか説明できる程度です。
関数を使うだけなら理解しなくても、値を入れれば良いだけです。(行列とか最たるものだと思います)
ISLe さんが書きました: メリット・デメリットがあるから複数のやり方があるというのは、何がメリットになって何がデメリットになるかは状況によって異なるということです。
覚えて置くべきものは~普段使用するようなものは~というのは一概に決まるものではありません。

基本を押さえるのは、入門者向けの書籍等に書かれている内容で十分なのではないでしょうか?
何がメリットになって何がデメリットになるかがわからないんですが。
その入門者向けで良いのありませんか?
学生なのでそんなにたくさん書籍を買えるわけではないので、良書が無いかと聞かせてもらったのですが。
ISLe さんが書きました: CPUがVRAMにアクセスする際にはPCI Express等のデータバスを通ることになるので、単純に「システムメモリよりアクセスが遅い」という一点だけで理由は十分だと思います。
レンダリングパイプラインに与える影響も大きいとは思いますけど。
オンボードグラフィックでシステムメモリから確保する場合はほとんど変わらないかもしれません。その分グラボのVRAMアクセスが遅いわけですが。
なるほど、詳しい解説有難う御座います。
あー、オンボードはシステムメモリ割り当てでしたね。
ISLe さんが書きました: 個人的にはこのくらい全部覚えられないようではいろいろたいへんだと思いますけど。
一字一句覚える必要はないので、どんなことができるかというふうに覚えておくわけですが。
なるほど、何がどの効果って事ですね。
が、がんばって覚えます。
ISLe さんが書きました: どうしても覚えるのが嫌なら、Direct3D 9をやめてDirect3D 11にしたら良いのではないでしょうか。
固定機能が全廃されて、Set~Stateというもの自体が無くなりましたから。
ほ、本当ですか!?
でも、途中で投げ出したく無いので9覚えてから、そっちを勉強します。
ISLe さんが書きました: MSDNには、APIリファレンスだけではなく、開発ソフトウェアのマニュアルやSDK付属のドキュメントなどもすべて掲載されていることはご存知ですよね。
DirectX SDKのドキュメントの、概要やプログラミングガイドのページは読んだことがありますか?
DirectXの仕組みや効果的なAPIの使い方が詳しく載ってます。
内容が難しくて分からないのなら、分かるようになるための勉強をしてください。
知りませんでした。Documentationの奴ですね今読んでます。
このくらいの英語なら読めそうです。
凄く詳しく載ってますね、気付かなかったとは。
ただ、やっぱり少し、いやかなり量が多いですね。

Re: DirectXについて

Posted: 2012年7月23日(月) 17:36
by ISLe
赤鬼 さんが書きました:関数内でどんな処理が行われているか説明できる程度、また、どちらのほうがどのくらい利点があるのかまた、欠点があるのか説明できる程度です。
関数を使うだけなら理解しなくても、値を入れれば良いだけです。(行列とか最たるものだと思います)
使うことがなくても説明できるようになりたいということですか?
個人レベルの開発なら、DrawPrimitiveを使わなくてもDrawPrimitiveUPだけでしばらくやっていけると思いますが。
赤鬼 さんが書きました:何がメリットになって何がデメリットになるかがわからないんですが。
その入門者向けで良いのありませんか?
学生なのでそんなにたくさん書籍を買えるわけではないので、良書が無いかと聞かせてもらったのですが。
赤鬼さんが欲しているのは、入門書レベルの知識ではないと思います。
知識だけならSDKに付いてるチュートリアルとサンプルで十分得られますよ。
赤鬼 さんが書きました:なるほど、詳しい解説有難う御座います。
あー、オンボードはシステムメモリ割り当てでしたね。
関わったことはないですけど、XboxはシステムメモリとVRAMのバスを共有しているそうです。
ゲーム機にはPCでの常識が通用しないことがたくさんあります。
もちろんPCでも実際にやってみないと分からないことだらけですが。
赤鬼 さんが書きました:知りませんでした。Documentationの奴ですね今読んでます。
このくらいの英語なら読めそうです。
凄く詳しく載ってますね、気付かなかったとは。
ただ、やっぱり少し、いやかなり量が多いですね。
ジオメトリ処理とかライティング処理とかラスタライズ処理とかいった一般的概念は予備知識として必要です。
内部で行われていることや利点・欠点を知りたいのであれば、このあたりをスラスラ読めるようでないと先へ進めません。
SDKのドキュメントはDirectXがどのように実装しているかという点に重きをおいて書かれているものですから、これでも基礎を抑えてる人を対象に書かれているわけです。

Re: DirectXについて

Posted: 2012年7月24日(火) 09:32
by 赤鬼
ISLe さんが書きました: 使うことがなくても説明できるようになりたいということですか?
そのくらいわかって無いと次には進めないと思って居るので。
ISLe さんが書きました: 関わったことはないですけど、XboxはシステムメモリとVRAMのバスを共有しているそうです。
ゲーム機にはPCでの常識が通用しないことがたくさんあります。
もちろんPCでも実際にやってみないと分からないことだらけですが。
なるほど、なんか厄介ですね。
でも、ゲーム機に触れる機会は無いと思うので(PCでの開発が主になると思うので)
ISLe さんが書きました: ジオメトリ処理とかライティング処理とかラスタライズ処理とかいった一般的概念は予備知識として必要です。
内部で行われていることや利点・欠点を知りたいのであれば、このあたりをスラスラ読めるようでないと先へ進めません。
SDKのドキュメントはDirectXがどのように実装しているかという点に重きをおいて書かれているものですから、これでも基礎を抑えてる人を対象に書かれているわけです。
なるほど。
その辺の一般的概念は一応勉強しているので分かると思います。
シェーダープログラミングまで道は長いですね。

お二人とも有難う御座いました。