繁体   English   中英

通过Shader DirectX 9传递纹理

[英]Passing Texture through Shader DirectX 9

我试图渲染一个通过像素着色器传递的纹理。

目前我的着色器如下:

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的结果,但是当我运行代码时,纹理显示完美,而不会被红色覆盖。

默认情况下,精灵和效果都存储初始管道状态,并在调用Begin时设置它们自己,然后在调用End时恢复它。 所以我怀疑是sprite->Begin(D3DXSPRITE_SORT_TEXTURE); 将禁用效果处理,并且永远不会调用您的像素着色器。 您可以尝试将类似D3DXSPRITE_DONOTMODIFY_RENDERSTATE传递给Begin以防止它修改管道状态,尽管这可能会破坏精灵渲染。 最好完全摆脱精灵并编写自己的精灵着色器(顶点和像素),因为固定的管道渲染现在大部分都被弃用了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM