2016-11-22 10 views
0

私はDirectXを学び、インデックスバッファの作成に移る前に、関数が何をしているのかを理解しようとしています(特定のインデックスの代わりに繰り返しのVerticesを使用しています)。四角形をレンダリングしようとしていますが、三角形を1つしか表示しません。私は巻き線の順序の誤解やシェーダーに渡すときに値をオフセットすることは確かですが、私は問題を見つけることができません。以下は現在の関連コードと実行時の結果です。トポロジーのために頂点がレンダリングされない - DirectX

void RenderFrame(void) { 

// Clear BackBuffer to a color 
devContext->ClearRenderTargetView(backbuffer, D3DXCOLOR(0.0f, 0.2f, 0.4f, 1.0f)); 

// select which vertex buffer to display 
UINT stride = sizeof(Vertex); 
UINT offset = 0; 
devContext->IASetVertexBuffers(0, 1, &pVBuffer, &stride, &offset); 

// select which primtive type we are using 
devContext->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELST); 

// draw the vertex buffer to the back buffer 
devContext->Draw(6, 0); 

// swap buffers 
swapchain->Present(0, 0); 
} 

void ParseGraphics() { 

// Create a triangle with the Vertex Struct 
Vertex square[] = 
{ 
    { 0.2f, 0.5f, 0.5f, D3DXCOLOR(0.0f, 0.0f, 1.0f, 1.0f) }, //top-right 
    { 0.2f, -0.5f, 0.5f, D3DXCOLOR(0.0f, 0.0f, 0.0f, 1.0f) }, //bottom-right 
    { -0.2f, -0.5f, 0.5f, D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f) }, //bottom-left 
    { 0.2f, -0.5f, 0.5f, D3DXCOLOR(0.0f, 0.0f, 0.0f, 1.0f) }, //bottom-right 
    { -0.2f, -0.5f, 0.5f, D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f) }, //bottom-left 
    { -0.2f, 0.5f, 0.5f, D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f) }, //top-left 


}; 

// Create Vertex Buffer 
D3D11_BUFFER_DESC bd; 
ZeroMemory(&bd, sizeof(bd)); 

bd.Usage = D3D11_USAGE_DYNAMIC; 
bd.ByteWidth = sizeof(Vertex) * 6; 
bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; 
bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; 

dev->CreateBuffer(&bd, NULL, &pVBuffer); 

// copy vertices into buffer 
D3D11_MAPPED_SUBRESOURCE msr; 
devContext->Map(pVBuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &msr); 
memcpy(msr.pData, square, sizeof(square)); 
devContext->Unmap(pVBuffer, NULL); 

} 

void BuildPipeline() { 
// Load and Compile Shaders 
ID3D10Blob *VS, *PS; 
D3DX11CompileFromFile(L"shaders.shader", 0, 0, "VShader", "vs_5_0", 0, 0, 0, &VS, 0, 0); 
D3DX11CompileFromFile(L"shaders.shader", 0, 0, "PShader", "ps_5_0", 0, 0, 0, &PS, 0, 0); 

// Create shaders from the data in the Blobs Buffer 
dev->CreateVertexShader(VS->GetBufferPointer(), VS->GetBufferSize(), NULL, &pVS); 
dev->CreatePixelShader(PS->GetBufferPointer(), PS->GetBufferSize(), NULL, &pPS); 

// Apply Shaders to the device context 
devContext->VSSetShader(pVS, 0, 0); 
devContext->PSSetShader(pPS, 0, 0); 

// Define the layout of the input given to the shaders 
D3D11_INPUT_ELEMENT_DESC ied[] = 
{ 
    {"POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}, 
    {"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0}, 

}; 

dev->CreateInputLayout(ied, 2, VS->GetBufferPointer(), VS->GetBufferSize(), &pLayout); 
devContext->IASetInputLayout(pLayout); 

} 

DirectX render

答えて

1

{ "POSITION"、0、DXGI_FORMAT_R32G32B32 A32 _float、0、0、D3D11_INPUT_PER_VERTEX_DATA、0}の位置は3つだけの部材を有するよう

はDXGI_FORMAT_R32G32B32_FLOATであるべきです。 AlignedByteOffsetは12(4x3)に設定できます。

+0

私はこれをして、 "COLOR"セマンティックのalignedByteOffsetを3 * sizeof(float)に設定しなければなりませんでした。右上、右下、左下、左下、右上、左上になるように巻き線順序を再設定する必要もありました。ありがとう! – xec86

0

頂点データをtriangle stripを形成すると予想されるので、あなたは、D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIPを指定します。しかし、あなたが提供するデータは、2つの別々の三角形(すなわち三角形リスト)を指定しますので、あなたはおそらく不可欠なミスがコール)(ドローであるように思わ

devContext->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST); 

使用する必要があります:あなたは、あなたがしたいことを指定します合計3つの頂点を描画しますが、実際にはバッファから6つの頂点すべてを描画します。私。

devContext->Draw(6, 0); 

Color要素の説明のバイトオフセットも間違っています。この位置は3つの単精度浮動小数点数(3 * 4 = 12バイト)を取り、その直後にカラーデータが続きます。

{"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0}, 
+0

ご返信ありがとうございます。私はあなたが最初に言及したコンフィギュレーションを持っていましたが、私はTRINAGLESTRIPとDraw(3,0)をそこに残していたことを認識しませんでした。投稿を編集して正しいコードを表示しましたが、残念ながらレンダリングされたものに変更はありませんでした。 – xec86

関連する問題