Directx11教程五之DiffuseLight(漫射光)

先看看这次教程的构架吧,


这次的教程我设置的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情况下的.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值