2D Sprite(背景)前面的3D对象,怎么样?

时间:2011-04-01 10:05:03

标签: c++ 2d sprite direct3d augmented-reality

我是Direct3D的新手,我参与了一个从网络摄像头拍摄照片并在其前面绘制一些3D物体的项目。

我能够使用正交投影将网络摄像头图像渲染为背景。

//init matrix


     D3DXMatrixOrthoLH(&Ortho, frameWidth, frameHeight, 0.0f, 100.0f);

//some code

     D3DXVECTOR3 position = D3DXVECTOR3(0.0f, 0.0f, 100.0f);
     g_pSprite->Begin(D3DXSPRITE_OBJECTSPACE);
     g_pSprite->Draw(g_pTexture,NULL,&center,&position,0xFFFFFFFF);
     g_pSprite->End();

然后我尝试在它前面插入一个简单的三角形。矩阵设置如下

D3DXMATRIXA16 matWorld;


D3DXMatrixTranslation( &matWorld, 0.0f,0.0f,5.0f );
g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );


D3DXMATRIXA16 matProj;
D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI / 4, 1.0f, 1.0f, 100.0f );
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );

5.0应该< 100.0并且三角形应该出现在图像的前面。但是,除非将z位置设置为0,否则它不会出现。在位置0,我可以看到三角形但背景为空白。

你们有什么建议吗?

2 个答案:

答案 0 :(得分:2)

如果您打算仅将图片用于背景目的,我不会在对象空间(D3DXSPRITE_OBJECTSPACE)中绘制网络摄像头图像;

之类的东西
        D3DXVECTOR3 backPos (0.f, 0.f, 0.f);
        pBackgroundSprite->Begin(D3DXSPRITE_ALPHABLEND);
        pBackgroundSprite->Draw (pBackgroundTexture,
                           0, 
                           0,
                           &backPos,
                           0xFFFFFFFF);
        pBackgroundSprite->End();

应该有希望做你想要的。

答案 1 :(得分:1)

作为快速修复,您可以按如下方式禁用深度测试;

g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);

这样绘制的图元的z-index应该反映它们的绘制顺序。

另外,尝试使用PIX调试工具(这与DirectX SDK捆绑在一起)。这始终是我绘制差异的第一个调用端口,因为它允许您通过访问深度缓冲区和变换顶点分别调试每个Draw调用。