1

我正在使用 directX 绘制大量纹理,现在出于调试目的,我想在纹理周围绘制线条(也就是说绘制一个矩形)。但问题是无论我尝试什么,无论绘制顺序如何,纹理总是出现在线条的顶部,并且似乎线条只在背景上绘制,这是我用于绘制的代码:

设备:

LPDIRECT3DDEVICE9       graphicsDevice; // this is used for drawing lines
LPD3DXSPRITE            spriteHandler; // this is used for drawing texture
LPD3DXFONT              textRect; // this is used for drawing texts

渲染代码:

graphicsDevice->Clear(0, NULL, D3DCLEAR_TARGET, BACKGROUND_COLOR, 1.0f, 0);
graphicsDevice->BeginScene();
spriteHandler->Begin(D3DXSPRITE_ALPHABLEND);
renderSprites();
renderText();
renderLines();
spriteHandler->End();
graphicsDevice->EndScene();
graphicsDevice->Present(NULL, NULL, NULL, NULL);


void DirectXGraphics::renderSprites()
{
    spriteHandler->Draw( texture, 
                     rect,
                     NULL,
                     &position,
                     DEFAULT_ALPHA_COLOR);
}

void DirectXGraphics::renderLines()
{
    graphicsDevice->SetFVF(D3DFVF_XYZRHW|D3DFVF_DIFFUSE);
    graphicsDevice->DrawPrimitiveUP(D3DPT_LINESTRIP, 
                        g_width,                    
                        LINES,              
                        sizeof(VERTEX_LIST));      
}

void DirectXGraphics::renderText()
{
      textFont->DrawText (  spriteHandler, 
                    lpcwstrText, 
                    -1, 
                    &textRect, 
                    DT_LEFT, 
                    fontColor );   
}

有趣的是,textfont 不受这个问题的影响,受制于绘制顺序(可能是因为我已经spriteManager作为参数传递了)。

我的猜测是,我用来绘制的不同设备可能存在优先级,并且 spriteHandler 总是在顶部渲染,并且只有在纹理大小不足以覆盖该行部分时才能看到行(这会留下连同灰色背景一起去掉线条)。解决这个问题有什么建议吗?

4

2 回答 2

0

您可以启用深度缓冲区

尝试调用:

graphicsDevice->SetRenderState(D3DRS_ZENABLE,D3DZB_FALSE);
graphicsDevice->SetRenderState(D3DRS_ZWRITEENABLE,FALSE);
graphicsDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_ALWAYS);

在 renderLines 中(在绘制调用之前),通常应该修复它。

于 2013-02-01T14:05:18.680 回答
0

我遇到了同样的问题,令人沮丧,因为这没有太多信息。确保spriteHandler->End();在对设备进行任何绘制调用之前进行。

在您的示例中,而不是 spriteHandler->Begin(D3DXSPRITE_ALPHABLEND); renderSprites(); renderText(); renderLines(); spriteHandler->End();

切换到: spriteHandler->Begin(D3DXSPRITE_ALPHABLEND); renderSprites(); renderText(); spriteHandler->End(); renderLines();

于 2017-11-06T02:55:40.347 回答