通过 Shader DirectX 9 传递纹理
Passing Texture through Shader DirectX 9
我正在尝试渲染通过像素着色器的纹理。
目前我的shader如下:
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();
然后我像这样使用着色器绘制纹理。我不确定这是不是正确的方法,而且我发现关于这个主题的资源很少。
正在正确创建着色器和纹理,所有调用 return S_OK 的结果,但是当我 运行 代码时,纹理显示完美,没有被红色覆盖。
默认情况下,精灵和效果都存储初始管道状态并在调用 Begin
时设置它们自己的状态,然后在调用 End
时恢复它。所以我怀疑 sprite->Begin(D3DXSPRITE_SORT_TEXTURE);
会禁用效果处理并且永远不会调用您的像素着色器。您可以尝试将 D3DXSPRITE_DONOTMODIFY_RENDERSTATE
之类的内容传递给 Begin
以防止它修改管道状态,尽管这可能会破坏精灵渲染。最好完全摆脱 sprite 并编写自己的 sprite 着色器(顶点和像素),因为这些天固定管道渲染大多已被弃用。
我正在尝试渲染通过像素着色器的纹理。
目前我的shader如下:
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();
然后我像这样使用着色器绘制纹理。我不确定这是不是正确的方法,而且我发现关于这个主题的资源很少。
正在正确创建着色器和纹理,所有调用 return S_OK 的结果,但是当我 运行 代码时,纹理显示完美,没有被红色覆盖。
默认情况下,精灵和效果都存储初始管道状态并在调用 Begin
时设置它们自己的状态,然后在调用 End
时恢复它。所以我怀疑 sprite->Begin(D3DXSPRITE_SORT_TEXTURE);
会禁用效果处理并且永远不会调用您的像素着色器。您可以尝试将 D3DXSPRITE_DONOTMODIFY_RENDERSTATE
之类的内容传递给 Begin
以防止它修改管道状态,尽管这可能会破坏精灵渲染。最好完全摆脱 sprite 并编写自己的 sprite 着色器(顶点和像素),因为这些天固定管道渲染大多已被弃用。