//顶点声明
OnD3D9CreateDevice()
{
     ....
     D3DVERTEXELEMENT9 decl[] =
    {
        { 0, 0, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
        D3DDECL_END()
    };    V_RETURN( pd3dDevice->CreateVertexDeclaration( decl, &g_pVertexDeclaration ) );
    ..
}
//顶点结构
OnD3D9ResetDevice()
{
......
// Setup render states
    pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
    pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );  // Create and initialize vertex buffer测试,用最简单的三角形
    V_RETURN( pd3dDevice->CreateVertexBuffer( 3 * sizeof( D3DXVECTOR2 ),
                                              0, 0,
                                              D3DPOOL_DEFAULT, &g_pVB, NULL ) );    D3DXVECTOR2* pVertices;
    V_RETURN( g_pVB->Lock( 0, 0, ( void** )&pVertices, 0 ) );    for( WORD i =0; i<3; i++)
{
*pVertices++= D3DXVECTOR2( 200*sinf( i*D3DX_PI/4.0)+300, 200*cosf( i*D3DX_PI/4.0)+250);
}    V_RETURN( hr = g_pVB->Unlock() ); //Create and initialize index buffer    WORD* pIndices;
    V_RETURN( pd3dDevice->CreateIndexBuffer( 3 * sizeof( WORD ),
                                             0, D3DFMT_INDEX16,
                                             D3DPOOL_DEFAULT, &g_pIB, NULL ) );
    V_RETURN( g_pIB->Lock( 0, 0, ( void** )&pIndices, 0 ) );    pIndices[0] = ( WORD )( 0 );
    pIndices[1] = ( WORD )( 1 );
    pIndices[2] = ( WORD )( 2 );
     
    V_RETURN( g_pIB->Unlock() );
......
}
//画三角形
OnD3D9FrameRender()
{
..
    if( SUCCEEDED( pd3dDevice->BeginScene() ) )
    { pd3dDevice->SetVertexDeclaration( g_pVertexDeclaration );
pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof( D3DXVECTOR2 ) );
pd3dDevice->SetIndices( g_pIB );
V( pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 0, 3,
                                              0, 1 ) );
..
}
我怎么看都找不到问题啊,问什么一运行就说D3DERE_INVALIDCAL(0x887686c)
Calling:pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 0, 3, 0, 1 )如果不用索引模式,就没事,为什么呢?请求帮助

解决方案 »

  1.   

    我用的是定点声明,没用FVF,不是这里的问题
      

  2.   

    index是4个点确定2个三角形.
    // Create and initialize vertex buffer测试,用最简单的三角形
        V_RETURN( pd3dDevice->CreateVertexBuffer( 3 * sizeof( D3DXVECTOR2 ),
                                                  0, 0,
                                                  D3DPOOL_DEFAULT, &g_pVB, NULL ) );
    设置4点试试.
      

  3.   

    找到原因了,特此记录下:
    在顶点声明里
    { 0, 0, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
    如果用D3DDECLTYPE_FLOAT2,则必须在vertex shader中重写为FLOAT3
    否则必须用D3DDECLTYPE_FLOAT3这个参数。
    对于固定流水线来说,好像不认FLOAT2的。
    这个错误是通过PIX查到的