|
发表于 2010-3-14 16:03:00
|
显示全部楼层
Re:cegui圆形地图
在仔细看了一下,发现不能用HLSL,CEGUI中实现Direct3D绘图的函数主要部分在CEGUIDirect3D9GeometryBuffer.cpp中的Direct3D9GeometryBuffer::draw()函数中想用HLSL的话就要修改这个函数,其实楼主给的那个网址上的实现方法是可以的,关键是第三步——将小地图的RGB数据(注意:这里不包括A通道的数据)传给圆形的地图遮罩。我参照CEGUI里面的创建Texture的方法写一下实现方法,只需要在继承RenderEffect类中的performPostRenderFunctions()中添加即可,这样是会实时修改的。大概代码如下
参考Direct3D9Direct3D9Texture.cpp Direct3D9Texture::loadFromMemory()函数中的一断代码:
d_textureRect->LockRect(0, &rectCircle, 0, 0);
//圆形区域的Texture,
ulong* dst = static_cast<ulong*>(rectCircle.pBits);
//小地图区域的Texture,其中bufferMapArea为小地图的图像buffer,读地图数据即可获得
const ulong* src = static_cast<const ulong*>(bufferMapArea);
//这里是关键,将小地图图像的buffer复制到圆形区域的rectCirecle.pBits中,不修改a数据,a数据是alpha
//值,为0的区域既是透明区域
//buffer_size是指小地图的分辨率,这也应该是圆形区域Texture的分辨率,如果之前的和现在的不符可以
//D3DXCreateTexture函数建一个新的Texture,使两者分辨率一致
for (uint i = 0; i < buffer_size.d_height; ++i)
{
for (uint j = 0; j < buffer_size.d_width; ++j)
{
// we dont need endian safety on microsoft
uchar r = static_cast<uchar>(src[j] & 0xFF);
uchar g = static_cast<uchar>((src[j] >> 8) & 0xFF);
uchar b = static_cast<uchar>((src[j] >> 16) & 0xFF);
uchar a = static_cast<uchar>((dst[j] >> 24) & 0xFF);
dst[j] = D3DCOLOR_ARGB(a, r, g, b);
}
dst += rect.Pitch / sizeof(ulong);
src += static_cast<ulong>(buffer_size.d_width);
}
d_textureRect->UnlockRect(0);
这只是大概的方法,欢迎指正 |
|