我是irrlicht爱好者,想问问怎样在2D上画真彩色图片?

mryafeng 2008-11-26 03:19:19
我是irrlicht爱好者,想问问怎样在2D上画真彩色且透明的图片?

这是一段代码:

...
加载一个24位图片到man对象,并设透明色为黑色
video::ITexture* man = driver->getTexture("E:/2-2.bmp");
driver->makeColorKeyTexture(man, video::SColor(255,0,0,0));
...
//让图片显示出来并半透明跟随鼠标运动
core::position2d<s32> m = device->getCursorControl()->getPosition();
s32 w = man->getOriginalSize().Width;
s32 h = man->getOriginalSize().Height;
driver->draw2DImage(man, core::position2d<s32>(m.X-w/2,m.Y-h/2),
core::rect<s32>(0,0,w,h), 0,
video::SColor(100,255,255,255), true);
...

原图是这样的



运行的画面却变成这样



咋样整呢?
...全文
273 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
x497801468 2011-05-06
  • 打赏
  • 举报
回复

ym glacier3d
还有很多要学啊
xy121z 2011-04-21
  • 打赏
  • 举报
回复
学习ing...
lizhigang34 2008-11-27
  • 打赏
  • 举报
回复
学习,,
gl的图像知识真丰富..
glacier3d 2008-11-27
  • 打赏
  • 举报
回复
It's over!
mryafeng 2008-11-27
  • 打赏
  • 举报
回复
结帐了,我心满意足!
不过还有许多和这方面有关的未知问题要烦gl兄帮忙呢,谢谢
mryafeng 2008-11-26
  • 打赏
  • 举报
回复
我很敬佩gl兄的学识,看来我要学得东西还是极多的
我知道要设EMT_TRANSPARENT_ADD_COLOR,
可setMaterialType或MaterialType函数是ISceneNode*对象的函数,
用ISceneNode*等对象,必然要创建摄像机对象,不是完全在2D上画图,我不甘心,
只好用opengl库自己处理了

要是gl兄回答完了,我就马上结帐
glacier3d 2008-11-26
  • 打赏
  • 举报
回复
作为D3D或OpenGL本身,2D与3D都能这样处理,而且方法是一样的,只是irrlicht里封装时没有为2D提供3D的那种帧混合方法。

irrlicht里在调用draw2DImage()绘制透明2D图时,它设的帧混合方法如下:

pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
pID3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
pID3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );

即:用的是alpha通道。

而在设了EMT_TRANSPARENT_ADD_COLOR渲染材质类型,绘制3D时,它用的帧混合方法如下:

pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
pID3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
pID3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR);

即:没有用alpha通道,而是如下计算的:
destCol * (1-scrCol) + scrCol (当然假设颜色都是归一化的)
这样,就柔和了原图像颜色和帧缓存里原有颜色。(而不像上面那种方法,在颜色不是精确(0,0,0)的黑区只保存了原图像颜色,而把帧缓冲里的颜色都抛弃了)

所以,对你的图片调用draw2DImage()是不行的,可以设setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR)后自己写新函数绘制。
jjaikaikai 2008-11-26
  • 打赏
  • 举报
回复
看不到图哦,重新贴一下吧,不然没有法分析
mryafeng 2008-11-26
  • 打赏
  • 举报
回复
说得极是,可像这样的图片至少有一千张,每个图都用PS处理,那是非人类可完成的
irrlicht在3D上是可以处理的,就是2D不行

这是用3D图形来处理的一段代码

video::ITexture* man = driver->getTexture("E:/2-2.bmp");
s32 w = man->getOriginalSize().Width;
s32 h = man->getOriginalSize().Height;

scene::IBillboardSceneNode *bill = smgr->addBillboardSceneNode(
0,
core::dimension2d<f32>(w,h)
);

bill->setMaterialFlag(video::EMF_LIGHTING, false);
bill->setMaterialFlag(video::EMF_ZWRITE_ENABLE, false);
bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR);
bill->setMaterialTexture(0, man);
bill->setPosition(core::vector3df( 150, -100, 300));

...

//还得加上摄像机对象

scene::ICameraSceneNode *camera = smgr->addCameraSceneNode();
camera = 0;

...

smgr->drawAll();

效果图还是得到http://tieba.baidu.com/f?kz=505997624里查看

我不知道,既然能处理干净,为什么2D就不行?


glacier3d 2008-11-26
  • 打赏
  • 举报
回复
用PS把图片边上的黑区全弄成精确的(0,0,0)黑色试试
glacier3d 2008-11-26
  • 打赏
  • 举报
回复
看效果图有alpha通道,也有混合。
试下irrlicht自带的例子中的2ddemo.bmp图片,若这个图片混合后边缘清晰,那就可能是你的图片的四周颜色不完全是精确的(0,0,0)黑色,可能有其它灰度色,所以makeColorKeyTexture时灰度色部分没有生成对应的alpha通道,所以才会出现那种效果。
mryafeng 2008-11-26
  • 打赏
  • 举报
回复
可能朋友们看不到这两张图,它们就在这里
http://tieba.baidu.com/f?kz=505997624
mryafeng 2008-11-26
  • 打赏
  • 举报
回复
那就到http://tieba.baidu.com/f?kz=505997624里看吧

19,464

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧