DirectX实现光照、纹理

关照的种类
环境光:经其他表面反射到达物体
漫射光:沿特定方向传播,到达某一表面后向各个方向均匀传播
镜面光:光线向同一方向反射(能模拟高亮点)
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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值