2011-04-30 93 views
0

我想寫一個非常簡單的影響爲它使用ID3DXSprite界面繪製2D 一個的DirectX程序-Hud。在XNA我簡單地稱爲的DirectX:如何將效果應用到與ID3DXSprite.Draw繪製紋理(..)

 spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.None); 

     effect.Begin(); 
     effect.CurrentTechnique.Passes[0].Begin(); 
     spriteBatch.Draw(texture, new Rectangle(0, 0, 300, 300), Color.White); 
     effect.CurrentTechnique.Passes[0].End(); 
     effect.End(); 

     spriteBatch.End(); 

但在C++中,幾乎相同的代碼does not工作

pSprite->Begin(D3DXSPRITE_ALPHABLEND | D3DXSPRITE_DONOTSAVESTATE | D3DXSPRITE_SORT_TEXTURE); 

anEffect->SetTechnique(technique); 

anEffect->Begin(&passes, 0); 

anEffect->BeginPass(0); 

pSprite->Draw(pTexture, NULL, NULL, &position, 0xFFFFFFFF); 

anEffect->EndPass(); 

anEffect->End(); 

pSprite->End(); 

注:效果是否正確裝入!

+0

它畫的是什麼?精靈只有紋理而沒有效果?一點都沒有? – Alan 2011-04-30 16:09:26

回答

1

那麼,首先你的XNA代碼是XNA 3.1,,這是錯誤的This blog post解釋瞭如何爲XNA 3.1和4.0(中間的API changes)執行此操作。

在XNA 3.1,使用SpriteSortMode.Immediate時,SpriteBatch將設立其着色器和其他裝置的狀態在Begin呼叫,而不是在End呼叫。這使您有機會在實際進行繪圖之前更換部分設備狀態(在DrawEnd中,具體取決於刷新的時間)。然後你應該End你的效果之後End sprite批處理(所以所有東西都是先畫出來的)。

現在,在DirectX中,我會建議您的End調用的相同的不正確排序是責任。具體是指documentation用於第二參數的該部分到ID3DXEffect::Begin

確定由一個效果修改狀態被保存和恢復。默認值爲0指定ID3DXEffect ::開始和ID3DXEffect ::結束將保存和恢復效果修改所有的狀態

其結果是,當你End的效果,它是將裝置恢復正常精靈繪圖,然後在ID3DXSprite上調用End,這是實際發送要繪製的精靈批處理的內容。

我猜想你的錯誤訂購的代碼在XNA上工作的原因是XNA可能做了相當於在開始效果時傳遞D3DXFX_DONOTSAVESTATE。與HLSL影響雪碧的

-1

用法:(對於C++遊戲開發者)

下面是示例代碼,這也解釋了平局如何精靈可以用HLSL效果文件的工作

僞代碼:

ID3DXEffect*    g_pEffect = NULL;  // D3DX effect interface 

void loadTextureEffect() {  
    D3DXCreateTextureFromFile(gD3dDevice,L"image.png",&gTextureBackdrop); 
    DWORD dwShaderFlags = D3DXFX_NOT_CLONEABLE; 
    D3DXCreateEffectFromFile(gD3dDevice, "shader.fx", NULL, NULL, dwShaderFlags, 
            NULL, &g_pEffect, NULL); 
} 

void Render() 
{ 
    unsigned int passes; 
    gD3dDevice->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0); 
    gD3dDevice->BeginScene(); 
    gSprite->Begin(0); 
    g_pEffect->SetTechnique("PostProcess"); 
    g_pEffect->SetTexture("Tex0", gTextureBackdrop); 
    float blurFactor = 25; 
    g_pEffect->SetValue("TextureBlur",&blurFactor ,sizeof(float)); 
    g_pEffect->Begin(&passes, 0); 
    for(unsigned int pass = 0; pass < passes; ++pass) 
    { 
    g_pEffect->BeginPass(pass); 
    D3DXVECTOR3 spritePos(0.0f, 0.0f, 0.0f); 
    gD3dDevice->SetTexture(0,gTextureBackdrop); 
    gSprite->Draw(gTextureBackdrop, 0, 0, &spritePos, 0xffffffff); 
    gSprite->End(); 
    g_pEffect->CommitChanges(); 
    g_pEffect->EndPass(); 
    } 
g_pEffect->End(); 
gD3dDevice->EndScene(); 
gD3dDevice->Present(NULL,NULL,NULL,NULL); 
}