|
使用ID3DXEffect::SetFloatArray()可以向shader中传入一组浮点类型的数据(在shader中只能是全局变量),使用ID3DXEffect::GetFloatArray()可以从shader中取出一组全局浮点变量的值。
疑问就出在这里。shader中的全局变量是不能在执行顶点着色过程或像素着色过程中更改其具体值的,如果想要试图改变就必定报错。既然使用SetFloatArray()吧值传入shader,而在shader运行时又不能改变它的值,那我想知道使用GetFloatArray()取出shader全局变量的值有什么意义?
//********************************************************************************************
//****************举个例子说明
//
//
//C++主程序中
//ID3DXEffect* pEffect;
float fColor[4];
unsigned char A = (unsigned char)((Color >> 24) & 0xff);
unsigned char R = (unsigned char)((Color >> 16) & 0xff);
unsigned char G = (unsigned char)((Color >> 8) & 0xff);
unsigned char B = (unsigned char)((Color >> 0) & 0xff);
fColor[0] = (float)R/255.0f;
fColor[1] = (float)G/255.0f;
fColor[2] = (float)B/255.0f;
fColor[3] = (float)A/255.0f;
pEffect->SetFloatArray("DefaultColor",fColor,4);
//
//
//shader程序
float4x4 mWorldViewProj : WorldViewProjection;
float4 DefaultColor;
void ShowSenceVS(float3 Pos : POSITION,
float3 Normal : NORMAL,
out float4 oPos : POSITION,
out float4 oColor : TEXCOORD1)
{
//DefaultColor = float4(0,0,1,1); 如果添加这句就会报错
oPos = mul(float4(Pos.xyz, 1.0), mWorldViewProj);
oColor = DefaultColor;
}
//
//
//执行shader后,再回到主程序,取得float4 DefaultColor的值
float fColor2[4];
pEffect->SetFloatArray("DefaultColor",fColor2,4);
//********************************************************************************************
如果不添加shader中的DefaultColor = float4(0,0,1,1),那么fColor2和fColor值将会是一样的。如果添加那么就会有以下错误提示“error X3025 global variables are implicitly constant,enable compatibility mode to allow modification”。
那么ID3DXEffect::GetFloatArray()的作用和意义体现在什么地方? |
|