Изображение созданное RenderTexture не видно

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

Проблема в том, что когда я использую 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);

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

0

Решение

Попробуй это:

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», и отредактировать этот вектор, используя цикл или набор записей, как вы хотите, чтобы он работал …

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

Я не знаю много о пиксельных «цветах», но вы можете документировать себя немного больше в цвета если хочешь; 0

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]