Эффекты DirectX 9 и 10 поддерживают «прешейдеры», в которых статические выражения извлекаются для автоматического выполнения на ЦП.
См. 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
для создания списка. Это не очень интересные шейдеры...
person
Slagh
schedule
10.07.2012