2013-02-01 82 views
1

我使用directX绘制了严重的纹理,现在为了调试目的,我想围绕纹理绘制线(如此绘制矩形)。但问题是无论我尝试纹理总是出现在行的顶部,无论绘制顺序如何,似乎该行只在背景上绘制,下面是我用于绘制的代码:无法在纹理之上绘制直线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总是会在顶部和顶部渲染,只有纹理尺寸不足以覆盖该线时才能看到部分(它也将灰色背景与线条一起)。任何建议在解决这个问题?

回答

0

你可以有深度缓冲启用

尝试致电:

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

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

+0

我加入这三行内'renderLines()之前''SetFVF'的权利,但没有似乎解决这个问题。此外,我刚刚编辑了这篇文章,并添加了'renderText()',它使用了不同的设备'LPD3DXFONT',但它不受问题的影响。 – ryf9059

+0

如果您禁用精灵绘制,您的线条是否得到正确渲染? – catflier

+0

是的,如果我注释了绘制精灵的线条,线条显示正常,但是使用默认的灰色背景,因为没有别的东西可以绘制 – ryf9059

0

我已经经历过同样的问题,很沮丧,因为这没有太多的信息。 在对设备进行任何绘图调用之前,请务必使用spriteHandler->End();

在你的榜样,而不是 spriteHandler->Begin(D3DXSPRITE_ALPHABLEND); renderSprites(); renderText(); renderLines(); spriteHandler->End();

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