皮肤的纹理:地面纹理的产生



产生地面纹理思路方法有很多种下面介绍种根据地面高度产生混合纹理思路方法准备工作: 4张贴图分别为雪地岩石草地沙子张高度图也就是张256级灰度位图为简单起见这 5张图大小最好:产生过渡自然纹理和3D山脉

原理:根据高度改变混合因子再按该因子对贴图上对应点进行Alpha混合


高度图


最终生成纹理图


最终效果图



步骤:1.读出每张贴图对应象素RGB值2.从高度图中获得对应点高度3.根据高度计算混合因子混合第步得出RGB值并写入新纹理对应位置4.重复步骤1直到所有象素被处理完(如贴图大小是256*256则从(0,0)处理到(255,255))便可得到张新纹理5.根据高度图计算多边形顶点坐标并设置纹理坐标6.剩下事就交给D3D去做了如何计算混合因子?我们假定山顶是雪地依次下来是岩石草地沙子雪地 256-192岩石 192-128草地 128-64沙子 64-0

以下是计算混合因子:float texfactor(float h1, float h2)//计算雪地权重时h1=256,岩石h1=192,{ //草地h1=128,沙子h1=64;h2为该点实际高度 float percent; percent = (64.0f - (h1 - h2)) / 64.0f;

(percent < 0.0f) percent = 0.0f; (percent > 1.0f) percent = 1.0f;

percent;}

以下是作混合:bitmap tex_gen(bitmap tex[4], bitmap heightmap){ float tex_fact[4]; //每种纹理权重 float hmap_height; //在点(x,y)处高度 bitmap final_tex; //最后返回纹理

unsigned char _r, _g, _b; //要返回RGB值
unsigned char old_r[4], old_g[4], old_b[4]; //在点(x,y)处各种纹理RGB值

for ( y=0; y<256; y) //遍历256*256位图
for ( x=0; x<256; x)
{
hmap_height=heightmap.getheight(x,y); //取得(x,y)处高度值

tex_fact[0]=texfactor(256, hmap_height);//计算第种地形权重
tex_fact[1]=texfactor(192, hmap_height);//计算第 2种地形权重
tex_fact[2]=texfactor(128, hmap_height);//[...]
tex_fact[3]=texfactor( 64, hmap_height);//[...]

for ( i=0; i<4; i) //读出各种纹理RGB值
tex[i].getcolor (&old_r[i], &old_g[i], &old_b[i]);

_r=((tex_fact[0]*old_r[0]) + (tex_fact[1]*old_r[1]) + (tex_fact[2]*old_r[2]) + (tex_fact[0]*old_r[3])); //Compose r value for final texture
_g=((tex_fact[0]*old_g[0]) + (tex_fact[1]*old_g[1]) + (tex_fact[2]*old_g[2]) + (tex_fact[0]*old_g[3])); //Same for g
_b=((tex_fact[0]*old_b[0]) + (tex_fact[1]*old_b[1]) + (tex_fact[2]*old_b[2]) + (tex_fact[0]*old_b[3])); //and b

final_tex.color(x,y, _r, _g, _b); //把新RGB值写到新纹理对应点上
}

final_tex;
}


多边形顶点位置坐标同样根据高度图设置注意纹理坐标(u,v)要跟贴图紧密对应 否则就得不到预期效果了



Tags:  地面纹理 agp纹理加速 皮肤的纹理

延伸阅读

最新评论

发表评论