企业网站怎么做的好看,wordpress 从零,宜昌网站优化,软文文章光照的组成
环境光#xff1a;这种类型的光经其他表面反射到达物体表面#xff0c;并照亮整个场景#xff0c;要想以较低代价粗略模拟这类反射光#xff0c;环境光是一个很好的选择
漫射光#xff1a;这种类型光沿着特定的方向传播。当它到达某一表面时#xff0c;将沿…光照的组成
环境光这种类型的光经其他表面反射到达物体表面并照亮整个场景要想以较低代价粗略模拟这类反射光环境光是一个很好的选择
漫射光这种类型光沿着特定的方向传播。当它到达某一表面时将沿着各个方向均匀反射无论从哪个方位观察表面亮度均相同所以采用该模型时无须考虑观察者的位置这样漫射光方程中仅需考虑光传播的方向以及表面朝向从一个光源发出的光一般都是这种类型的。
镜面光这种类型的光沿特定方向传播当此类光到达一个表面时将严格地沿着另一个方向反射从而形成只能在一定角度范围内才能观察到的高亮度照射所以在镜面光照方程中不仅需要考虑光线的入射方向和图元的表面朝向还需要考虑观察点的位置。镜面光可用于模拟物体上的高光点例如当光线照射到一个抛光的表面所形成的高亮照射。
镜面光比其他类型光计算量大因此Direct3D提供了开关选项默认状态下Direct不进行镜面反射计算如果想启用镜面光必须调用接口进行设置
Device-SetRenderState(D3DRS_SPECULARENABLE, true);
每种类型的光都可用结构D3DCOLORVALUE或者D3DXCOLOR来表示描述光线的颜色时D3DXCOLOR类中的Alpha值都将被忽略
D3DXCOLOR redAmbient(1.0f, 0.0f, 0.0f, 1.0f);
D3DXCOLOR blueDiffuse(0.0f, 0.0f, 1.0f, 1.0f);
D3DXCOLOR whiteSpecular(1.0f, 1.0f, 1.0f, 1.0f);
材质
现实世界中我们所观察到的物体的颜色是由该物体所反射的光的颜色决定的例如一个纯红色的球体反射了全部的红色入射光并吸收了所有非红色的光所以呈现为红色。当一个物体吸收了所有的光时便呈现为黑色如果一个物体能够100%地反射红色光、绿色光、蓝色光它将呈现为白色Direct3D通过定义物体的材质来模拟同样的现象材质允许我们定义物体表面对各种颜色光的反射比例材质用结构D3DMATERIAL9来表示。
typedef struct D3DMATERIAL9 {D3DCOLORVALUE Diffuse; D3DCOLORVALUE Ambient; D3DCOLORVALUE Specular; D3DCOLORVALUE Emissive; float Power;
} D3DMATERIAL9;Diffuse指定材质对漫射光的反着率Ambient指定材质对环境光的反射率Specular指定材质对镜面光的反射率Emissive该分量用于增强物体的亮度使之看起来好像可以自己发光Power指定镜面高光点的锐度该值越大高光点的锐度越大
//只反射红色光
D3DMATERIAL9 red;
::ZeroMemory(red, sizeof(red));
red.Diffuse D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f);
red.Ambient D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f);
red.Specular D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f);
red.Emissive D3DXCOLOR(0.0f, 0.0f, 0.0f, 1.0f);
red.Power 5.0f;
设置材质接口SetMaterial
D3DMATERIAL9 blueMaterial;
Device-SetMaterial(blueMaterial);
//draw...
顶点法线
顶点法线描述的是构成多边形的各个顶点的法线Direct3D需要知道顶点的法线方向以确定光线到达表面时的入射角由于光照计算是对每个顶点进行的所以Direct3D需要知道表面在每个顶点处的局部朝向(法线方向)描述一个顶点法线需要修改顶点结构
struct Vertex
{float _x, _y, _z;float _nx, _ny, _nz;static const DWORD FVF;
};
const DWORD Vertex::FVF D3DFVF_XYZ | D3DFVF_NORMAL;
计算三角形三个顶点的法线可由计算该面的法向量得到首先计算位于三角形平面内的俩个向量
void ComputeNormal(D3DXVECTOR3* p0, D3DXVECTOR3* p1, D3DXVECTOR3* p2, D3DXVECTOR3* out)
{D3DXVECTOR3 u *p1 - *p0;D3DXVECTOR3 v *p2 - *p0;D3DXVec3Cross(out, u, v);D3DXVec3Normalize(out, out);
}
当用三角形单元逼近表示曲面时将面片法向量作为构成该面片的顶点法向量不可能产生很平滑的效果一种更好的求取顶点法向量的方法是计算法向量均值我们需要求出共享点v的所有三角形的面法向量然后将这些法向量相加后除以个数进行平均。
在变换过程中顶点法线有可能不再是规范的所以最好的方法是在变换完成后通过设置绘制状态来重新规范化
Device-SetRenderState(D3DRS_NORMALIZENORMALS, true);