DirectX 9 和 10 效果支持“预着色器”,其中静态表达式将被拉出以在 CPU 上自动执行。
请参阅D3DXSHADER_NO_PRESHADER
文档,这是一个禁止此行为的标志。这是一个网络链接: http: //msdn.microsoft.com/en-us/library/windows/desktop/bb205441 (v=vs.85).aspx
您的声明g_C
同时缺少static
类型,例如float
. 您还需要将其移至全局范围。
当你用 fxc 编译它时,你可能会看到类似下面的内容(注意注释preshader
块后面的块):
technique RenderScene
{
pass P0
{
vertexshader =
asm {
//
// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
//
// Parameters:
//
// float4 g_A;
// float4 g_B;
//
//
// Registers:
//
// Name Reg Size
// ------------ ----- ----
// g_A c0 1
// g_B c1 1
//
preshader
mul c0, c0, c1
// approximately 1 instruction used
//
// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
vs_2_0
mov oPos, c0
// approximately 1 instruction slot used
};
pixelshader =
asm {
//
// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
ps_2_0
def c0, 0, 0, 0, 0
mov r0, c0.x
mov oC0, r0
// approximately 2 instruction slots used
};
}
}
我编译了以下内容:
float4 g_A;
float4 g_B;
static float4 g_C = g_A * g_B;
float4 RenderSceneVS() : POSITION
{
return g_C;
}
float4 RenderScenePS() : COLOR
{
return 0.0;
}
technique RenderScene
{
pass P0
{
VertexShader = compile vs_2_0 RenderSceneVS();
PixelShader = compile ps_2_0 RenderScenePS();
}
}
生成fxc /Tfx_2_0 t.fx
列表。他们不是很有趣的着色器......