怎么样解决3D 地形、天空盒等网格模型出现缝隙的问题
当我们在编写地形、BOX或者天空盒等的网格与网格连接处常常会看到有的地方会出现一条缝隙之类的,这个要怎么解决呢?其实不难,还记得学过的DirectX提供的纹理寻址里面的镜像纹理寻址、重叠纹理寻址、边框颜色纹理寻址、一次镜像纹理寻址、夹取纹理寻址,这里我把纹理寻址的枚举类型写出来,看不懂就去查查SDK;
typedef enum D3DTEXTUREADDRESS
{
D3DTADDRESS_WRAP = 1,
D3DTADDRESS_MIRROR = 2,
D3DTADDRESS_CLAMP = 3,
D3DTADDRESS_BORDER = 4,
D3DTADDRESS_MIRRORONCE = 5,
D3DTADDRESS_FORCE_DWORD = 0x7fffffff,
} D3DTEXTUREADDRESS, *LPD3DTEXTUREADDRESS;
当我们要消除出现的缝隙的时候,只要在画网格或模型之前加上纹理寻址就能解决问题,比如说:我现在要在Render()函数里画一个天空盒子:
void SkyBox::Render()
{
// 各个子集绘制各个纹理
for(int i=0; i<6; i++)
{
s_pD3DDevice->SetTexture(0, g_pTexture[i]); // 灵活顶点格式
s_pMesh->DrawSubset(i); // 属性绘制
}
}
这里我是用的Mesh做的一个天空盒子,为了要消除将会出现的缝隙,只需在画之前(即在DrawSubset)加入纹理寻址就行了:
void SkyBox::Render()
{
// 各个子集绘制各个纹理
for(int i=0; i<6; i++)
{
s_pD3DDevice->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR);
s_pD3DDevice->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_MIRROR);
s_pD3DDevice->SetTexture(0, g_pTexture[i]); // 灵活顶点格式
s_pMesh->DrawSubset(i); // 属性绘制
}
}
这里我加入的纹理寻址是一次镜像,因为这里即将出现的缝隙仅仅是一条白线,所以加入一次镜像即可,当然,出现的情况的不同,就加入不同的纹理寻址,一般加入一次镜像应该就没问题了。