Предыстория.
Увидели художники, что в некоторых играх вместо текстурных атласов на один объект - одна текстура. И не какая нибудь, а совпадающая с координатами объекта, например 180х63, 52х68 и.т.д.
Захотели упростить себе работу, донесли эту идею шефу, а шеф донёс требование до меня :)
В общем, игры то у нас казуальные, и как я понимаю, не у всех игроков видеокарты будут поддерживать NPOT текстуры без приведения их к степени 2.
Потому после создания текстуры я высчитываю насколько видеокарта растянула текстуру и потом скэйлю до требуемого размера объект.
Вроде бы всё работает, но после всех этих манипуляций текстура довольно сильно размывается.
Подскажите, как можно обойти этот прикол с размыванием?
P.S. API DirectX 8.0
Сам расширяй текстуру до следующего 2^n (не растягивая саму картинку), заполняя прозрачным фоном. А при выводе объекта расчитывай новые текстурные координаты по типу: (0, 0, obj.width/tex.width, obj.height/tex.height)
Для этого придётся считывать изображение в оперативку, там вручную добавлять прозрачный фон, потом через функцию D3DXCreateTextureFromMemory создавать текстуру, я правильно понимаю?
В лучшем случае так, да )
Понятно, благодарю за помощь :)
p.s. как же я "люблю" своих художников)
> Увидели художники, что в некоторых играх вместо текстурных атласов на один
> объект - одна текстура. И не какая нибудь, а совпадающая с координатами
> объекта, например 180х63, 52х68 и.т.д.
> Захотели упростить себе работу, донесли эту идею шефу, а шеф донёс требование
> до меня :)
поискать тулзу которая автоматом текстуры в атласы складывает
По голове бы им настучать!
"поискать тулзу которая автоматом текстуры в атласы складывает"
Наверное для оптимизации буду делать это динамически при старте движка :)
оптимально, конечно, это делать во время сборки билда. и автоматически
У меня делается динамически - во время работы игры грузятся PNG или JPEG совершенно случайных размеров и скидываются в атласы со страницей 2048х2048, если страница заполнена - создаётся вторая итд. Алгоритм заполнения идея отсюда - http://www.blackpawn.com/texts/lightmaps/default.html реализация своя. Вокруг кадров в атласе создаются рамки шириной в 1 пиксель (не использую MIP map потому 1 пикс. достаточно) с копией цвета из крайнего пикселя картинки. Ну и всё отлично.
kvaks:
Можешь сказать, чем грузишь PNG?
Я пробую сейчас через FreeImage, файл загрузил, создал текстуру, залочил, по туториалу из документации FreeImage переписал значение пикселов в текстуру.
Но когда вывожу её на экран, картинка выводится сильно побитой, сплющенной.
Код, которым я переписываю значения пикселов:
BYTE * bits = FreeImage_GetBits(dib); bits +=pitch*height-pitch; for ( int y=0; y<height; y++) { BYTE * pixel = ( BYTE*)bits; for ( int x=0; x<width; x++) { PixelMap[x*4+( pitch*4*( y+1))] = pixel[0];//blue PixelMap[x*4+( pitch*4*( y+1))+1] = pixel[1];//green PixelMap[x*4+( pitch*4*( y+1))+2] = pixel[2];//red PixelMap[x*4+( pitch*4*( y+1))+3] = pixel[3];//alpha pixel+=4; } bits-=pitch; }
Слева то, что получается у меня.
Справа то, как должно быть.
Проблема решена.
Вместо pitch, который я получал из FreeImage, я использовал Pitch полученный в структуру D3DLOCKED_RECT.
Всем огромное спасибо за помощь и советы!
Тема в архиве.