DirectX实现光照、纹理

来源:互联网 发布:酱紫的网络语言意思 编辑:程序博客网 时间:2024/05/23 00:02

关照的种类
环境光:经其他表面反射到达物体
漫射光:沿特定方向传播,到达某一表面后向各个方向均匀传播
镜面光:光线向同一方向反射(能模拟高亮点)
directx在通过如下函数设置光照:
光源的种类
点光源:有固定位置,并向各个方向发射
方向光:没有位置信息,所以光相互平行沿一特定方向传播
聚光灯:有位置信息,向手电筒一样发出锥形光,向特定方向传播

D3DXVECTOR3 dir(1.0f, -0.0f, 0.25f);    D3DXCOLOR   color = d3d::WHITE;        D3DLIGHT9 light;    ::ZeroMemory(&light, sizeof(light));    // 设置光照属性(方向光)    light.Type      = D3DLIGHT_DIRECTIONAL;    light.Ambient   = *color * 0.6f;    light.Diffuse   = *color;    light.Specular  = *color * 0.6f;    light.Direction = *dir;Device->SetLight(0, &light);Device->LightEnable(0, true);Device->SetRenderState(D3DRS_NORMALIZENORMALS, true);

现实世界中我们看到的物体颜色是由该物体反射的光的颜色决定的,如红色的物体吸收所有的非红色光,反射红光所以显示为红色,使用directx中函数SetMaterial可以设置物体材质。

顶点法线描述构成多边形的各个顶点的法线,通过该法线可以确定光线到达该表面的入射角。假设一个面由三个顶点p0,p1,p2构成,计算得到平面的两个向量u⃗ =p0p1,v⃗ =p1p2,则该面的法向量为n⃗ =u⃗ ×v⃗ .

纹理
纹理数据可以从图像文件中读取,并将其映射到构成图形的三角元中。纹理三角形通常与屏幕三角形大小不一,可以采用纹理过滤器来缩放纹理三角形以适应屏幕。纹理过滤器directx中采用如下函数实现:

//创建纹理D3DXCreateTextureFromFile(        Device,        L"dx5_logo.bmp",//设置纹理        Device->SetTexture(0, Tex);        //设置纹理过滤器        Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);    Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);    Device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);

融合技术
将正在处理的图元颜色值与存储在后台缓存中的像素颜色值进行合成(可得到透明的效果)。首先绘制不需要进行融合的物体,将要进行融合按相对于摄像机的深度值进行排序,按从后往前的顺序逐个绘制。设Outpixel为融合后的像素值:
Outpixel=SourcePixelsourcefac+DesPixeldesfac
SourcePixel表示要进行融合的像素值,sourcefac表示源像素融合因子,DesPixel表示后台缓存中的像素颜色值,desfac表示目标像素融合因子。Directx可以通过如下函数设置融合因子:

Device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);    Device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

利用Alpha分量来设置物体的透明度,Alpha分量可以来自纹理的Alpha通道以及漫反射颜色值。

//Alpha分量来自漫反射颜色值Device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);    Device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);    //Alpha分量来自纹理的Alpha通道    Device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);    Device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
0 0