Direct3D中的雾化效果

本文详细介绍了Direct3D中的雾化效果实现原理及配置方法。包括顶点雾化和像素雾化两种方法,线性、指数和指数平方三种雾化公式,以及基于深度和基于范围的雾化处理方式。并提供了如何启用和调整雾化效果的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Direct3D 中,雾化是通过将景物颜色与雾的颜色,以随物体到观察点距离增加而衰减的混合因子混合而实现的。

两种雾化方法:顶点雾化和像素雾化。

三种雾化公式:线性雾化,指数雾化,指数平方雾化。

两种雾化处理:基于深度的雾化处理和基于范围的雾化处理。基于深度是指两个点之间的深度(Z)差值,基于范围则是两点间的直线距离。Direct3D默认的是基于深度的雾化。可设置基于范围的雾化,但要先检测设备是否支持:

g_pd3dDevice->GetDeviceCaps(&staps);

if ( stCaps.RasterCaps &D3DPASTERCAPS_FOGRANGE )

return TRUE;

Direct3D默认禁用雾化效果,可以激活雾化:g_pd3dDevice->SetRendState( D3DRS_FOGENABLE, true );

设置雾的颜色 g_pd3dDevice->SetRendState( D3DRS_FOGCOLOR, 0xffffffff); //白色

根据按键消息进行多种雾化效果的切换

if (gInputSystem->KeyDown(DIK_V))
{
//禁用雾化
g_pd3dDevice->SetRenderState( D3DRS_FOGENABLE,FALSE );
}

if (gInputSystem->KeyDown(DIK_M))
{

g_pd3dDevice->SetRenderState( D3DRS_FOGENABLE,TRUE );
//设置雾化混合因子计算公式 : 指数雾化
g_pd3dDevice->GetDevice()->SetRenderState(D3DRS_FOGTABLEMODE, D3DFOG_EXP);
//设置雾的浓度

static float fogDensity = 0.005f;
g_pd3dDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD*)&fogDensity);
}


if (gInputSystem->KeyDown(DIK_N))
{

g_pd3dDevice->SetRenderState( D3DRS_FOGENABLE,TRUE );

//激活基于范围的雾化
g_pd3dDevice->SetRenderState( D3DRS_RANGEFOGENABLE,TRUE );

//设置雾化混合因子计算公式 : 线性雾化
g_pd3dDevice->SetRenderState(D3DRS_FOGTABLEMODE, D3DFOG_LINEAR);
//设置线性雾化开始位置和结束位置
static float fogStart = 20;
static float fogEnd = 200;
g_pd3dDevice->SetRenderState(D3DRS_FOGSTART,*(DWORD*)&fogStart);

g_pd3dDevice->SetRenderState(D3DRS_FOGEND,*(DWORD*)&fogEnd);

}


if (gInputSystem->KeyDown(DIK_B))
{
g_pd3dDevice->SetRenderState( D3DRS_FOGENABLE,TRUE );
//设置雾化混合因子计算公式 : 指数平方雾化
g_pd3dDevice->SetRenderState(D3DRS_FOGTABLEMODE, D3DFOG_EXP2);
//设置雾的浓度

static float fogDensity = 0.01f;
g_pd3dDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD*)&fogDensity);
}

其中设置雾化混合因子计算公式时,SetRenderState的第一个参数可以是:

D3DRS_FOGTABLEMODE(像素雾化)或 D3DRS_FOGVERTEXMODE(顶点雾化)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值