我是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,¢er,&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,我可以看到三角形但背景为空白。
你们有什么建议吗?
答案 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调用。