Xna DirectX:如何对使用ID3DXSprite.Draw(..)绘制的纹理应用效果

Xna DirectX:如何对使用ID3DXSprite.Draw(..)绘制的纹理应用效果,xna,directx,shader,effect,Xna,Directx,Shader,Effect,我想为DirectX程序编写一个非常简单的效果,该程序使用ID3DXSprite界面绘制2D Hud。在XNA中,我只是打了个电话 spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.None); effect.Begin(); effect.CurrentTechnique.Passes[0].Begin();

我想为DirectX程序编写一个非常简单的效果,该程序使用ID3DXSprite界面绘制2D Hud。在XNA中,我只是打了个电话

        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++中,几乎相同的代码不起作用< < /P>
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();

注意:效果加载正确

首先,您拥有的XNA代码是针对XNA3.1的,这是错误的。解释如何为XNA3.1和4.0(介于两者之间的API)执行此操作

在XNA 3.1中,当使用
SpriteSortMode.Immediate
时,
SpriteBatch
将在
Begin
调用中设置其着色器和其他设备状态,而不是在
End
调用中。这使您有机会在实际绘制之前替换部分设备状态(在
Draw
End
中,取决于刷新的时间)。然后你应该
End
你的效果
End
精灵批次之后(所以所有的东西都先画出来)

现在,在DirectX中,我建议您的
End
调用的顺序同样不正确。请特别参阅本部分,以获取
ID3DXEffect::Begin

确定是否保存和恢复由效果修改的状态。默认值0指定ID3DXEffect::Begin和ID3DXEffect::End将保存和恢复效果修改的所有状态

结果是,当您在
ID3DXSprite
上调用
End
之前,
End
结束效果时,它会将设备重置回正常的精灵绘制,而这实际上是发送要绘制的精灵批


< P> >我猜想,XNA在XNA上的错误排序是因为XNA在执行效果时,相当于通过了代码> d3dxfx.doOtSaveStave/Cuff>,

<强>使用HLSL效果的精灵(C++游戏开发人员)>/P> 下面是示例代码,它解释了sprite draw如何使用HLSL效果文件

伪代码:

ID3DXEffect*g_pEffect=NULL;//D3DX效果界面
void loadTextureEffect(){
D3DXCreateTextureFromFile(gD3dDevice,L“image.png”和GTextureBackground);
DWORD dwShaderFlags=D3DXFX不可克隆;
D3DXCreateEffectFromFile(gD3dDevice,“shader.fx”,NULL,NULL,dwShaderFlags,
空值,&g_pEffect,空值);
}
void Render()
{
无符号整数传递;
gD3dDevice->Clear(0,0,D3DCLEAR_目标| D3DCLEAR_ZBUFFER,0x00000000,1.0f,0);
gD3dDevice->BeginScene();
gSprite->Begin(0);
g_pEffect->SetTechnique(“后处理”);
g_pEffect->SetTexture(“Tex0”,gtexturebackground);
浮动系数=25;
g_pEffect->SetValue(“TextureBlur”、&blurFactor、sizeof(float));
g_pEffect->Begin(&passes,0);
for(无符号整数过程=0;过程<过程;++过程)
{
g_pEffect->BeginPass(通过);
D3DXVECTOR3 spritePos(0.0f、0.0f、0.0f);
gD3dDevice->SetTexture(0,GTextureBackground);
gSprite->Draw(gtexturebackground,0,0和spritePos,0xffffffff);
gSprite->End();
g_pEffect->CommitChanges();
g_pEffect->EndPass();
}
g_pEffect->End();
gD3dDevice->EndScene();
gD3dDevice->Present(空,空,空,空);
}

它画了什么?只有纹理而没有效果的精灵?什么都没有?
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);
}