|
发表于 2010-9-16 14:19:00
|
显示全部楼层
Re:最近做的地表
我的生成大纹理的代码这样
HRESULT hr;
//创建一个空的纹理
hr = : 3DXCreateTexture( m_pDevice,
m_iWidth, m_iDepth, //纹理宽和高
0,
0,
D3DFMT_X8R8G8B8, //32位XRGB
D3DPOOL_MANAGED,
&m_TerrainTex.m_pTerrainTex);
terrain::Failed(hr, L"创建纹理失败");
D3DSURFACE_DESC textureDesc;
m_TerrainTex.m_pTerrainTex->GetLevelDesc( 0, &textureDesc);
//检测是否支持32位像素
if(textureDesc.Format != D3DFMT_X8R8G8B8)
return false;
D3DLOCKED_RECT lockedRect;
m_TerrainTex.m_pTerrainTex->LockRect( 0, &lockedRect, 0, 0);
//纹理的像素数据
//boost::shared_array<DWORD> dwImagedata = boost::shared_array<DWORD>((DWORD*)lockedRect.pBits);
DWORD* dwImagedata = (DWORD*)lockedRect.pBits;
//初始化小纹理图
if( !m_TerrainTex.InitTexMap() )
return false;
D3DXCOLOR Finalcolor;//最终像素颜色
D3DXCOLOR color;//叠加颜色
float fHeight = 0;//高度
float fBlend = 0;//混合因子
//遍历大纹理图的每个像素
for( int iz = 0; iz < m_iDepth; iz++){
for( int ix = 0; ix < m_iWidth; ix++){
//将像素坐标转换为顶点坐标(因为只有顶点坐标有高度值)
float fx = (float)ix / m_iCellSpacing;
float fz = (float)iz / m_iCellSpacing;
fHeight = GetScaleHeightAtPoint<float>( fx, fz);
//获取纹理当前像素的颜色
Finalcolor = dwImagedata[ iz * lockedRect.Pitch/4 + ix ];
//遍历小纹理图
for( int i = 0; i < MAX_TEXTURE_NUM ; i++){
fBlend = m_TerrainTex.GetRegion( fHeight, i);
if(fBlend != 0)
color = m_TerrainTex.GetTexColor( ix, iz, i);
//叠加颜色
Finalcolor += color * fBlend;
}//end for i
dwImagedata[ iz * lockedRect.Pitch/4 + ix ] = (D3DXCOLOR)Finalcolor;
}//end for ix
}//end for iz
请楼主赐教。。。。卡在这里好几天了。。找不出啥原因。。 |
|