views:

265

answers:

1

I am trying to write my first DirectX 10 program that displays a triangle. Everything compiles fine, and the render function is called, since the background changes to black. However, the triangle I'm trying to draw with a triangle strip primitive is not displayed at all.

The Initialization function:

 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;
}

The render function:

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);
}
}
A: 

I'm not sure try to set:

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

after you unmap the the buffer. To get something like this:

pVertexBuffer->Unmap();

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

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

I suspect that locking blows avay buffer binding

dev_null