通过着色器DirectX 9传递纹理

Passing Texture through Shader DirectX 9

本文关键字:纹理 DirectX      更新时间:2023-10-16

我正在尝试渲染通过像素着色器传递的纹理。

目前我的着色器如下:

float4 EffectProcess( float2 Tex : TEXCOORD0 ) : COLOR0
{
   return float4(1,0,0,1);
}
technique MyTechnique
{
    pass p0
    {
        VertexShader = null;
        PixelShader = compile ps_2_0 EffectProcess();
    }
}

如您所见,这是一个非常基本的着色器,它迫使像素为红色。

UINT uiPasses = 0;
        res= g_lpEffect->Begin(&uiPasses, 0);
        for (UINT uiPass = 0; uiPass < uiPasses; uiPass++)
        {
            res = g_lpEffect->BeginPass(uiPass);
            res = sprite->Begin(D3DXSPRITE_SORT_TEXTURE);
            res = sprite->Draw(tex, NULL, 0x0, 0x0, 0xFFFFFFFF);
            res = sprite->End();
            res = g_lpEffect->EndPass();
        }
        res = g_lpEffect->End();

我正在使用着色器像这样绘制纹理。我不确定这是做到这一点的正确方法,并且在该主题上找到了很少的资源。

着色器正在正确创建,并且纹理同样,所有调用都会返回s_ok的hresult,但是当我运行代码时,纹理显示出完美的显示,而不会被红色覆盖。

默认情况下,精灵和效果既均可在 Begin被调用时自行设置,然后在调用 End时将其恢复。因此,我怀疑sprite->Begin(D3DXSPRITE_SORT_TEXTURE);会禁用效果处理,并且您的像素着色器从未被调用。您可以尝试将D3DXSPRITE_DONOTMODIFY_RENDERSTATE之类的东西传递到Begin中,以防止其修改管道状态,尽管这可能会破坏精灵渲染。最好完全摆脱精灵并编写自己的精灵着色器(顶点和像素(,因为如今固定管道渲染大部分是弃用的。