Xna DirectX:如何对使用ID3DXSprite.Draw(..)绘制的纹理应用效果
我想为DirectX程序编写一个非常简单的效果,该程序使用ID3DXSprite界面绘制2D Hud。在XNA中,我只是打了个电话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();
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);
}