Как сделать четкие текстуры в cocos2d-x

У меня есть простые данные изображения (32-битный RGBA) size в массиве символов, и я хочу сделать из них cocos2d-x Texture2D, как показано ниже:

Texture2D * tex = new Texture2D();
tex->initWithData(data, 4*size.width*size.height, Texture2D::PixelFormat::RGBA8888,size.width, size.height, size);
tex->drawAtPoint(Point(offset));

но результирующее изображение размыто (как сжатое изображение в формате jpeg). И входные данные, и текстура (как показано выше) имеют размер size, и я не делаю никаких преобразований. Я просто поместил код в HelloWorld::draw(Renderer *, const kmMat4&, bool) во вновь созданный проект. Как я могу получить четкое изображение (точное представление данных)? Любые другие предложения (например, прямое использование буфера кадров и т. д., если таковые существуют) также приветствуются.

Я использую v3.0 в mac os 10.8.x

Изменить: я попытался установить параметры текстуры (GL_NEAREST) ​​сразу после создания Texture2D и до initWithData, и ничего не изменилось. Данные и текстура имеют одинаковый размер, поэтому масштабирование в любом случае не должно изменяться... Вот картинка; углы прямоугольников не острые:

Edit2: настройка параметров текстуры (GL_NEAREST) ​​после initWithData сработала:

...

Texture2D::TexParams tp = {GL_NEAREST, GL_NEAREST, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE};
tex->setTexParameters(tp);
tex->drawAtPoint(Point(offset));

person user3648895    schedule 19.05.2014    source источник
comment
Не могли бы вы включить скриншот? Когда я думаю о сжатых изображениях в формате jpeg, я думаю об артефактах сжатия, а не о размытости. Кажется, вы описываете две противоречащие друг другу вещи, и я думаю, что на самом деле вам нужен точечный фильтр (GL_NEAREST) min/mag.   -  person Andon M. Coleman    schedule 19.05.2014
comment
@см. Изменить. (Спасибо, кстати)   -  person user3648895    schedule 19.05.2014
comment
Честно говоря, если предположить, что изображение не было изменено в программе редактирования изображений, мне все равно кажется, что оно использует линейную интерполяцию. (Я отредактировал ваш вопрос, чтобы увеличить изображение, чтобы показать фактическое сглаживание.) Являются ли эти прямоугольники частью вашей текстуры? Другая возможность заключается в том, что вы масштабируете сам свой буфер фэймбуфера — цветовой буфер может быть линейно интерполирован во время переноса из FBO в буфер кадра по умолчанию, и это даст такой результат.   -  person Andon M. Coleman    schedule 19.05.2014
comment
@ см. Edit2: я приму это, если вы напишете в качестве ответа. Я хочу задать еще несколько (opengl) вопросов, но задам их как отдельные вопросы после (надеюсь, достаточно) поиска в Google... Спасибо...   -  person user3648895    schedule 20.05.2014


Ответы (2)


Из вашего описания проблемы я должен предположить, что текстура GL, связанная с объектом Texture2D, на самом деле не создается, пока вы не вызовете Texture2D::initWithData (...).

В OpenGL фильтр увеличения текстуры по умолчанию — GL_LINEAR. В этом случае вам не нужен магнитный фильтр по умолчанию, но вы также не можете изменить фильтр до после инициализации текстуры. Установка магнитного фильтра GL_NEAREST после создания текстуры устранит сглаживание при масштабировании текстуры.

person Andon M. Coleman    schedule 19.05.2014
comment
Я не запрашивал (и вижу) масштабирование/изменение размера текстуры, но, вероятно (и, к сожалению), фреймворк (cocos) делает это внутри... - person user3648895; 20.05.2014
comment
Под масштабированием я на самом деле имею в виду момент сэмплирования текстуры. Если прямоугольник с сопоставленной текстурой не имеет на экране тех же размеров, что и текстура, неизбежно происходит масштабирование. Фильтр увеличения используется, когда исходная текстура меньше покрываемого размера на экране. GL_NEAREST делает так, что вместо поиска 4 ближайших текселей и их сглаживания выводится только один ближайший тексел. - person Andon M. Coleman; 20.05.2014

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

обычно игре нужно, чтобы пиксельные изображения были четкими и не размытыми.

http://www.gamedevcraft.com/2015/10/disable-texture-anti-aliasing.html

person user63898    schedule 27.12.2015