2016-11-22 166 views
0

我正在學習DirectX,並試圖確定我在理解函數在做什麼之後,繼續創建索引緩衝區(這就是爲什麼我使用重複頂點而不是特定索引)的原因。我想渲染一個正方形,但我只有一個三角形顯示。我確信這是我誤解了排序順序,或者在傳遞給着色器時抵消了這些值,但我無法找到問題所在。以下是當前的相關代碼和運行時的結果。Vertices not rendering - 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}

應DXGI_FORMAT_R32G32B32_FLOAT作爲位置僅具有三個成員。 AlignedByteOffset可以設置爲12(4x3)。

+0

我必須這樣做,然後將「COLOR」語義的alignedByteOffset設置爲3 * sizeof(float)。我還必須重新進行纏繞順序,使其位於右上角,右下角,左下角,左下角,右上角,左上角。謝謝! – xec86

0

對於拓撲,您可以指定D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP,所以頂點數據有望形成一個triangle strip。但是,你所提供的數據指定了兩個獨立的三角形(即三角形列表),所以你應該使用

devContext->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST); 

基本的錯誤似乎是在Draw()調用:您指定要總共繪製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