2016-12-06 48 views
0

Spriteに基づいて、白黒のSpriteを作成しようとしています。私はスプライトのピクセルデータを作成してキャッシュした後にアクセスできないので、それに基づいて新しいImageを作成し、画像データを変更してをTextureに変換してから最後にSpriteもう一度、今は白黒です。RenderTextureが作成した画像が表示されません

RenderTextureから生成されたImageを使用すると、実際には描画されませんが、後でRenderTexture::saveToFileで生成された画像を使用すると問題なく動作します。私はちょうど罰金sceneoutput_spriteを見ることができるはずのように、それはほとんど同じように構築されていますので、

は、唯一の違いはImageRenderTextureから右対ディスク上の既存のファイルから構築されている、ようです。

cocos2d::Sprite* anvil_sprite = cocos2d::Sprite::createWithSpriteFrameName("anvil.png"); 
anvil_sprite->setAnchorPoint(Vec2::ZERO); 
anvil_sprite->setPosition(0,0); 

RenderTexture* rt = RenderTexture::create(anvil_sprite->getContentSize().width, anvil_sprite->getContentSize().height); 
rt->begin(); 
anvil_sprite->visit(); 
rt->end(); 

//generates a file so I can confirm it's generating correctly in the OS's 
//image viewer 
rt->saveToFile("test_FILE.png"); 

Image* output_image = new Image; 

// Either use the png generated from a previous run's RenderTexture (which works) 
// or use a new Image generated on this run. 
// If I use the existing png, this works as intended, but I'd like to be 
// able to use the texture I generate right away instead of needing to save 
// it to disk first 

/* OPTION A */ 
output_image->initWithImageFile("test_FILE.png"); // works 
/* OPTION B */ 
output_image = rt->newImage(); //doesn't render anything 

auto output_texture = new Texture2D; 
output_texture->initWithImage(output_image); 

Sprite* output_sprite = cocos2d::Sprite::createWithTexture(output_texture); 
scene->addChild(output_sprite); 

それはSpriteで使われている前に、多分GPUは、テクスチャをレンダリングする機会を持っていない以上に、私が起こることを何が起こっているのか本当にわかりません。私は同じ方法をレンダリングするためにオプションAとBを探していますが、現在はImageのソースとして既存のファイルを持つものだけが動作しています。

+0

私はV3.10を使用しています、私は多分、これはバグだと思うし、それは解決されるだろう私はCocos CreatorにC++サポートを追加するまで立ち往生しています。 – TankorSmash

答えて

1

これを試してみてください:

auto anvil_sprite = cocos2d::Sprite::create("player.png"); 
anvil_sprite->setAnchorPoint(Vec2::ZERO); 

auto rt = RenderTexture::create(anvil_sprite->getTexture()->getPixelsWide(), anvil_sprite->getTexture()->getPixelsHigh()); 
rt->begin(); 
//Draw 
anvil_sprite->visit(); 
rt->end(); 

cocos2d::Director::getInstance()->getRenderer()->render(); 

auto img = rt->newImage(); //Generate Image 
auto texture = new cocos2d::Texture2D(); 
texture->initWithImage(img); //Texture sprite 

auto sp = cocos2d::Sprite::createWithTexture(texture); //New Sprite 
sp->setPosition(cocos2d::Director::getInstance()->getWinSize().width, cocos2d::Director::getInstance()->getWinSize().height); 
this->addChild(sp); 

あなたがそれを仕事をしたいと「のgetData」を使用して、ループまたはにmemsetを使用して、このベクトルを編集同じスプライトのピクセルにアクセスすることが可能である...

auto anvil_sprite = cocos2d::Sprite::create("player.png"); 
anvil_sprite->setAnchorPoint(Vec2::ZERO); 

auto rt = RenderTexture::create(anvil_sprite->getTexture()->getPixelsWide(), anvil_sprite->getTexture()->getPixelsHigh()); 
rt->begin(); 
anvil_sprite->visit(); 
rt->end(); 

cocos2d::Director::getInstance()->getRenderer()->render(); 

auto img = rt->newImage(); //Generate Image 

auto data = img->getData(); 
for (size_t i = 0; i < img->getDataLen(); i++) 
{ 
    data[i] = 400; 
} 
//memset(data, 400, img->getDataLen()); 

私はピクセル「色」について多くを知らないが、あなたがしたい場合は、colorsにもう少し自分を文書化することができます; 0

関連する問題