-
光照示例采用ECC p256曲线算法的规范
资源介绍
7.2 光照示例
7.2.1 环境反射示例
因为环境反射就相当于一个亮度值,均等的没有衰减的呈现在物体表面,所以可以直接
用一个float4类型的全局变量来表示。环境反射的计算特别简单,只需要与纹理采样的结果
进行相乘就完成了。
在4.5.3小节的shader代码的基础上只需简单的添加一个float4类型的变量g_Ambient表
示环境反射的颜色值;然后在g_MeshTexture.Sample函数的返回结果上再乘以g_Ambient
就完成了,修改代码的地方如下所示:
……
float4 g_Ambient; //定义一个环境反射的颜色
……
// 像素照射器
float4 PS( PS_INPUT input) : SV_Target
{
float4 outputColor =
g_MeshTexture.Sample(MeshTextureSampler,input.Tex) * g_Ambient;
return outputColor ;
}
因为新shader代码增加了一个float4类型的4维向量,所以在C++代码中需要相应的做初
始化工作。首先定义一个ID3DX11EffectVectorVariable类型的指针,用来访问shader代码中
的g_Ambient这个变量;然后通过ID3DX11Effect:: GetVariableByName()函数得到shader中
变量;再通过ID3DX11EffectVariable:: AsVector()函数将该变量转换成指定的4维向量类型;
最后通过ID3DX11EffectVectorVariable:: SetFloatVector()函数设置环境反射的颜色值。具体
代码如下所示:
ID3DX11EffectVectorVariable* g_Ambient;
……
// Obtain technique objects
g_pTechRenderCubeWithTexture =
g_pEffect->GetTechniqueByName("RenderCubeWithTexture");
ID3DX11EffectVariable* effect11_variable =
g_pEffect->GetVariableByName("g_Ambient");
g_Ambient = effect11_variable->AsVector();
……
float coler[4] = { 0.3f,0.3f,0.3f,1.0f };
g_Ambient->SetFloatVector(coler);
本小节实例参见“DirectXNine”项目工程,运行效果图 7.2.1_1 所示,对比 6.2.3 小
节的实例,从画面上看人物的亮度暗了许多,因为模拟了环境光,环境光亮点只有原来的
0.3 倍。