2

我有运行带有 Intel 945GSE 芯片组的 Atom N270 的 Windows CE 6。我为 Direct3D Mobile 编写了一个小型测试应用程序,并且遇到了一些奇怪的行为。我每帧只能调用一次 Draw*Primitive。多次调用会导致白屏,好像 Present 失败(即使没有给出错误),或者似乎只处理了第一个调用。

省略消息处理后,渲染循环的主体如下:

HandleD3DMError(pD3DMobileDevice->Clear(0,0,D3DMCLEAR_TARGET | D3DMCLEAR_ZBUFFER ,0xA50AB0F,1.0f,0),_T("Clear"));
if(HandleD3DMError(pD3DMobileDevice->BeginScene(),_T("BeginScene")))
{
    HandleD3DMError(pD3DMobileDevice->SetTexture(0,pTexture), _T("SetTexture"));
    HandleD3DMError(pD3DMobileDevice->SetStreamSource(0,m_pPPVVB[0],sizeof(PrimitiveVertex)),_T("SetStreamSource Failed"));
    HandleD3DMError(pD3DMobileDevice->SetIndices(pIndexBuffer),_T("SetIndices failed"));
    HandleD3DMError(pD3DMobileDevice->DrawIndexedPrimitive(D3DMPT_TRIANGLELIST,0,0,NUM_TRIS*3,0,NUM_TRIS/2),_T("Draw Primitive 1"));
    //HandleD3DMError(pD3DMobileDevice->DrawIndexedPrimitive(D3DMPT_TRIANGLELIST,0,0,NUM_TRIS*3,NUM_TRIS/2 * 3,NUM_TRIS/2),_T("Draw Primitive 2"));

    HandleD3DMError(pD3DMobileDevice->SetStreamSource(0,0,0),_T("SetStreamSource Null Failed"));
    HandleD3DMError(pD3DMobileDevice->SetIndices(0),_T("SetIndices Null failed"));

    HandleD3DMError(pD3DMobileDevice->EndScene(),_T("EndScene"));
}
HandleD3DMError(pD3DMobileDevice->Present(0,0,0,0),_T("Present Failed"));

您可以切换两条DrawIndexedPrimitive()线并分别渲染四个三角形,这是正确的。但是,当它们都存在时,不会呈现任何内容。该HandleD3DMError()函数在发生错误时显示一个消息框。这也是通过初始化完成的。任何时候都不会显示错误。

我尝试绘制不同的原始类型并绘制非索引顶点缓冲区,但没有成功。我能够使用单个缓冲区绘制 10,000 个三角形,但尝试使用多个缓冲区失败(我认为它与多个 Draw 调用问题有关)。

MSDN 上的文档没有提到对 Draw 调用的任何限制。他们甚至提到了您需要进行多次 Draw 调用的情况。我看过的官方样本也只每帧调用一次 Draw*() 。

如果我在一帧中多次尝试和BeginScene()多次EndScene(),则不会渲染任何内容,甚至不会渲染清除的颜色。

如果需要,我可以提供所有来源。

我感谢任何人可以给我的任何帮助。

干杯

4

0 回答 0