用cocos2d-x的CCRenderTexture反复画同一张图片产生“漂移”现象

chenqiu1024 2013-12-10 09:13:18
http://www.cocos2d-x.org/forums/6/topics/40668
cocos2d-x version: 2.1rc0-x-2.1.4
在试验一个特效shader程序的时候发现的问题。这个特效需要用多个shader程序输出的结果“串联”起来得出最终效果,所以先往一个CCRenderTexture renderTexture0上画一张图片,再把它里面得出的内容画到另一个renderTexture1上,再把renderTexture1上的画回到renderTexture0上……如此反复多次。
这其中涉及的shader都没有改变纹理坐标,也就是说按道理每次得到的图像位置是不会跟上一次有区别的,但实际中发现了怪现象:对于某个特殊图片,在这样的反复渲染过程中其位置发生了偏移,从而留下了一个被拖长的痕迹。而对于绝大多数其它图片却还是对的。
然后我把程序做了简化,去除了自己的shader,发现即便用cocos2d-x自己内建的默认shader也还是一样,说明不是我的shader program的问题。于是我困惑ing...

有问题的图片在此:
原图片:

多次渲染后CCRenderTexture中得到的结果图像:


下面是可以复现问题的代码,在HelloWorld工程的HelloWorldScene.cpp中把bool HelloWorld::init() 方法给替换掉就行了。
bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if ( !CCLayer::init() )
{
return false;
}

/////////////////////////////
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCTexture2D* sourceImage = CCTextureCache::sharedTextureCache()->addImage("pulsar0.png");
CCSize size = sourceImage->getContentSize();
CCRenderTexture* renderTexture0 = CCRenderTexture::create(size.width, size.height);
CCRenderTexture* renderTexture1 = CCRenderTexture::create(size.width, size.height);

renderTexture0->beginWithClear(0, 0, 0, 0);
sourceImage->drawAtPoint(CCPointZero);
renderTexture0->end();

for (int i=0; i<100; i++)
{
renderTexture1->beginWithClear(0, 0, 0, 0);
renderTexture0->getSprite()->getTexture()->drawAtPoint(ccp(0, 0));
renderTexture1->end();

renderTexture0->beginWithClear(0, 0, 0, 0);
renderTexture1->getSprite()->getTexture()->drawAtPoint(ccp(0, 0));
renderTexture0->end();
}

renderTexture0->setPosition(ccp(winSize.width/2, winSize.height/2));
addChild(renderTexture0);

return true;
}
...全文
1037 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
beidatianwang 2015-06-09
  • 打赏
  • 举报
回复
过了一年多了新版本cocos2dx竟然还没解决,而且ccrenderture的偏移问题更莫名其妙了
Zszen_John 2014-02-25
  • 打赏
  • 举报
回复
我使用ccanimate也有这个问题
无名剑 2013-12-18
  • 打赏
  • 举报
回复
感觉是误差累积造成的 这个东西在cocos2d中 其实里头是有一个四顶点的面片 被你这么反复渲染 误差累积起来就偏了 这种东西 每次渲染到纹理前设置下位置看看?
chenqiu1024 2013-12-12
  • 打赏
  • 举报
回复
是不是这个问题太生僻了??

8,303

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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