Динамическое обновление цветовых данных в cocos2d-x

Я хочу создать некоторые эффекты в cocos2d-x, обновив необработанные цветовые данные спрайта. Предоставляет ли cocos2d-x какие-либо способы сделать это?

Обновление: Мой буфер составляет 4 байта (A-R-G-B) для каждого пикселя, размеры окна просмотра 640x480. Итак, буфер имеет длину 640 * 480 * 4 = 1228800 байт, и я часто обновляю его содержимое.


person Bình Nguyên    schedule 27.05.2014    source источник
comment
необработанные данные о цвете? вы имеете в виду пиксели в текстуре? Конечно: шейдеры.   -  person LearnCocos2D    schedule 27.05.2014
comment
@LearnCocos2D: Есть ли способ не использовать шейдер? Короче говоря, у меня есть массив данных о цвете (то есть пиксели, данные изображения, ....), как я могу отобразить его на экране?   -  person Bình Nguyên    schedule 27.05.2014
comment
CCTexture(2D) должен иметь инициализатор textureWithData или textureWithBytes, однако ваши данные текстуры должны быть в необработанном формате, поддерживаемом CCTexture. Раньше также был CCmutableTexture, где вы можете напрямую изменить содержимое текстуры, но не уверен, что это доступно для cocos2d-x v3.   -  person LearnCocos2D    schedule 27.05.2014
comment
cocos2d::RenderTexture есть вариант: initWithWidthAndHeight (int w, int h, Texture2D::PixelFormat format)   -  person GameDeveloper    schedule 27.05.2014
comment
Спасибо, а поддерживает ли он обновление данных о пикселях напрямую в реальном времени?   -  person Bình Nguyên    schedule 27.05.2014
comment
Вы можете обновить, чтобы показать содержимое вашего массива? Я думаю, что пиксель имеет значение RGB для каждого.   -  person GameDeveloper    schedule 27.05.2014
comment
@GameDeveloper: я обновил свой вопрос, большое спасибо!   -  person Bình Nguyên    schedule 28.05.2014


Ответы (1)


Это решение регенерирует текстуру каждый раз, когда она изменяется. Примечание: текстура в этом коде использует формат RGBA, а не ARGB.

Массив данных (/texel) m_TextureData и спрайт выделяются только один раз, но объект Texture2D должен освобождаться и создаваться заново каждый раз, что может быть проблемой производительности.

Примечание: имена классов являются новыми из Cocos2d-x 3.1.x. В основном цикле есть альтернативная часть для пользователей 2.2.x. Чтобы использовать его, вы также должны использовать старые имена классов (например, ccColor4B, CCTexture2D, CCSprite).

в заголовке:

Color4B    *m_TextureData;
Texture2D    *m_Texture;
Sprite       *m_Sprite;

в реализации:

int w = 640; // width  of texture
int h = 480; // height of texture

m_TextureData = new Color4B[w * h];

установить цвета напрямую - например:

Color4B white;
white.r = 255;
white.g = 255;
white.b = 255;
white.a = 255;
m_TextureData[i] = white; // i is an index running from 0 to w*h-1

использовать данные для инициализации текстуры:

CCSize contentSize;
contentSize.width  = w;
contentSize.height = h;

m_Texture = new Texture2D;
m_Texture->initWithData(m_TextureData, kCCTexture2DPixelFormat_RGBA8888, w, h, contentSize);

создайте Sprite с этой текстурой:

m_Sprite = Sprite::createWithTexture(m_Texture);
m_Sprite->retain();

добавить m_Sprite в вашу сцену

в основном цикле:
для изменения цвета/текселей текстуры динамически измените m_TextureData:

m_TextureData[i] = ...;

в Cocos2d-x 2.x:
в 2.2.x вам действительно нужно освободить старую текстуру и создать новую:

m_Texture->release(); // make sure that ccGLDeleteTexture() is called internally to prevent memory leakage

m_Texture = new Texture2D;
m_Texture->initWithData(m_TextureData, kCCTexture2DPixelFormat_RGBA8888, w, h, contentSize);

m_Sprite->setTexture(m_Texture); // update sprite with new texture

в Cocos2d-x 3.1.x

m_Texture->updateWithData(m_TextureData, 0, 0, w, h);

Позже не забудьте очистить.
в деструкторе:

m_Sprite->release();
m_Texture->release();
delete [] m_TextureData;
person n-o-d    schedule 03.06.2014
comment
m_Texture->updateWithData(/*...*/) быстрее, чем initWithData в цикле? - person Bình Nguyên; 04.06.2014
comment
Я не знал об этом новом методе. Я все еще использую Cocos2D-x 2.2.x. Да, в основном updateWithData() вызывает только glTexSubImage2D(). Так быстрее :) - person n-o-d; 04.06.2014