游戏开发论坛

 找回密码
 立即注册
搜索
楼主: howlet2

cegui圆形地图

[复制链接]

13

主题

312

帖子

312

积分

中级会员

Rank: 3Rank: 3

积分
312
发表于 2010-2-22 00:12:00 | 显示全部楼层

Re:cegui圆形地图

学习了!!!


-------------------------------------------------------------------------------------------


欢迎访问开源图形处理器体系结构论坛(OpenGPU论坛) http://www.opengpu.org/bbs/

OpenGPU Graphics Open Source community(图形开源社区),聚焦领域(focus domain)包括:
  * GPU Architecture(图形处理器体系结构)
  * Graphics Algorithm(图形算法)
  * Open Source Rendering Engine(开源渲染器)
  * Open Source GPU Simulator/RTL Implement(开源GPU模拟器)
  * Mobile GPU Developing (移动图形设备的开发)
  * GPGPU Programming (面向通用的图形处理器编程)
                      (包括CUDA/OpenCL /DirectCompute)

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2010-2-22 01:58:00 | 显示全部楼层

Re:cegui圆形地图

没用过cegui
不过圆形,非规则形状最快最简单的方法就是 mask map + alpha test

13

主题

79

帖子

81

积分

注册会员

Rank: 2

积分
81
QQ
 楼主| 发表于 2010-2-22 16:56:00 | 显示全部楼层

Re: Re:cegui圆形地图

songxiaoyu8: Re:cegui圆形地图

害我又花了一早上时间研究了cegui中的几何体。继承effect可以做到修改顶点,绘制出一个圆形。文章如下:
h...

今天用了你提供的代码 我也看到了圆形的地图 太谢谢你了。等我把cegui更新后,就把它放到项目中  [em16]  [em1]

0

主题

163

帖子

163

积分

注册会员

Rank: 2

积分
163
发表于 2010-2-25 23:27:00 | 显示全部楼层

Re:cegui圆形地图

学习啊

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2010-3-5 20:18:00 | 显示全部楼层

Re:cegui圆形地图

搞这么复杂做啥子呢
1. 画个方形的地图
2. 上面再画个方形的图片,中空四周黑,像是这样:【】

3

主题

12

帖子

25

积分

注册会员

Rank: 2

积分
25
发表于 2010-3-14 12:27:00 | 显示全部楼层

Re:cegui圆形地图

我仔细看了一下CEGUI 0.71中direct3d的绘图过程,为什么不写个类继承RenderEffect用HLSL实现呢?

3

主题

12

帖子

25

积分

注册会员

Rank: 2

积分
25
发表于 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);

这只是大概的方法,欢迎指正

13

主题

79

帖子

81

积分

注册会员

Rank: 2

积分
81
QQ
 楼主| 发表于 2010-3-15 10:47:00 | 显示全部楼层

Re: Re:cegui圆形地图

cqw_1022: Re:cegui圆形地图

在仔细看了一下,发现不能用HLSL,CEGUI中实现Direct3D绘图的函数主要部分在CEGUIDirect3D9GeometryBuffer....

这个逐个像素计算主要是渲染效率问题,lock一张大的纹理(比如1024*1024)后就会很卡。具体什么原因我也不是很清楚,也有可能我自己哪一步设置的不对。建议看看13楼地方的回复 [em1]

还有hlsl没怎么研究过 呵呵!有机会 向你学习啊

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2010-3-15 12:57:00 | 显示全部楼层

Re:cegui圆形地图

如果是画小地图,可以用模版缓冲来做遮罩,想画啥形状就画啥形状

3

主题

12

帖子

25

积分

注册会员

Rank: 2

积分
25
发表于 2010-3-16 10:29:00 | 显示全部楼层

Re: cegui圆形地图

额,你搞的是2D的东西?2D的画也不会出现1024×1024的情况的啊。。。。事先准备好大地图数据和小地图数据是最快的啦。3D的画最好是改一下CEGUI中的Direct3D渲染类,用HLSL实现最好办了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-6 11:52

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表