1

Direct3D 11 を使用して単純な三角形を画面に表示しようとしていますが、何も表示されません。ここに私の頂点があります:

SimpleVertex vertices[ 3 ] =
{
    { XMFLOAT3( -1.0f, -1.0f, 0.0f ) },
    { XMFLOAT3(  1.0f, -1.0f, 0.0f ) },
    { XMFLOAT3( -1.0f,  1.0f, 0.0f ) },
};

予想される出力は、画面の左上隅に 1 点、画面の右上隅に 1 点、画面の左下隅に 1 点を持つ三角形です。ただし、どこにも何もレンダリングされていません。

マトリックス変換は一切実行しておらず、頂点シェーダーは入力を直接出力に渡すだけです。すべてが正しく設定されているようで、Visual Studio 2012 でグラフィックス デバッガーを使用すると、正しい頂点位置が頂点シェーダーに渡されます。ただし、パイプラインで頂点シェーダー ステージから出力マージ ステージに直接スキップします。これは、ピクセル シェーダーに何も送信されていないことを意味すると思います。これは、ベクトルがラスタライザー ステージで破棄されていることを意味します。なぜこうなった?

これが私のラスタライザの状態です:

D3D11_RASTERIZER_DESC rasterizerDesc;
rasterizerDesc.AntialiasedLineEnable = false;
rasterizerDesc.CullMode = D3D11_CULL_NONE;
rasterizerDesc.DepthBias = 0;
rasterizerDesc.DepthBiasClamp = 0.0f;
rasterizerDesc.DepthClipEnable = true;
rasterizerDesc.FillMode = D3D11_FILL_SOLID;
rasterizerDesc.FrontCounterClockwise = false;
rasterizerDesc.MultisampleEnable = false;
rasterizerDesc.ScissorEnable = false;
rasterizerDesc.SlopeScaledDepthBias = 0.0f;

そして、私のビューポート (幅/高さは、テスト セットアップで 1024x576 に設定されているバック バッファーに一致するウィンドウ クライアント領域です):

D3D11_VIEWPORT viewport;
viewport.Height = static_cast< float >( height );
viewport.MaxDepth = 1.0f;
viewport.MinDepth = 0.0f;
viewport.TopLeftX = 0.0f;
viewport.TopLeftY = 0.0f;
viewport.Width = static_cast< float >( width );

ラスタライズ ステージで頂点がドロップされている原因を特定できる人はいますか? または、これを引き起こしている可能性のある D3D セットアップの他の部分がありますか?

4

2 に答える 2

0

インターネットでこれを見つけました..ロードするのに絶対に時間がかかったので、コピーして貼り付けました.興味深い点を太字で強調しました.

行 11 で定義されている D3D_OVERLOADS コンストラクターは、C++ プログラマーが D3DTLVERTEX を使用してトランスフォームおよびリットされた頂点を作成するための便利な方法を提供します。

_D3DTLVERTEX(const D3DVECTOR& v, float _rhw, D3DCOLOR _color,
         D3DCOLOR _specular, float _tu, float _tv)
{
sx = v.x;
sy = v.y;
sz = v.z;
rhw = _rhw;
color = _color;
specular = _specular;
tu = _tu;
tv = _tv;

}

システムには、変換済みの頂点位置が必要です。したがって、x と y の値は画面座標である必要があり、z はピクセルの深度値である必要があり、z バッファーで使用できます (ここでは z バッファーを使用しません)。Z 値の範囲は 0.0 ~ 1.0 です。0.0 は視聴者に最も近い位置、1.0 は表示領域内でまだ見える最も遠い位置です。位置の直後にある変換されて照らされた頂点には、RHW (同次 W の逆数) 値が含まれている必要があります。

頂点をラスタライズする前に、ラスタライザーがそれらをこのように想定しているため、頂点を同種の頂点から非同種の頂点に変換する必要があります。Direct3D は、x 座標、y 座標、および z 座標を w 座標で除算することによって同種の頂点を非同種の頂点に変換し、w 座標を逆にして RHW 値を生成します。これは、Direct3D によって変換およびライティングされる頂点に対してのみ行われます。RHW 値は、フォグの計算、パースペクティブ コレクト テクスチャ マッピングの実行、および w-buffering (深度バッファリングの代替形式) など、複数の方法で使用されます。

D3D_OVERLOADS が定義されている場合、D3DVECTOR は次のように宣言されます。

_D3DVECTOR(D3DVALUE _x, D3DVALUE _y, D3DVALUE _z);

D3DVALUE は、基本的な Direct3D の小数データ型です。d3dtypes.h で次のように宣言されています。

 typedef float D3DVALUE, *LPD3DVALUE;

ソースは、D3DVECTOR の x 値と y 値が常に 0.0f であることを示しています (これは InitDeviceObjects() で変更されます)。rhw は常に 0.5f、color は 0xfffffff、specular は 0 に設定されています。tu1 と tv1 の値のみが 4 つの頂点間で異なります。これらは背景テクスチャの座標です。

テクセルをプリミティブにマップするために、Direct3D では、すべてのテクスチャのすべてのテクセルに対して均一なアドレス範囲が必要です。したがって、すべてのテクセル アドレスが 0.0 から 1.0 の範囲内にある一般的なアドレッシング スキームを使用します。代わりに、Direct3D がテクスチャの下半分を使用するようにテクスチャ座標を割り当てることにした場合、アプリケーションがこの例でプリミティブの頂点に割り当てるテクスチャ座標は、(0.0,0.0)、(1.0,0.0)、 (1.0,0.5)、および (0.0,0.5)。Direct3D はテクスチャの下半分を背景として適用します。

注: その範囲外のテクスチャ座標を割り当てることで、特定の特殊なテクスチャ効果を作成できます。

フレームワーク ソースの d3dtextr.cpp に、D3DTextr_CreateTextureFromFile() の宣言があります。渡されたファイルからローカル ビットマップを作成します。テクスチャは、*.bmp および *.tga ファイルから作成できます。テクスチャは、テクスチャ コンテナと呼ばれるテクスチャごとの情報を保持するリンクされたリストのフレームワークで管理されます。

 struct TextureContainer
{
TextureContainer* m_pNext; // Linked list ptr

TCHAR   m_strName[80];  // Name of texture (doubles as image filename)
DWORD   m_dwWidth;
DWORD   m_dwHeight;
DWORD   m_dwStage;      // Texture stage (for multitexture devices)
DWORD   m_dwBPP;
DWORD   m_dwFlags;
BOOL    m_bHasAlpha;

LPDIRECTDRAWSURFACE7 m_pddsSurface;  // Surface of the texture
HBITMAP m_hbmBitmap;                 // Bitmap containing texture image
DWORD*  m_pRGBAData;

public:
HRESULT LoadImageData();
HRESULT LoadBitmapFile( TCHAR* strPathname );
HRESULT LoadTargaFile( TCHAR* strPathname );
HRESULT Restore( LPDIRECT3DDEVICE7 pd3dDevice );
HRESULT CopyBitmapToSurface();
HRESULT CopyRGBADataToSurface();

TextureContainer( TCHAR* strName, DWORD dwStage, DWORD dwFlags );
~TextureContainer();
};
于 2013-01-19T17:52:24.773 に答える
0

問題は、実際には私のレンダリング ロジックにありました。頂点構造体のサイズではなく、頂点バッファーのストライドを 0 に設定しました。それを変更すると、うまくレンダリングされます!

于 2013-01-20T10:32:42.610 に答える