0

std ベクター テンプレートの STL コンテナーに頂点データをインターリーブしようとしています。私はすでに OpenGL でこれを成功させています。私のメッシュ インターフェイスのソース コードは、私のオープン ソース プロジェクトでオンラインで入手できます... https://github.com/RobertBColton/enigma-dev/blob/master/ENIGMAsystem/SHELL/Graphics_Systems /OpenGL3/GL3model.cpp

今、私は DirectX を使用して同じ方法を実行したいと考えており、FVF DWORD と各頂点のコンポーネントを論理的に xor することで、部分的に実行することができました。ただし、メッシュに頂点と法線のみが含まれている場合、メッシュは現在次のようにレンダリングされます。

ここに画像の説明を入力

現在、DX では、OGL で行っていたのと同じことを行うのが非常に難しくなっています。チェック、ダブル チェック、何度も何度もチェックした結果、バッファ内でのバイト アラインメントは完璧です。私がやろうとしていることは、OpenGL Wiki でよりよく説明できます... /wiki/Vertex_Specification_Best_Practices#Formatting_VBO_Data

これを達成するためにシェーダーを実装したくありません。誰かが私がやろうとしていることについての指針を提供したり、Direct3D 9 でこれを行う例やチュートリアルの方向性を教えてくれたりすると、DX ではあまり一般的ではないように思われるので、本当に助かります。 .

4

1 に答える 1

2

ここで何をしようとしているのかを詳しく調べたところ、これがあなたが望んでいることだと思います。

D3DVERTEXELEMENT9 custom_vertex [] =
{
  { 0,  0, D3DDECLTYPE_FLOAT3,   D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
  { 0, 12, D3DDECLTYPE_FLOAT3,   D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL,   0 },
  { 0, 24, D3DDECLTYPE_FLOAT2,   D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 },
  { 0, 32, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR,    0 },
  D3DDECL_END()
};

このデータ構造の形式は、OpenGL の Vertex Pointer システムとかなり似ています。コンポーネントのオフセット、サイズ、および数を渡す必要があります (例: D3DDECLTYPE_FLOAT3)。フィールドの目的も含めます (例: D3DDECLUSAGE_COLOR)。D3DDECL_END()OpenGL とは異なり、D3D はマクロを使用するだけでストライドを計算できます。

IDirect3DVertexDeclaration9* vertex_declaration;
d3dDevice->CreateVertexDeclaration (custom_vertex, &vertex_declaration);

これで、この宣言を使用して頂点バッファーを作成して埋めることができます。別の D3DVERTEXELEMENT9 配列を使用して、必要に応じて要素を追加/削除できます。

ただし、DWORD (D3D) または 4 ubyte (OpenGL) カラーを使用することを忘れないでください。90% の確率で浮動小数点色を使用する理由はありません。ストレージとメモリ帯域幅を浪費するだけです。

于 2013-08-30T21:14:35.187 に答える