2010-02-28 28 views
3

我正在嘗試編寫我的第一個顯示三角形的DirectX 10程序。所有東西都編譯得很好,並且調用了渲染函數,因爲背景變成了黑色。但是,我試圖用三角形條形圖元繪製的三角形根本不顯示。DirectX 10原始圖不顯示

初始化函數:

bool InitDirect3D(HWND hWnd, int width, int height) 
{ 
//****** D3DDevice and SwapChain *****// 

DXGI_SWAP_CHAIN_DESC swapChainDesc; 
ZeroMemory(&swapChainDesc, sizeof(swapChainDesc)); 

swapChainDesc.BufferCount = 1; 
swapChainDesc.BufferDesc.Width = width; 
swapChainDesc.BufferDesc.Height = height; 
swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; 
swapChainDesc.BufferDesc.RefreshRate.Numerator = 60; 
swapChainDesc.BufferDesc.RefreshRate.Denominator = 1; 
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; 
swapChainDesc.OutputWindow = hWnd; 
swapChainDesc.SampleDesc.Count = 1; 
swapChainDesc.SampleDesc.Quality = 0; 
swapChainDesc.Windowed = TRUE; 

if (FAILED(D3D10CreateDeviceAndSwapChain( NULL, 
              D3D10_DRIVER_TYPE_HARDWARE, 
              NULL, 
              0, 
              D3D10_SDK_VERSION, 
              &swapChainDesc, 
              &pSwapChain, 
              &pD3DDevice))) 
    return fatalError(TEXT("Hardware does not support DirectX 10!")); 

//***** Shader *****// 

if (FAILED(D3DX10CreateEffectFromFile( TEXT("basicEffect.fx"), 
             NULL, NULL, 
             "fx_4_0", 
             D3D10_SHADER_ENABLE_STRICTNESS, 
             0, 
             pD3DDevice, 
             NULL, 
             NULL, 
             &pBasicEffect, 
             NULL, 
             NULL))) 
    return fatalError(TEXT("Could not load effect file!")); 

pBasicTechnique = pBasicEffect->GetTechniqueByName("Render"); 

pViewMatrixEffectVariable = pBasicEffect->GetVariableByName("View")->AsMatrix(); 
pProjectionMatrixEffectVariable = pBasicEffect->GetVariableByName("Projection")->AsMatrix(); 
pWorldMatrixEffectVariable = pBasicEffect->GetVariableByName("World")->AsMatrix(); 

//***** Input Assembly Stage *****// 

D3D10_INPUT_ELEMENT_DESC layout[] = 
{ 
    {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0}, 
    {"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0} 
}; 
UINT numElements = 2; 

D3D10_PASS_DESC PassDesc; 
pBasicTechnique->GetPassByIndex(0)->GetDesc(&PassDesc); 
if (FAILED(pD3DDevice->CreateInputLayout( layout, 
              numElements, 
              PassDesc.pIAInputSignature, 
              PassDesc.IAInputSignatureSize, 
              &pVertexLayout))) 
    return fatalError(TEXT("Could not create Input Layout.")); 

pD3DDevice->IASetInputLayout(pVertexLayout); 

//***** Vertex buffer *****// 

UINT numVertices = 100; 

D3D10_BUFFER_DESC bd; 
bd.Usage = D3D10_USAGE_DYNAMIC; 
bd.ByteWidth = sizeof(vertex) * numVertices; 
bd.BindFlags = D3D10_BIND_VERTEX_BUFFER; 
bd.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE; 
bd.MiscFlags = 0; 

if (FAILED(pD3DDevice->CreateBuffer(&bd, NULL, &pVertexBuffer))) 
    return fatalError(TEXT("Could not create vertex buffer!"));; 

UINT stride = sizeof(vertex); 
UINT offset = 0; 
pD3DDevice->IASetVertexBuffers(0, 1, &pVertexBuffer, &stride, &offset); 


//***** Rasterizer *****// 

// Set the viewport 
viewPort.Width = width; 
viewPort.Height = height; 
viewPort.MinDepth = 0.0f; 
viewPort.MaxDepth = 1.0f; 
viewPort.TopLeftX = 0; 
viewPort.TopLeftY = 0; 
pD3DDevice->RSSetViewports(1, &viewPort); 

D3D10_RASTERIZER_DESC rasterizerState; 
rasterizerState.CullMode = D3D10_CULL_NONE; 
rasterizerState.FillMode = D3D10_FILL_SOLID; 
rasterizerState.FrontCounterClockwise = true; 
rasterizerState.DepthBias = false; 
rasterizerState.DepthBiasClamp = 0; 
rasterizerState.SlopeScaledDepthBias = 0; 
rasterizerState.DepthClipEnable = true; 
rasterizerState.ScissorEnable = false; 
rasterizerState.MultisampleEnable = false; 
rasterizerState.AntialiasedLineEnable = true; 

ID3D10RasterizerState* pRS; 
pD3DDevice->CreateRasterizerState(&rasterizerState, &pRS); 
pD3DDevice->RSSetState(pRS); 


//***** Output Merger *****// 

// Get the back buffer from the swapchain 
ID3D10Texture2D *pBackBuffer; 
if (FAILED(pSwapChain->GetBuffer(0, __uuidof(ID3D10Texture2D), (LPVOID*)&pBackBuffer))) 
    return fatalError(TEXT("Could not get back buffer.")); 

// create the render target view 
    if (FAILED(pD3DDevice->CreateRenderTargetView(pBackBuffer, NULL, &pRenderTargetView))) 
    return fatalError(TEXT("Could not create the render target view.")); 

// release the back buffer 
pBackBuffer->Release(); 

// set the render target 
pD3DDevice->OMSetRenderTargets(1, &pRenderTargetView, NULL); 

return true; 
} 

渲染功能:

void Render() 
{ 
if (pD3DDevice != NULL) 
{ 
    pD3DDevice->ClearRenderTargetView(pRenderTargetView, D3DXCOLOR(0.0f, 0.0f, 0.0f, 0.0f)); 

    //create world matrix 
    static float r; 
    D3DXMATRIX w; 
    D3DXMatrixIdentity(&w); 
    D3DXMatrixRotationY(&w, r); 
    r += 0.001f; 

    //set effect matrices 
    pWorldMatrixEffectVariable->SetMatrix(w); 
    pViewMatrixEffectVariable->SetMatrix(viewMatrix); 
    pProjectionMatrixEffectVariable->SetMatrix(projectionMatrix); 

    //fill vertex buffer with vertices 
    UINT numVertices = 3; 
    vertex* v = NULL; 

    //lock vertex buffer for CPU use 
    pVertexBuffer->Map(D3D10_MAP_WRITE_DISCARD, 0, (void**) &v); 

    v[0] = vertex(D3DXVECTOR3(-1,-1,0), D3DXVECTOR4(1,0,0,1)); 
    v[1] = vertex(D3DXVECTOR3(0,1,0), D3DXVECTOR4(0,1,0,1)); 
    v[2] = vertex(D3DXVECTOR3(1,-1,0), D3DXVECTOR4(0,0,1,1)); 

    pVertexBuffer->Unmap(); 

    // Set primitive topology 
    pD3DDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); 

    //get technique desc 
    D3D10_TECHNIQUE_DESC techDesc; 
    pBasicTechnique->GetDesc(&techDesc); 

    for(UINT p = 0; p < techDesc.Passes; ++p) 
    { 
      //apply technique 
      pBasicTechnique->GetPassByIndex(p)->Apply(0); 

      //draw 
      pD3DDevice->Draw(numVertices, 0); 
    } 

    pSwapChain->Present(0,0); 
} 
} 
+0

我不知道,如果你的代碼工作。但要確保「相機」正在看物體,並且它看起來足夠大。 – 2010-02-28 12:16:24

回答

0

我不知道嘗試設置:

pD3DDevice->IASetVertexBuffers(0, 1, &pVertexBuffer, &stride, &offset);

您取消映射的緩衝區後。爲了得到這樣的:

pVertexBuffer->Unmap(); 

pD3DDevice->IASetVertexBuffers(0, 1, &pVertexBuffer, &stride, &offset); 

// Set primitive topology 
pD3DDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); 

我懷疑,鎖定打擊avay緩衝結合