2009-08-28 72 views
0

私はDirectXには絶対に新しく、最も基本的なDirect3D構成(学習目的のため)を持つ変換されていないプリミティブを描きたいと思います。私はすでに変換された頂点を持つプリミティブを描画しました。つまり、D3DFVF_XYZRHWフラグが設定された頂点です。Direct3Dで最も基本的な変換頂点描画

今、変換されていない頂点で同じ出力を得ようとしていますが、画面上にビジュアルは表示されません。私は自分の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); 

ありがとう!

EDIT:これで、ライティングが有効になりました。初心者の間違いです。とにかく助けてくれてありがとう!

答えて

1

あなたの世界、視野、投影行列を同一に設定すれば、あなたが得るものは簡単に通過できます。

xが-1からyは0から1の範囲で-1から1つの
Zの範囲で1
(このビットは問題を引き起こす可能性がある)の範囲であろう。

標準の変形されていないvertsを定義し、その範囲内でそれらを渡すと、画面に表示されます。

これはコードを投稿するのに役立たない場合は、私は何を示唆することができますが表示されます。

編集:Zバッファリングが有効になっていますか?奇妙な問題の原因となるZバッファをクリアしないためです。すべてがこれの背後にレンダリングされるのでレンダリングされません。

この仮説をテストするための設定

pd3dDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS); 

または

pd3dDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); 

また、PIXを使用して、シーンを通過する際に三角形がどのようになるのかを知ることも大変価値があります。

EDIT2:

あなたの問題は、照明から来ていること、その可能性。

pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255, 255, 255), 0.0f, 0); 

をそして、あなたのポリゴンが黒のレンダリングされているかどうかを確認します。また、これにあなたのクリアを変えてみて

すなわち

pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE); 

オフ照明を回してみてください。

+0

良い点、私はzバッファテストを無効にしますが、問題はまだ残っています。 –

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); 
+0

これは答えではありません。問題の一部です!テキストを質問に編集し、回答を削除する必要があります。 – unwind

+0

同意ですが、削除リンクはありません。 –

関連する問題