使用Effects11框架和fx_5_0
目标配置文件,您可以创建将统一变量作为参数的函数,并使用这些变量的常量值对其进行编译。例如:
void colorVS(float4 positionL : POSITION,
uniform float4 color,
out float4 position : SV_Position,
out float4 vertexColor : COLOR) {
position = mul(positionL, viewProjectionMatrix);
vertexColor = color;
}
VertexShader redShader = CompileShader(vs_5_0, colorVS(float4(1,0,0,1)));
VertexShader greenShader = CompileShader(vs_5_0, colorVS(float4(0,1,0,1)));
technique11 RedTechnique { pass {
SetVertexShader(redShader);
} }
technique11 GreenTechnique { pass {
SetVertexShader(greenShader);
} }
现在,我并没有提倡这种做法,但这是我正在处理的事情,因为我的任务是将现有项目从Effects11移植到直接的HLSL。使用greenShader
(未优化)生成的fx_5_0
程序集包含:
dcl_temps 1
itof r0.xyzw, l(0, 1, 0, 1)
mov o1.xyzw, r0.xyzw
它只是在临时寄存器中设置常量值。但是,在定位vs_5_0
(或任何其他非FX)配置文件时,我无法找到完成相同操作的语法。通过简单地传递colorVS
作为切入点,最终发生的是:
// cbuffer $Params
// {
// float4 color; // Offset: 0 Size: 16
// }
dcl_constantbuffer cb0[1], immediateIndexed
// ...
mov o1.xyzw, cb0[0].xyzw
我是否可以仅使用vs_5_0
配置文件使用FXC编译这些着色器并传递常量值?