使用cocos2d :: RenderTexture和setVirtualViewport捕获屏幕区域

时间:2018-03-05 01:55:57

标签: c++ cocos2d-x

cocos2d-x版本:3.16

我想捕获屏幕区域,并将其保存在PNG文件中。最好的方法是使用RenderTexture,并使用方法setVirtualViewport捕获特定区域。文档说:

void setVirtualViewport   (
      const Vec2 & rtBegin,
      const Rect & fullRect,
      const Rect & fullViewport 
  )   
     

用于抓取屏幕的一部分到纹理。

     

参数

     
      
  • rtBegin renderTexture在fullRect上的位置。
  •   
  • fullRect屏幕的总大小。
  •   
  • fullViewport总viewportSize。
  •   

我有以下代码,设计分辨率为1920 * 1080(我简化了代码以在此处显示,并将值作为常量):

unsigned int SIZE_X = 960;
unsigned int SIZE_Y = 540;
unsigned int POS_X = 100;
unsigned int POS_Y = 100;

RenderTexture* texture = RenderTexture::create(SIZE_X, SIZE_Y);
texture->setVirtualViewport(Vec2(POX_X, POS_Y),
                            Rect(0, 0, 1920, 1080),
                            Rect(0, 0, SIZE_X, SIZE_Y));

texture->begin();
this->visit();
texture->end();

texture->saveToFile("test.png", Image::Format::PNG);

我已经尝试了很多不同的参数组合,但无论我做什么,最多都会捕获矩形0,0,SIZE_X,SIZE_Y中的像素,其余部分用透明像素填充。此外,偏移是错误的(它受到屏幕尺寸和捕获区域之间的比率的影响,但它不应该)。

以下是模型场景的上述代码的结果,其中红色表示透明像素:

enter image description here

我以红色显示的所有像素都是空的,它们不应该是,并且偏移是错误的:(50, 50)而不是(100, 100)

您知道如何正确使用setVirtualViewport吗?他们的方法中是否有错误或我做错了什么?

或者,您是否有其他解决方案来捕获屏幕区域并将其保存为图像或cocos2d::Sprite? (不移动Scene)的内容

1 个答案:

答案 0 :(得分:0)

由于我似乎无法确切了解函数setVirtualViewport是如何工作的,或者这个函数可能存在问题,因此我提出了一个解决方案,它也是如此事情,即使它可能效率不高:

  • RenderTexture
  • 捕获整个屏幕
  • 更改由Sprite生成的RenderTexture的位置,即使它不属于该场景,因此不可见,也可以将其设置为你想要的区域(0,0)。
  • 创建您要捕获的第二个RenderTexture
  • 访问精灵,在第二个RenderTexture
  • 中渲染它

以下是代码:

unsigned int SIZE_X = 960;
unsigned int SIZE_Y = 540;
unsigned int POS_X = 100;
unsigned int POS_Y = 100;

RenderTexture* screenCapture = RenderTexture::create(1920, 1080);

screenCapture->begin();
this->visit();
screenCapture->end();

RenderTexture* areaTexture = RenderTexture::create(SIZE_X, SIZE_Y);
areaTexture->begin();
screenCapture->getSprite()->setPosition(Vec2(960 - POS_X, 540 - POS_Y));
screenCapture->getSprite()->visit();
areaTexture->end();

AreaTexture->saveToFile("test.png", Image::Format::PNG);