DirectX10 始めました -第2回-

前回は初期化およびクリア処理までだったので、
今回は最初の三角形をだす部分までをやってみます。

頂点バッファの準備

DirectX10では頂点およびインデックス格納には、バッファオブジェクトが必須です。
以前のDrawPrimitiveUPとかが消えてしまったので。
今回はインデックスを使わずに頂点バッファだけを準備します。

バッファの作成時に、データを設定することが出来ます。
D3D10_USAGE_IMMUTABLEでバッファを作成すると、この初期化タイミングでしかデータを設定することが出来ません。

他に使いそうなフラグとしては、D3D10_USAGE_DYNAMIC, D3D10_USAGE_STAGING があります。
後者の設定は、GPUからCPUにデータを書き戻すときに使用します。

概念自体は従来と変更無く、頂点バッファを作成して、
その中身をサブリソースという設定に従って書き込むという感じでしょうか。

シェーダーの準備(C++側)

ピクセルシェーダー側もほとんど同じなので、ここでは頂点シェーダーだけ説明します。
DX9の頃と変わりなく、シェーダーファイルを読み込んでコンパイルさせ、
そのデータからシェーダーを作成します。

注意点は、頂点シェーダーのシェーダーバイナリである pBlobVSというデータは、
後段で使用するため破棄してはいけません。このあたりがDX9のころと大きく変わっています。

シェーダーの準備(C++) その2

頂点シェーダーのコンパイル結果から、入力レイアウトを作成します。
これは、従来のVertexDeclarationに相当します。

シェーダーファイル

頂点シェーダー、ピクセルシェーダーはこんな感じで作成しました。
今回は最低限で作成するため、定数レジスタは未使用です。

描画処理

今まで準備した各データを設定して描画コールするだけです。

結果

HelloDX10_2 ソースコード

今回の結果プレビューはこんな感じ

苦労したポイント、ひっかかったポイント

今回はいろいろと罠に引っかかりました。
同じように誰かが引っかからないように、また自分の防備録としてここにポイントを記載します。

頂点入力は正しい?

シェーダー内で float4 Col : COLOR などと受け取っていると忘れてしまいがち。
この中には正規化した 0.0-1.0の値が格納されてくること、
頂点データ内にあるときには、各要素8ビットのRGBA値が入っていること期待している。
そのため、頂点カラーは DXGI_FORMAT_R8G8B8A8_UNORMにして入力レイアウトを作成しなくてはならない。

従来 DWORDで送っていたために、つい頂点カラーは DXGI_FORMAT_R8G8B8A8_UINTにしてしまいそうだが、
これをやってしまうと、シェーダーとレイアウトの不一致が起こり描画されない結果となる。

シェーダーはあってる?

いろいろと出力セマンティクスが変わっている。
ここに注意しないと、絵が描画されない結果につながる。

頂点シェーダーからの位置出力

SV_POSITION というセマンティクスで出力する。
従来の POSITION セマンティクスを使ってもコンパイル失敗しないため要注意である。

また色情報については、SV_TARGET というものになっており、
従来の COLOR セマンティクスは有効でないため位置と同じ失敗はしない。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする