2016-11-22 5 views
0

Я изучаю DirectX и стараюсь, чтобы я понял, что делают эти функции, прежде чем я перейду к созданию буфера индекса (именно поэтому я использую повторяющиеся вершины вместо конкретных индексов). Я пытаюсь сделать квадрат, но у меня есть только один треугольник. Я уверен, что это мое непонимание порядка намотки или смещение значений при переходе к шейдеру, но я не могу найти проблему. Ниже приведен текущий код и результат во время выполнения.Вершины без рендеринга - 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

{ "ПОЛОЖЕНИЕ", 0, DXGI_FORMAT_R32G32B32 А32 _FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}

должно быть DXGI_FORMAT_R32G32B32_FLOAT как позиция имеет только три члена. Параметр AlignedByteOffset может быть установлен в 12 (4x3).

+0

Мне пришлось это сделать, а затем установить alignedByteOffset семантики COLOR для 3 * sizeof (float). Мне также пришлось повторить порядок намотки, чтобы он был сверху справа, внизу справа, внизу слева, внизу слева, сверху справа, сверху-слева. Благодаря! – xec86

0

Для топологии, необходимо указать D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP, поэтому данные вершин, как ожидается, сформировать triangle strip. Тем не менее, данные, которые вы предоставить определяет два отдельных треугольников (то есть список в треугольник), так что вы, вероятно, следует использовать

devContext->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST); 

Существенная ошибка, кажется, в Draw() вызов: вы указываете, что вы хотите нарисуйте в общей сложности 3 вершины, в то время как вы действительно хотите нарисовать все 6 вершин из своего буфера. То есть

devContext->Draw(6, 0); 

Смещение байта вашего описания цветового элемента также неверно. Позиция занимает 3 одинарные прецизионные поплавки (3 * 4 = 12 байтов), и за ними сразу следуют данные о цвете.

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

Спасибо за ваш ответ. У меня была конфигурация, о которой вы говорили первоначально, и не понимала, что я оставил там TRINAGLESTRIP и Draw (3,0). Я редактировал сообщение, чтобы показать правильный код, но, к сожалению, не было изменений в том, что было показано. – xec86

 Смежные вопросы

  • Нет связанных вопросов^_^