无法在纹理DirectX上绘制一条线

时间:2013-02-01 13:40:09

标签: graphics directx rendering directx-9

我正在使用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总是在顶部渲染,只有在纹理大小不足以覆盖该线部分时才能看到线条(这也留下了灰色背景的线条)。有什么建议可以解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

您可以启用深度缓冲区

尝试致电:

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

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

答案 1 :(得分:0)

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

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

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