先看看这次教程的构架吧,
这次的教程我设置的DiffseLightColor=(0.0f,1.0f,0.0f,1.0f) 绿色 ,LightDirection=(1.0f,0.0f,0.0f); 灯光方向为X正方向
DiffuseLight光照类型的计算方式
LitColor(DiffuseLight)=Ld*Md*max(COS(D),0)
D为反射光线和点法向量的夹角,La为环境光的颜色,Ma为物体材质对环境光的反射率,注意这个为离散乘法,La(R1,G1,B1),Ma(R2,G2,B2),因此为离散乘法.当然在教程中Md材质默认为Md=(1,1,1),并且是存在Texture情况下的.
这次显示的正方形会绕着Y轴旋转,会有三种现象
第一种现象,当正方形旋转为正面并且顶点法线方向与灯光的反方向( 即LightInvDirection)成锐角时 呈现绿色,
程序运行效果如下:
第二,当正方形旋转为正面并且顶点法线方向与灯光的反方向( 即LightInvDirection)成钝角时 呈现黑色
程序运行结果如下:
第三,当正方形旋转为背面,什么图片都没显示
程序运行结果如下:
这次注意的是:
第一,HLSL的saturate函数:
float saturate( float v)
{
if( v < 0.0 ) v = 0.0;
if( v > 1.0 ) v = 1.0;
}
第二,
HLSL的float乘以矩阵的基本写法
float3 a;
Matrix b;
float4 c;
a=mul(a,(float3x3)b);
c=mul(float4(a,1.0f),b);
c=mul(c,b);
第三,
float4 PS(VertexOut outa) : SV_Target
{
float4 TexColor; //采集的纹理颜色
float LightFactor; //灯光因子
float4 color; //最终输出的颜色
//第一,获取采样颜色
TexColor = ShaderTexture.Sample(SampleType, outa.Tex);
//第二,求出灯光因子
float3 InvLightDir = -LightDirection;
LightFactor = saturate(dot(InvLightDir,outa.W_Normal));
//第三,求出灯光照射颜色
color = saturate(LightFactor*DiffuseColor); //saturate(float1*float4)
//第四,用灯光颜色调节纹理颜色
color = color*TexColor;
return color;
}
color=color*TexColor;这条式子的含义即在纹理的基础颜色上用灯光颜色加以调试,所以在程序运行得到绿色的有纹理的正方形
第四点是,当顶点法线向量变换到世界空间时,不应该乘以世界矩阵,而应该乘以世界变换矩阵的逆矩阵的转置矩阵,这点是原教程搞错 了,我在这里纠正一下,大家可以网上搜一下推到公式,避免搞错了。
源代码如下:点击打开链接
LitColor(DiffuseLight)=Ld*Md*max(COS(D),0)
D为反射光线和点法向量的夹角,La为环境光的颜色,Ma为物体材质对环境光的反射率,注意这个为离散乘法,La(R1,G1,B1),Ma(R2,G2,B2),因此为离散乘法.当然在教程中Md材质默认为Md=(1,1,1),并且是存在Texture情况下的.