创建一个茶壶的网格,把网格的顶点和索引导出再画出来
ID3DXMesh *Teapot;

D3DXCreateTeapot(dev,&Teapot,NULL); dev->BeginScene();
Teapot->DrawSubset(0);
dev->EndScene();
dev->Present(0,0,0,0);
        //注意这里已经Clear过了,所以上面那些代码理论上应该和下面无关
dev->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0); IDirect3DVertexBuffer9 *VertextBuffer;
IDirect3DIndexBuffer9 *IndexBuffer;
DWORD NumFaces=Teapot->GetNumFaces();
DWORD NumVertices=Teapot->GetNumVertices();
DWORD BytesPerVertex=Teapot->GetNumBytesPerVertex();
DWORD VertexFVF=Teapot->GetFVF();
if((NumFaces==0) || (NumVertices==0) || (BytesPerVertex==0) || (VertexFVF==0))MessageBox(NULL,TEXT("Get Something Failed!!"),TEXT(""),MB_OK);
if(Teapot->GetVertexBuffer(&VertextBuffer)!=D3D_OK)MessageBox(NULL,TEXT("GetVertexBuffer() Failed!!"),TEXT(""),MB_OK);
if(Teapot->GetIndexBuffer(&IndexBuffer)!=D3D_OK)MessageBox(NULL,TEXT("GetIndexBuffer() Failed!!"),TEXT(""),MB_OK);
if(dev->SetStreamSource(0,VertextBuffer,0,BytesPerVertex)!=D3D_OK)MessageBox(NULL,TEXT("SetStreamSource() Failed!!"),TEXT(""),MB_OK);

dev->BeginScene();
if(dev->DrawPrimitive(D3DPT_TRIANGLELIST,0,NumFaces)!=D3D_OK)MessageBox(NULL,TEXT("DrawPrimitive() Failed!!"),TEXT(""),MB_OK);
if(dev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,NumVertices,0,NumFaces)!=D3D_OK)MessageBox(NULL,TEXT("DrawIndexedPrimitive() Failed!!"),TEXT(""),MB_OK);
dev->EndScene();
dev->Present(0,0,0,0);
嗯,一切正常,好球!!
但是
如果去掉5~8行,也就是
dev->BeginScene();
Teapot->DrawSubset(0);
dev->EndScene();
dev->Present(0,0,0,0);
这些代码的话,
DrawPrimitive和DrawIndexedPrimitive的返回值都不为D3D_OK(也就是说函数失败了)
但是明明已经Clear过了,那些代码和下面应该是一点联系都没有!!!!
(理应)没有联系的东西决定着函数的结果!!!!
it's not scientific!!!!
大神大神大神大神

解决方案 »

  1.   

    排除法,看应该是DrawPrimitive()函数和DrawIndexedPrimitive()函数不接受来自Teapot的顶点和索引。
    嗯,你注释掉DrawPrimitive()函数看看。
      

  2.   


    实验了下发现只和Teapot->DrawSubset(0);有关
    如果没有这行就会出错
    codeproject.com的人说可能是DrawSubset会创建一个TriangleList..
    觉得不怎么靠谱。。
    http://www.codeproject.com/Questions/542714/Aplusreallyplusweirdplusdirectx-direct3d-plusprobl
      

  3.   

    应该是。试想一下,DrawSubset( i )是根据i(DWORD类型)来绘制的,也就是说,在i确定后,根据网格的不同子集(i的值)来渲染。内部呢,生成了一些TRIANGLELIST。
    其实GetVertexBuffer()和GetIndexBuffer()函数对于我们来说用来修改网格的内部坐标以及一些参数也就够了。不应该单独拿出来结合DrawPrimitive()函数来进行绘制。所以你的实验表明,GetVertexBuffer()是在DrawSubset( i )这个函数内部生成了TRIANGLELIST后才会返回正确的纹理指针。