Direct3D を使用した最も基本的な変換された頂点描画
質問
私は DirectX をまったく使用したことがなく、最も基本的な Direct3D 構成を使用して未変換のプリミティブを描画したいと考えています (学習目的)。変換された頂点、つまり D3DFVF_XYZRHW フラグが設定された頂点を持つプリミティブをいくつか描画しました。
ここで、変換されていない頂点を使用して同じ出力を取得しようとしていますが、画面にビジュアルが表示されません。FVF を変更して頂点を調整しましたが、変換行列 (ワールド、ビュー、投影) をまだ設定していませんでした。これらのマトリックスのいずれかを設定する必要がありますか?マトリックスが設定されていない場合は、変換された頂点の場合と同じようにすべてが機能すると思いますが、明らかにそうではありません。
デフォルトで表示される領域 (ワールド座標) はどれですか?機能させるには何をしなければなりませんか?
これは基本的に私がやっていることです:
struct Vertex
{
float x, y, z;
D3DCOLOR color;
static const DWORD format = D3DFVF_XYZ | D3DFVF_DIFFUSE;
};
const Vertex vertices[] = {
{0.0f, 0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)},
{0.8f, -0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)},
{-0.8f, -0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)}
};
pd3dDevice->CreateVertexBuffer(sizeof(vertices), 0, Vertex::format, D3DPOOL_DEFAULT, &pVB, NULL);
VOID* vertexData = 0;
pVB->Lock(0, sizeof(vertices), &vertexData, 0);
memcpy(vertexData, vertices, sizeof(vertices));
pVB->Unlock();
D3DMATRIX matrixIdentitiy;
ZeroMemory(&matrixIdentitiy, sizeof(matrixIdentitiy));
matrixIdentitiy._11 = 1.0f;
matrixIdentitiy._22 = 1.0f;
matrixIdentitiy._33 = 1.0f;
matrixIdentitiy._44 = 1.0f;
pd3dDevice->SetTransform(D3DTS_WORLD, &matrixIdentitiy);
pd3dDevice->SetTransform(D3DTS_VIEW, &matrixIdentitiy);
pd3dDevice->SetTransform(D3DTS_PROJECTION, &matrixIdentitiy);
pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 0.0f, 0);
pd3dDevice->BeginScene();
pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
pd3dDevice->SetRenderState(D3DRS_CLIPPING, FALSE);
pd3dDevice->SetRenderState( D3DRS_ZFUNC, D3DCMP_ALWAYS );
pd3dDevice->SetStreamSource(0, pVB, 0, sizeof(Vertex));
pd3dDevice->SetFVF(Vertex::format);
pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
pd3dDevice->EndScene();
pd3dDevice->Present(NULL, NULL, NULL, NULL);
前もって感謝します!
編集:今、私はそれを理解しました、照明が有効になりました、愚かな初心者の間違い。とにかく助けてくれてありがとう!
解決
ワールド、ビュー、射影行列をアイデンティティに設定すると、得られるものは単純なパススルーになります。
x の範囲は -1 から 1 までです
y の範囲は -1 から 1 です
z の範囲は 0 ~ 1 (このビットは問題を引き起こす可能性があります)。
次に、標準の変換されていない頂点を定義し、その範囲内に渡すと、画面上に表示されます。
それでも問題が解決しない場合は、コードを投稿してください。提案できる内容を確認します。
編集:Zバッファリングを有効にしていますか?Zバッファをクリアしないと、奇妙な問題が発生する可能性があるためです。すべてがこの背後でレンダリングされるため、レンダリングされることはありません。
セット
pd3dDevice->SetRenderState( D3DRS_ZFUNC, D3DCMP_ALWAYS );
または
pd3dDevice->SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE );
この仮説を検証するために。
また、PIX の使用方法を学び、シーンを通過するときに三角形に何が起こるかを確認することも非常に価値があります。
編集2:
問題が照明に起因している可能性があります。照明を消してみてください
つまり
pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
また、Clear を次のように変更してみてください。
pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255, 255, 255), 0.0f, 0);
そして、ポリゴンが黒くレンダリングされているかどうかを確認してください。
他のヒント
これは私が何をすべきか、基本的には、次のとおりです。
struct Vertex
{
float x, y, z;
D3DCOLOR color;
static const DWORD format = D3DFVF_XYZ | D3DFVF_DIFFUSE;
};
const Vertex vertices[] = {
{0.0f, 0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)},
{0.8f, -0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)},
{-0.8f, -0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)}
};
pd3dDevice->CreateVertexBuffer(sizeof(vertices), 0, Vertex::format, D3DPOOL_DEFAULT, &pVB, NULL);
VOID* vertexData = 0;
pVB->Lock(0, sizeof(vertices), &vertexData, 0);
memcpy(vertexData, vertices, sizeof(vertices));
pVB->Unlock();
D3DMATRIX matrixIdentitiy;
ZeroMemory(&matrixIdentitiy, sizeof(matrixIdentitiy));
matrixIdentitiy._11 = 1.0f;
matrixIdentitiy._22 = 1.0f;
matrixIdentitiy._33 = 1.0f;
matrixIdentitiy._44 = 1.0f;
pd3dDevice->SetTransform(D3DTS_WORLD, &matrixIdentitiy);
pd3dDevice->SetTransform(D3DTS_VIEW, &matrixIdentitiy);
pd3dDevice->SetTransform(D3DTS_PROJECTION, &matrixIdentitiy);
pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 0.0f, 0);
pd3dDevice->BeginScene();
pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
pd3dDevice->SetRenderState(D3DRS_CLIPPING, FALSE);
pd3dDevice->SetStreamSource(0, pVB, 0, sizeof(Vertex));
pd3dDevice->SetFVF(Vertex::format);
pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
pd3dDevice->EndScene();
pd3dDevice->Present(NULL, NULL, NULL, NULL);