2016-12-06 23 views
0

Я пытаюсь создать черно-белый Sprite на основе другого Sprite. Поскольку у меня нет доступа к данным пикселя спрайта после его создания и кэширования, я работаю над ним, создав новый Image на основе, затем изменив данные изображения, затем поверните Image в Texture, а затем, наконец, в Sprite снова, теперь черный и белый.Создано RenderTexture Изображение не отображается

Проблема заключается в том, что, когда я использую Image генерируемый из RenderTexture, это на самом деле не сделать это, но когда я использую изображение в формате PNG, порожденную RenderTexture::saveToFile впоследствии, он отлично работает.

Похоже, я должен быть в состоянии видеть output_sprite на scene просто отлично, так как он строится примерно так же, единственное отличие заключается в Image построен из существующего файла на диске в сравнении справа от RenderTexture.

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); 

Beyond возможно GPU не имея возможности вынести текстуру, прежде чем она используется в Sprite, я не совсем уверен, что это произойдет. Я ищу варианты A и B для отображения одинаково, но сейчас работает только тот, у которого существующий файл в качестве источника для Image.

+0

Я использую версию 3.10, я думаю, что, может быть, это ошибка и он будет разрешен tween now и v3.14, но я застрял, пока они не добавят поддержку C++ для Cocos Creator. – 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