|
各位大大们,遇到一个很诡异的问题,不知道为什么,请各位大大看下。代码如下:
for(int iLight=0; iLight < NUM_LIGHTS; iLight++)
{
float3 vLightToPoint = ViewPos - LightPos[iLight];
float LenSq = dot(vLightToPoint, vLightToPoint);
float Len = sqrt(LenSq);
vLightToPoint = normalize(vLightToPoint);
float Attenuation = Atten0 + Atten1 * Len + Atten2 * LenSq;
float Angle = dot(normalize(LightDir[iLight]), vLightToPoint);
if(Angle > cos(Phi/2))
{
// 漫反射计算 其中diffContrib为漫反射分量, D为光线方向,ViewNormal为法线,
// Diffuse 为两个不变量的乘积(材质漫反射乘上光照漫反射分量)
float3 diffContrib = saturate(dot(ViewNormal, -vLightToPoint)) * MatColor * LightColor[iLight] ;
//镜面反射计算
if(Ks > EPISILON)
{
// 镜面反射计算 R为反射向量, specContrib为镜面反射分量, Ks为镜面反射在整个光照中所占比重
float3 vReflect = reflect(vLightToPoint, ViewNormal);
float fPhongValue = saturate(dot(vReflect, vPointToEye));
float3 specContrib = Ks * pow(fPhongValue, SpecExpon) * MatSpecular * LightColor[iLight];
// 总的光照效果就等于漫反射、镜面反射与环境光的叠加效果,
// 因为我们在第一次渲染时已经渲染过环境光效果,所以这里只需要将漫反射与镜面反射效果叠加即可。
I += specContrib + tex2D(samScene, Tex).xyz * diffContrib;
}
else
{
I += tex2D(samScene, Tex).xyz * diffContrib;
}
if(Angle < cos(Theta/2))
{
float Coef = (Angle - cos(Phi/2)) / (cos(Theta/2) - cos(Phi/2));
Coef = pow(Coef, Falloff);
I *= Coef;
}
}
I /= Attenuation;
}
问题是:如果有这个循环,这个shader就是错误的,没有这个循环shader就能正常运行,各位大大知道为什么吗?现在很纠结啊。 |
|